SearchController.php 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <?php
  2. namespace Muzich\CoreBundle\Controller;
  3. use Muzich\CoreBundle\lib\Controller;
  4. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  5. use Muzich\CoreBundle\Searcher\ElementSearcher;
  6. use Muzich\CoreBundle\Form\Search\ElementSearchForm;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Muzich\CoreBundle\Util\TagLike;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Muzich\CoreBundle\Searcher\GlobalSearcher;
  11. class SearchController extends Controller
  12. {
  13. /**
  14. * Procédure qui construit un réponse json contenant le html
  15. * par defalt de la liste d'élément.
  16. *
  17. * @param Collection $elements
  18. * @param sring $message
  19. * @param string $session_id
  20. * @return Response
  21. */
  22. protected function searchElementsMore($context, $autoplay_context, $elements, $message, $session_id)
  23. {
  24. $data = array();
  25. $end = (($count = count($elements)) < $this->container->getParameter('search_ajax_more'));
  26. $html = '';
  27. if ($count)
  28. {
  29. $html = $this->render('MuzichCoreBundle:SearchElement:default.html.twig', array(
  30. 'user' => $this->getUser(),
  31. 'elements' => $elements,
  32. 'display_autoplay' => $this->getDisplayAutoplayBooleanForContext($context),
  33. 'autoplay_context' => ($autoplay_context)?$autoplay_context:$context
  34. ))->getContent();
  35. $data['more_link_href'] = $this->generateUrl('search_elements_more', array(
  36. 'context' => $context,
  37. 'id_limit' => $elements[count($elements)-1]->getId(),
  38. 'session_id' => $session_id
  39. ));
  40. }
  41. return $this->jsonResponse(array(
  42. 'status' => 'success',
  43. 'count' => $count,
  44. 'message' => $message,
  45. 'html' => $html,
  46. 'end' => $end,
  47. 'data' => $data
  48. ));
  49. }
  50. /**
  51. * Procédure de recherche, qui met a jour l'objet de recherche (ainsi
  52. * que les paramétres en session).
  53. *
  54. */
  55. public function searchElementsAction($context, $id_limit = null, $session_id = null)
  56. {
  57. $request = $this->getRequest();
  58. $search_object = $this->getElementSearcher(null, false, $session_id);
  59. $search_form = $this->getSearchForm($search_object);
  60. $form_submited = false;
  61. if ($request->getMethod() == 'POST')
  62. {
  63. $form_submited = true;
  64. $search_form->bind($request);
  65. // Si le formulaire est valide
  66. if ($search_form->isValid())
  67. {
  68. // On met a jour l'objet avec les nouveaux paramétres saisie dans le form
  69. $data = $search_form->getData();
  70. if ($data['network'] == ElementSearcher::NETWORK_PERSONAL && $this->isVisitor())
  71. {
  72. return $this->mustBeConnectedAjaxResponse();
  73. }
  74. // Le formulaire nous permet de récupérer uniquement les ids.
  75. // On va donc chercher les name en base pour le passer a l'objet
  76. // ElementSearch
  77. $data['tags'] = $this->getDoctrine()->getRepository('MuzichCoreBundle:Tag')
  78. ->getTagsForElementSearch(json_decode($data['tags'], true));
  79. $search_object->update($data);
  80. // Et on met a jour la "mémoire" de la recherche
  81. $this->setElementSearcherParams($search_object->getParams());
  82. }
  83. }
  84. if ($this->getRequest()->isXmlHttpRequest())
  85. {
  86. if ($form_submited && !$id_limit)
  87. {
  88. $message = $this->trans(
  89. 'noelements.sentence_filter',
  90. array('%link_string%' => $this->trans(
  91. 'noelements.sentence_filter_link_string',
  92. array(),
  93. 'elements'
  94. )),
  95. 'elements'
  96. );
  97. }
  98. else
  99. {
  100. $message = $this->trans(
  101. 'elements.ajax.more.noelements',
  102. array(),
  103. 'elements'
  104. );
  105. }
  106. // template qui apelle doSearchElementsAction
  107. $search_object->update(array(
  108. 'count' => $this->container->getParameter('search_ajax_more'),
  109. 'id_limit' => $id_limit
  110. ));
  111. $elements = $search_object->getElements($this->getDoctrine(), $this->getUserId(true));
  112. return $this->searchElementsMore($context, null, $elements, $message, $session_id);
  113. }
  114. else
  115. {
  116. return $this->redirect($this->generateUrl('home'));
  117. }
  118. }
  119. /**
  120. * Action (ajax) de récupération d'éléments en plus
  121. * [a check pour être sur] N'EST PLUS UTILISE
  122. *
  123. * @param string $type
  124. * @param string $object_id
  125. * @param int $id_limit
  126. * @return Response
  127. */
  128. public function searchElementsShowAction($context, $type, $object_id, $id_limit)
  129. {
  130. $autoplay_context = null;
  131. if ($this->getRequest()->isXmlHttpRequest())
  132. {
  133. $object = null;
  134. $param_id = '';
  135. if ($type == 'user')
  136. {
  137. $autoplay_context = 'show_user';
  138. $object = $this->getDoctrine()
  139. ->getRepository('MuzichCoreBundle:User')
  140. ->findOneBy(array('id' => $object_id))
  141. ;
  142. $param_id = 'user_id';
  143. }
  144. elseif ($type == 'group')
  145. {
  146. $autoplay_context = 'show_group';
  147. $object = $this->getDoctrine()
  148. ->getRepository('MuzichCoreBundle:Group')
  149. ->findOneById($object_id)
  150. ;
  151. $param_id = 'group_id';
  152. }
  153. if (!$object)
  154. {
  155. throw new \Exception('Object Unknow');
  156. }
  157. $search = $this->createSearchObject(array(
  158. $param_id => $object->getId(),
  159. 'count' => $this->container->getParameter('search_ajax_more'),
  160. 'id_limit' => $id_limit
  161. ));
  162. $elements = $search->getElements($this->getDoctrine(), $this->getUserId());
  163. return $this->searchElementsMore(
  164. $context,
  165. $autoplay_context,
  166. $elements,
  167. $this->trans(
  168. 'elements.ajax.more.noelements',
  169. array(),
  170. 'elements'
  171. )
  172. );
  173. }
  174. throw new \Exception('XmlHttpRequest only for this action');
  175. }
  176. /**
  177. * Action permettant d'afficher plus de résultats (éléments) dans
  178. * une global search.
  179. *
  180. * @param Request $request
  181. * @param int $last_id
  182. * @param string $string
  183. * @return Response
  184. */
  185. public function globalSearchMoreAction(Request $request, $context, $last_id, $string)
  186. {
  187. if (($response = $this->mustBeConnected(true)))
  188. {
  189. return $response;
  190. }
  191. $search = $this->createSearchObject(array(
  192. 'count' => $this->container->getParameter('search_ajax_more'),
  193. 'id_limit' => $last_id,
  194. 'string' => $string
  195. ));
  196. $elements = $search->getElements($this->getDoctrine(), $this->getUserId());
  197. return $this->searchElementsMore(
  198. $context,
  199. $autoplay_context = null,
  200. $elements,
  201. $this->trans(
  202. 'elements.ajax.more.noelements',
  203. array(),
  204. 'elements'
  205. ),
  206. null
  207. );
  208. }
  209. /**
  210. * Procédure (ajax) de recherche de tags. Essentielement utilisé dans
  211. * le tagPrompt.
  212. *
  213. * @param string $string_search
  214. * @param int $timestamp
  215. * @return Response
  216. */
  217. public function searchTagAction($timestamp)
  218. {
  219. $string_search = $this->getRequest()->request->get('string_search');
  220. if ($this->getRequest()->isXmlHttpRequest())
  221. {
  222. if (strlen(trim($string_search)) > 1)
  223. {
  224. // On utilise l'objet TagLike
  225. $TagLike = new TagLike($this->getDoctrine()->getManager());
  226. // Pour trier nos tags d'une manière plus humaine
  227. $sort_response = $TagLike->getSimilarTags($string_search, $this->getUserId(true));
  228. $status = 'success';
  229. $error = '';
  230. $message = $this->trans(
  231. 'tags.search.message_found',
  232. array('%string%' => $string_search),
  233. 'userui'
  234. );
  235. }
  236. else
  237. {
  238. $status = 'error';
  239. $sort_response = array('tags' => array(), 'same_found' => false);
  240. $error = 'Vous devez saisir au moins deux caractères';
  241. $message = '';
  242. }
  243. $return_array = array(
  244. 'status' => $status,
  245. 'timestamp' => $timestamp,
  246. 'error' => $error,
  247. 'message' => $message,
  248. 'same_found' => $sort_response['same_found'],
  249. 'data' => $sort_response['tags']
  250. );
  251. $response = new Response(json_encode($return_array));
  252. $response->headers->set('Content-Type', 'application/json; charset=utf-8');
  253. return $response;
  254. }
  255. throw $this->createNotFoundException('Cette ressource n\'est pas accessible');
  256. }
  257. /**
  258. * Récupére l'id d'un tag (ajax)
  259. * [A check] mais ne doit et n'est plus utilisé.
  260. *
  261. * @param type $string_search
  262. * @return Response
  263. */
  264. public function searchTagIdAction($string_search)
  265. {
  266. if ($this->getRequest()->isXmlHttpRequest())
  267. {
  268. $tag_id = $this->getDoctrine()->getManager()->createQuery("
  269. SELECT t.id FROM MuzichCoreBundle:Tag t
  270. WHERE t.name = :str
  271. ORDER BY t.name ASC"
  272. )->setParameter('str', $string_search)
  273. ->getSingleScalarResult()
  274. ;
  275. $response = new Response(json_encode($tag_id));
  276. $response->headers->set('Content-Type', 'application/json; charset=utf-8');
  277. return $response;
  278. }
  279. throw $this->createNotFoundException('Cette ressource n\'est pas accessible');
  280. }
  281. /**
  282. * Retourne une réponse contenant le dom du formulaire de recherche global
  283. *
  284. * @return \Symfony\Component\HttpFoundation\Response
  285. */
  286. public function renderGlobalSearchFormAction()
  287. {
  288. return $this->render(
  289. 'MuzichCoreBundle:GlobalSearch:form.html.twig',
  290. array('form' => $this->getGlobalSearchForm()->createView())
  291. );
  292. }
  293. /**
  294. * Page d'affichage des résultats pour une recherche globale.
  295. * * Users
  296. * * Groups
  297. * * Partages
  298. *
  299. * @return \Symfony\Component\HttpFoundation\Response
  300. * @Template("MuzichCoreBundle:GlobalSearch:results.html.twig")
  301. */
  302. public function globalAction(Request $request)
  303. {
  304. $form = $this->getGlobalSearchForm($searcher = new GlobalSearcher());
  305. $results = array(
  306. 'users' => null,
  307. 'groups' => null,
  308. 'elements' => null
  309. );
  310. if ($request->getMethod() == 'POST')
  311. {
  312. $form->bind($request);
  313. if ($form->isValid())
  314. {
  315. $results = $searcher->getResults(
  316. $this->getDoctrine(),
  317. $this->getUserId(true),
  318. $this->container->getParameter('search_default_count'),
  319. $this->container->getParameter('search_global_elements_word_min_length')
  320. );
  321. }
  322. }
  323. return array(
  324. 'form' => $form->createView(),
  325. 'results' => $results,
  326. 'display_more_button' => (count($results['elements']))? (count($results['elements']) >= $this->container->getParameter('search_default_count'))? true : false : false
  327. );
  328. }
  329. }