Controller.php 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. <?php
  2. namespace Muzich\CoreBundle\lib;
  3. use Symfony\Bundle\FrameworkBundle\Controller\Controller as BaseController;
  4. use Muzich\CoreBundle\Searcher\ElementSearcher;
  5. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  6. use Muzich\CoreBundle\Form\Search\ElementSearchForm;
  7. use Muzich\CoreBundle\Form\Element\ElementAddForm;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Muzich\CoreBundle\Searcher\GlobalSearcher;
  10. use Muzich\CoreBundle\Entity\Element;
  11. use Muzich\CoreBundle\Entity\Presubscription;
  12. class Controller extends BaseController
  13. {
  14. protected static $user = null;
  15. protected static $user_personal_query = null;
  16. protected static $tags = array();
  17. /**
  18. * Authenticate a user with Symfony Security
  19. *
  20. */
  21. protected function authenticateUser($user)
  22. {
  23. $providerKey = $this->container->getParameter('fos_user.firewall_name');
  24. $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());
  25. $this->container->get('security.context')->setToken($token);
  26. }
  27. /**
  28. * Met a jour les parametres de ElementSearcher pour la "mémoire" de la
  29. * recherche
  30. *
  31. * @param array $params
  32. */
  33. protected function setElementSearcherParams($params, $session_id = '')
  34. {
  35. if ($session_id != '')
  36. {
  37. $session_id = '.'.$session_id;
  38. }
  39. $this->get("session")->set('user.element_search.params'.$session_id, $params);
  40. }
  41. /**
  42. * Retourn l'objet ElementSearcher en cours.
  43. *
  44. * @param int $count Si renseigné impact le nombre d'éléments qui seront
  45. * récupérés
  46. * @param boolean $force_new Si a vrai la méthode procéède comme si on
  47. * demandé un nouveau objet de recherche (basé sur les tags favoris donc).
  48. *
  49. * @return ElementSearcher
  50. */
  51. protected function getElementSearcher($count = null, $force_new = false, $session_id = '')
  52. {
  53. $session = $this->get("session");
  54. if ($session_id != '')
  55. {
  56. $session_id = '.'.$session_id;
  57. }
  58. // Si l'objet n'existe pas encore, a t-on déjà des paramètres de recherche
  59. if (!$session->has('user.element_search.params'.$session_id) || $force_new)
  60. {
  61. // Il nous faut instancier notre premier objet recherche
  62. // Premièrement on récupère les tags favoris de l'utilisateur
  63. $this->ElementSearcher = new ElementSearcher();
  64. $this->ElementSearcher->init(array(
  65. 'tags' => $this->getDoctrine()->getRepository('MuzichCoreBundle:User')
  66. ->getTagsFavorites(
  67. $this->getUserId(),
  68. $this->container->getParameter('search_default_favorites_tags_count')
  69. ),
  70. 'count' => ($count)?$count:$this->container->getParameter('search_default_count')
  71. ));
  72. // Et on met en session les paramètres
  73. $session->set('user.element_search.params', $this->ElementSearcher->getParams());
  74. }
  75. else
  76. {
  77. // Des paramètres existes, on fabrique l'objet recherche
  78. $this->ElementSearcher = new ElementSearcher();
  79. // et on l'initatialise avec ces paramétres connus
  80. $this->ElementSearcher->init($session->get('user.element_search.params'.$session_id));
  81. if ($count)
  82. {
  83. $this->ElementSearcher->update(array('count' => $count));
  84. }
  85. }
  86. // on le retourne
  87. return $this->ElementSearcher;
  88. }
  89. protected function getNewElementSearcher()
  90. {
  91. return $this->getElementSearcher(null, true);
  92. }
  93. /**
  94. * Retourne l'objet User. Il est possible de préciser de quel manière récupérer
  95. * l'utilisateur:
  96. *
  97. * $user = $this->getUser(true, array('join' => array(
  98. * 'groups_owned'
  99. * )));
  100. *
  101. * ou de forcer sa (re)récupération en base (sinon c'est l'objet static qui est renvoyé)
  102. *
  103. * @param boolean $personal_query
  104. * @param array $params
  105. * @param boolean $force_refresh
  106. * @return \Muzich\CoreBundle\Entity\User
  107. */
  108. public function getUser($personal_query = false, $params = array(), $force_refresh = false)
  109. {
  110. if (!$personal_query)
  111. {
  112. // Si on demande l'utilisateur sans forcer la réactualisation et que l'utilisateur
  113. // a déjà été demandé mais avec un requête personelle, on retourne cet utilisateur
  114. if (!$force_refresh && self::$user_personal_query)
  115. {
  116. return self::$user_personal_query;
  117. }
  118. // Si on demande une actualisation ou que l'utilisateur n'a pas encore été demandé
  119. // on va le récupérer
  120. else if ($force_refresh || !self::$user)
  121. {
  122. self::$user = $this->container->get('security.context')->getToken()->getUser();
  123. return self::$user;
  124. }
  125. return self::$user;
  126. }
  127. else
  128. {
  129. // Si l'on demande une réactualisation ou si l'user n'a pas encore été demandé
  130. // on va le récupérer en base.
  131. if ($force_refresh || !self::$user_personal_query)
  132. {
  133. self::$user_personal_query = $this->getDoctrine()->getRepository('MuzichCoreBundle:User')->findOneById(
  134. $this->container->get('security.context')->getToken()->getUser()->getId(),
  135. array_key_exists('join', $params) ? $params['join'] : array()
  136. )->getSingleResult();
  137. return self::$user_personal_query;
  138. }
  139. return self::$user_personal_query;
  140. }
  141. }
  142. /**
  143. * Retourne l'id de l'utilisateur en cours
  144. */
  145. protected function getUserId()
  146. {
  147. /**
  148. * Bug lors des tests: L'user n'est pas 'lié' a celui en base par doctrine.
  149. * Docrine le voit si on faire une requete directe.
  150. */
  151. if ($this->container->getParameter('env') == 'test')
  152. {
  153. $user = $this->getDoctrine()->getRepository('MuzichCoreBundle:User')->findOneById(
  154. $this->container->get('security.context')->getToken()->getUser()->getId(),
  155. array()
  156. )->getSingleResult();
  157. return $user->getId();
  158. }
  159. if (($user = $this->getUser()) != 'anon.')
  160. {
  161. return $user->getId();
  162. }
  163. throw new \Exception('User not connected');
  164. }
  165. /**
  166. * Retourne un tabeau avec les tags connus.
  167. * TODO: Voir pour que cette info soit stocké (par exemple) dans un champs
  168. * texte en base. (json array)
  169. * TODO2: Voir si la question d'opt. "Formulaire d'ajout d'un élément" ne résoue pas
  170. * le problème du TODO ci-dessus.
  171. *
  172. * @return array
  173. */
  174. protected function getTagsArray($force_refresh = false)
  175. {
  176. throw new \Exception("Cette méthode ne doit plus être utilisé.");
  177. if (!count(self::$tags) || $force_refresh)
  178. {
  179. return self::$tags = $this->getDoctrine()->getRepository('MuzichCoreBundle:Tag')->getTagsArray();
  180. }
  181. return self::$tags;
  182. }
  183. /**
  184. * Retourne un tabeau avec les groupes accessible pour un ajout d'element.
  185. *
  186. * @return array
  187. */
  188. protected function getGroupsArray()
  189. {
  190. return $this->getDoctrine()->getRepository('MuzichCoreBundle:Group')
  191. ->getPublicAndOwnedArray($this->getUserId());
  192. }
  193. /**
  194. * Met en place un message de type flash.
  195. *
  196. * @param string $type
  197. * @param string $value
  198. */
  199. protected function setFlash($type, $value)
  200. {
  201. $this->container->get('session')->setFlash($type, $value);
  202. }
  203. /**
  204. * Instancie et retourne un objet ElementSearch
  205. *
  206. * @param array $params
  207. * @return ElementSearcher
  208. */
  209. protected function createSearchObject($params)
  210. {
  211. $search_object = new ElementSearcher();
  212. $search_object->init($params);
  213. return $search_object;
  214. }
  215. /**
  216. * Retourne un User en fonction du slug passé
  217. *
  218. * @param string $slug
  219. * @return User
  220. */
  221. protected function findUserWithSlug($slug)
  222. {
  223. try {
  224. return $this->getDoctrine()
  225. ->getRepository('MuzichCoreBundle:User')
  226. ->findOneBySlug($slug)
  227. ->getSingleResult()
  228. ;
  229. } catch (\Doctrine\ORM\NoResultException $e) {
  230. throw $this->createNotFoundException('Utilisateur introuvable.');
  231. }
  232. }
  233. /**
  234. * Retourne un Group en fonction du slug passé
  235. *
  236. * @param string $slug
  237. * @return Group
  238. */
  239. protected function findGroupWithSlug($slug)
  240. {
  241. try {
  242. return $this->getDoctrine()
  243. ->getRepository('MuzichCoreBundle:Group')
  244. ->findOneBySlug($slug)
  245. ->getSingleResult()
  246. ;
  247. } catch (\Doctrine\ORM\NoResultException $e) {
  248. throw $this->createNotFoundException('Groupe introuvable.');
  249. }
  250. }
  251. /**
  252. * Retourne un Group en fonction du id passé
  253. *
  254. * @param string $slug
  255. * @return Group
  256. */
  257. protected function findGroupWithId($id)
  258. {
  259. try {
  260. return $this->getDoctrine()
  261. ->getRepository('MuzichCoreBundle:Group')
  262. ->findOneById($id)
  263. ;
  264. } catch (\Doctrine\ORM\NoResultException $e) {
  265. throw $this->createNotFoundException('Groupe introuvable.');
  266. }
  267. }
  268. /**
  269. * Retourne le formulaire de recherche
  270. *
  271. * @param \Muzich\CoreBundle\Searcher\Searcher $search_object
  272. * @return \Symfony\Component\Form\Form
  273. */
  274. protected function getSearchForm($search_object)
  275. {
  276. return $this->createForm(
  277. new ElementSearchForm(),
  278. $search_object->getParams(true),
  279. array()
  280. );
  281. }
  282. /**
  283. * Retourne l'objet Form du formulaire de recherche global.
  284. *
  285. * @return \Symfony\Component\Form\Form
  286. */
  287. protected function getGlobalSearchForm($searcher = null)
  288. {
  289. if ($searcher === null)
  290. {
  291. $searcher = new GlobalSearcher();
  292. }
  293. return $this->createFormBuilder($searcher)
  294. ->add('string', 'text')
  295. ->getForm();
  296. }
  297. /**
  298. * Retourne le formulaire d'ajout d'élément
  299. *
  300. * @param \Muzich\CoreBundle\Searcher\Searcher $search_object
  301. * @return \Symfony\Component\Form\Form
  302. */
  303. protected function getAddForm($element = array(), $name = null)
  304. {
  305. //$form = new ElementAddForm();
  306. //$form->setName($name);
  307. //return $this->createForm(
  308. // $form,
  309. // $element,
  310. // array()
  311. //);
  312. $form = new ElementAddForm();
  313. $form->setName($name);
  314. return $this->createForm($form, $element);
  315. }
  316. /**
  317. * Retourne une réponse contenant et de type json
  318. *
  319. * @param array $content
  320. * @return Response
  321. */
  322. protected function jsonResponse($content)
  323. {
  324. $response = new Response(json_encode($content));
  325. $response->headers->set('Content-Type', 'application/json; charset=utf-8');
  326. return $response;
  327. }
  328. protected function jsonNotFoundResponse()
  329. {
  330. $response = new Response(json_encode(array(
  331. 'status' => 'error',
  332. 'errors' => array('NotFound')
  333. )));
  334. $response->headers->set('Content-Type', 'application/json; charset=utf-8');
  335. return $response;
  336. }
  337. /**
  338. * Permet d'utiliser la méthode Assert que l'on utilise dans les templates
  339. * afin d'avoir une url correcte vers une ressource web (img, js, ...)
  340. *
  341. * @param string $path
  342. * @param string $packageName
  343. * @return string
  344. */
  345. protected function getAssetUrl($path, $packageName = null)
  346. {
  347. return $this->container->get('templating.helper.assets')->getUrl($path, $packageName);
  348. }
  349. /**
  350. * Retourne une traduction effectué par le translator
  351. *
  352. * @param string $string
  353. * @param array $params
  354. * @param string $package
  355. * @return string
  356. */
  357. protected function trans($string, $params = array(), $package = null)
  358. {
  359. return $this->get('translator')->trans($string, $params, $package);
  360. }
  361. /**
  362. * Permet de récupérer un objet réponse si l'utilisateur doit être connecté
  363. * pour accéder a cette ressource. On peux préciser $and_ajax pour que
  364. * la requete de type ajax soit une nécéssité.
  365. *
  366. * @return Response
  367. */
  368. protected function mustBeConnected($and_ajax = false)
  369. {
  370. if ($and_ajax && !$this->getRequest()->isXmlHttpRequest())
  371. {
  372. throw $this->createNotFoundException('Ressource ajax uniquement.');
  373. }
  374. if ($this->getUser() == 'anon.')
  375. {
  376. $this->setFlash('error', 'user.session_expired');
  377. if ($this->getRequest()->isXmlHttpRequest())
  378. {
  379. return $this->jsonResponse(array(
  380. 'status' => 'mustbeconnected'
  381. ));
  382. }
  383. else
  384. {
  385. return $this->redirect($this->generateUrl('index'));
  386. }
  387. }
  388. }
  389. /**
  390. *
  391. * @return \Doctrine\ORM\EntityManager
  392. */
  393. public function getEntityManager()
  394. {
  395. return $this->getDoctrine()->getEntityManager();
  396. }
  397. /**
  398. *
  399. * @param object $entity
  400. */
  401. public function persist($entity)
  402. {
  403. $this->getEntityManager()->persist($entity);
  404. }
  405. /**
  406. *
  407. * @param object $entity
  408. */
  409. public function remove($entity)
  410. {
  411. $this->getEntityManager()->remove($entity);
  412. }
  413. /**
  414. *
  415. */
  416. public function flush()
  417. {
  418. $this->getEntityManager()->flush();
  419. }
  420. /**
  421. * Cette méthode vérifie si l'élément qui vient d'être envoyé pourrais être
  422. * associé a un groupe de l'utilisateur.
  423. *
  424. * @param Element $element
  425. * @return array
  426. */
  427. protected function isAddedElementCanBeInGroup(Element $element)
  428. {
  429. $element_tags = $element->getTags();
  430. $groups = array();
  431. if ($element_tags)
  432. {
  433. foreach ($this->getUser()->getGroupsOwned() as $group)
  434. {
  435. foreach ($element_tags as $element_tag)
  436. {
  437. if ($group->hasThisTag($element_tag->getId()))
  438. {
  439. $groups[] = array(
  440. 'name' => $group->getName(),
  441. 'id' => $group->getId(),
  442. 'url' => $this->generateUrl('ajax_set_element_group', array(
  443. 'token' => $this->getUser()->getPersonalHash($element->getId()),
  444. 'element_id' => $element->getId(),
  445. 'group_id' => $group->getId()
  446. ))
  447. );
  448. }
  449. }
  450. }
  451. }
  452. return $groups;
  453. }
  454. protected function getPreSubscriptionForm()
  455. {
  456. return $this->createFormBuilder(new Presubscription())
  457. ->add('email', 'email')
  458. ->getForm()
  459. ;
  460. }
  461. protected function getDisplayAutoplayBooleanForContext($context)
  462. {
  463. if (in_array($context,
  464. $this->container->getParameter('autoplay_contexts')
  465. ))
  466. {
  467. return true;
  468. }
  469. return false;
  470. }
  471. }