SearchController.php 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  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. if (($response = $this->mustBeConnected()))
  58. {
  59. return $response;
  60. }
  61. $request = $this->getRequest();
  62. $search_object = $this->getElementSearcher(null, false, $session_id);
  63. $search_form = $this->getSearchForm($search_object);
  64. $form_submited = false;
  65. if ($request->getMethod() == 'POST')
  66. {
  67. $form_submited = true;
  68. $search_form->bind($request);
  69. // Si le formulaire est valide
  70. if ($search_form->isValid())
  71. {
  72. // On met a jour l'objet avec les nouveaux paramétres saisie dans le form
  73. $data = $search_form->getData();
  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());
  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. if (($response = $this->mustBeConnected()))
  220. {
  221. return $response;
  222. }
  223. $string_search = $this->getRequest()->request->get('string_search');
  224. if ($this->getRequest()->isXmlHttpRequest())
  225. {
  226. if (strlen(trim($string_search)) > 1)
  227. {
  228. // On utilise l'objet TagLike
  229. $TagLike = new TagLike($this->getDoctrine());
  230. // Pour trier nos tags d'une manière plus humaine
  231. $sort_response = $TagLike->getSimilarTags($string_search, $this->getUserId());
  232. $status = 'success';
  233. $error = '';
  234. $message = $this->trans(
  235. 'tags.search.message_found',
  236. array('%string%' => $string_search),
  237. 'userui'
  238. );
  239. }
  240. else
  241. {
  242. $status = 'error';
  243. $sort_response = array('tags' => array(), 'same_found' => false);
  244. $error = 'Vous devez saisir au moins deux caractères';
  245. $message = '';
  246. }
  247. $return_array = array(
  248. 'status' => $status,
  249. 'timestamp' => $timestamp,
  250. 'error' => $error,
  251. 'message' => $message,
  252. 'same_found' => $sort_response['same_found'],
  253. 'data' => $sort_response['tags']
  254. );
  255. $response = new Response(json_encode($return_array));
  256. $response->headers->set('Content-Type', 'application/json; charset=utf-8');
  257. return $response;
  258. }
  259. throw $this->createNotFoundException('Cette ressource n\'est pas accessible');
  260. }
  261. /**
  262. * Récupére l'id d'un tag (ajax)
  263. * [A check] mais ne doit et n'est plus utilisé.
  264. *
  265. * @param type $string_search
  266. * @return Response
  267. */
  268. public function searchTagIdAction($string_search)
  269. {
  270. if ($this->getRequest()->isXmlHttpRequest())
  271. {
  272. $tag_id = $this->getDoctrine()->getEntityManager()->createQuery("
  273. SELECT t.id FROM MuzichCoreBundle:Tag t
  274. WHERE t.name = :str
  275. ORDER BY t.name ASC"
  276. )->setParameter('str', $string_search)
  277. ->getSingleScalarResult()
  278. ;
  279. $response = new Response(json_encode($tag_id));
  280. $response->headers->set('Content-Type', 'application/json; charset=utf-8');
  281. return $response;
  282. }
  283. throw $this->createNotFoundException('Cette ressource n\'est pas accessible');
  284. }
  285. /**
  286. * Retourne une réponse contenant le dom du formulaire de recherche global
  287. *
  288. * @return \Symfony\Component\HttpFoundation\Response
  289. */
  290. public function renderGlobalSearchFormAction()
  291. {
  292. return $this->render(
  293. 'MuzichCoreBundle:GlobalSearch:form.html.twig',
  294. array('form' => $this->getGlobalSearchForm()->createView())
  295. );
  296. }
  297. /**
  298. * Page d'affichage des résultats pour une recherche globale.
  299. * * Users
  300. * * Groups
  301. * * Partages
  302. *
  303. * @return \Symfony\Component\HttpFoundation\Response
  304. * @Template("MuzichCoreBundle:GlobalSearch:results.html.twig")
  305. */
  306. public function globalAction(Request $request)
  307. {
  308. $form = $this->getGlobalSearchForm($searcher = new GlobalSearcher());
  309. $results = array(
  310. 'users' => null,
  311. 'groups' => null,
  312. 'elements' => null
  313. );
  314. if ($request->getMethod() == 'POST')
  315. {
  316. $form->bind($request);
  317. if ($form->isValid())
  318. {
  319. $results = $searcher->getResults(
  320. $this->getDoctrine(),
  321. $this->getUserId(),
  322. $this->container->getParameter('search_default_count'),
  323. $this->container->getParameter('search_global_elements_word_min_length')
  324. );
  325. }
  326. }
  327. return array(
  328. 'form' => $form->createView(),
  329. 'results' => $results,
  330. 'display_more_button' => (count($results['elements']))? (count($results['elements']) >= $this->container->getParameter('search_default_count'))? true : false : false
  331. );
  332. }
  333. }