Controller.php 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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. class Controller extends BaseController
  10. {
  11. protected static $user = null;
  12. protected static $user_personal_query = null;
  13. protected static $tags = array();
  14. /**
  15. * Authenticate a user with Symfony Security
  16. *
  17. */
  18. protected function authenticateUser($user)
  19. {
  20. $providerKey = $this->container->getParameter('fos_user.firewall_name');
  21. $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles());
  22. $this->container->get('security.context')->setToken($token);
  23. }
  24. /**
  25. * Met a jour les parametres de ElementSearcher pour la "mémoire" de la
  26. * recherche
  27. *
  28. * @param array $params
  29. */
  30. protected function setElementSearcherParams($params)
  31. {
  32. $this->get("session")->set('user.element_search.params', $params);
  33. }
  34. /**
  35. * Retourn l'objet ElementSearcher en cours.
  36. *
  37. * @return ElementSearcher
  38. */
  39. protected function getElementSearcher($count = null, $force_new = false)
  40. {
  41. $session = $this->get("session");
  42. // Si l'objet n'existe pas encore, a t-on déjà des paramètres de recherche
  43. if (!$session->has('user.element_search.params') || $force_new)
  44. {
  45. // Il nous faut instancier notre premier objet recherche
  46. // Premièrement on récupère les tags favoris de l'utilisateur
  47. $this->ElementSearcher = new ElementSearcher();
  48. $this->ElementSearcher->init(array(
  49. 'tags' => $this->getDoctrine()->getRepository('MuzichCoreBundle:User')
  50. ->getTagsFavorites(
  51. $this->getUserId(),
  52. $this->container->getParameter('search_default_favorites_tags_count')
  53. ),
  54. 'count' => ($count)?$count:$this->container->getParameter('search_default_count')
  55. ));
  56. // Et on met en session les paramètres
  57. $session->set('user.element_search.params', $this->ElementSearcher->getParams());
  58. }
  59. else
  60. {
  61. // Des paramètres existes, on fabrique l'objet recherche
  62. $this->ElementSearcher = new ElementSearcher();
  63. // et on l'initatialise avec ces paramétres connus
  64. $this->ElementSearcher->init($session->get('user.element_search.params'));
  65. if ($count)
  66. {
  67. $this->ElementSearcher->update(array('count' => $count));
  68. }
  69. }
  70. // on le retourne
  71. return $this->ElementSearcher;
  72. }
  73. /**
  74. * Retourne l'objet User.
  75. *
  76. * @param array $params
  77. * @return User
  78. */
  79. protected function getUser($personal_query = false, $params = array(), $force_refresh = false)
  80. {
  81. if (!$personal_query)
  82. {
  83. // Si on demande l'utilisateur sans forcer la réactualisation et que l'utilisateur
  84. // a déjà été demandé mais avec un requête personelle, on retourne cet utilisateur
  85. if (!$force_refresh && self::$user_personal_query)
  86. {
  87. return self::$user_personal_query;
  88. }
  89. // Si on demande une actualisation ou que l'utilisateur n'a pas encore été demandé
  90. // on va le récupérer
  91. else if ($force_refresh || !self::$user)
  92. {
  93. self::$user = $this->container->get('security.context')->getToken()->getUser();
  94. return self::$user;
  95. }
  96. return self::$user;
  97. }
  98. else
  99. {
  100. // Si l'on demande une réactualisation ou si l'user n'a pas encore été demandé
  101. // on va le récupérer en base.
  102. if ($force_refresh || !self::$user_personal_query)
  103. {
  104. self::$user_personal_query = $this->getDoctrine()->getRepository('MuzichCoreBundle:User')->findOneById(
  105. $this->container->get('security.context')->getToken()->getUser()->getId(),
  106. array_key_exists('join', $params) ? $params['join'] : array()
  107. )->getSingleResult();
  108. return self::$user_personal_query;
  109. }
  110. return self::$user_personal_query;
  111. }
  112. }
  113. /**
  114. * @desc Retourne l'id de l'utilisateur en cours
  115. */
  116. protected function getUserId()
  117. {
  118. /**
  119. * Bug lors des tests: L'user n'est pas 'lié' a celui en base par doctrine.
  120. * Docrine le voit si on faire une requete directe.
  121. */
  122. if ($this->container->getParameter('env') == 'test')
  123. {
  124. $user = $this->getDoctrine()->getRepository('MuzichCoreBundle:User')->findOneById(
  125. $this->container->get('security.context')->getToken()->getUser()->getId(),
  126. array()
  127. )->getSingleResult();
  128. return $user->getId();
  129. }
  130. if (($user = $this->getUser()) != 'anon.')
  131. {
  132. return $user->getId();
  133. }
  134. throw new \Exception('User not connected');
  135. }
  136. /**
  137. * Retourne un tabeau avec les tags connus.
  138. * TODO: Voir pour que cette info soit stocké (par exemple) dans un champs
  139. * texte en base. (json array)
  140. * TODO2: Voir si la question d'opt. "Formulaire d'ajout d'un élément" ne résoue pas
  141. * le problème du TODO ci-dessus.
  142. *
  143. * @return array
  144. */
  145. protected function getTagsArray($force_refresh = false)
  146. {
  147. throw new \Exception("Cette méthode ne doit plus être utilisé.");
  148. if (!count(self::$tags) || $force_refresh)
  149. {
  150. return self::$tags = $this->getDoctrine()->getRepository('MuzichCoreBundle:Tag')->getTagsArray();
  151. }
  152. return self::$tags;
  153. }
  154. /**
  155. * Retourne un tabeau avec les groupes accessible pour un ajout d'element.
  156. *
  157. * @return array
  158. */
  159. protected function getGroupsArray()
  160. {
  161. return $this->getDoctrine()->getRepository('MuzichCoreBundle:Group')
  162. ->getPublicAndOwnedArray($this->getUserId());
  163. }
  164. /**
  165. * Met en place un message de type flash.
  166. *
  167. * @param string $type
  168. * @param string $value
  169. */
  170. protected function setFlash($type, $value)
  171. {
  172. $this->container->get('session')->setFlash($type, $value);
  173. }
  174. /**
  175. * Instancie et retourne un objet ElementSearch
  176. *
  177. * @param array $params
  178. * @return ElementSearcher
  179. */
  180. protected function createSearchObject($params)
  181. {
  182. $search_object = new ElementSearcher();
  183. $search_object->init($params);
  184. return $search_object;
  185. }
  186. /**
  187. * Retourne un User en fonction du slug passé
  188. *
  189. * @param string $slug
  190. * @return User
  191. */
  192. protected function findUserWithSlug($slug)
  193. {
  194. try {
  195. return $this->getDoctrine()
  196. ->getRepository('MuzichCoreBundle:User')
  197. ->findOneBySlug($slug)
  198. ->getSingleResult()
  199. ;
  200. } catch (\Doctrine\ORM\NoResultException $e) {
  201. throw $this->createNotFoundException('Utilisateur introuvable.');
  202. }
  203. }
  204. /**
  205. * Retourne un Group en fonction du slug passé
  206. *
  207. * @param string $slug
  208. * @return Group
  209. */
  210. protected function findGroupWithSlug($slug)
  211. {
  212. try {
  213. return $this->getDoctrine()
  214. ->getRepository('MuzichCoreBundle:Group')
  215. ->findOneBySlug($slug)
  216. ->getSingleResult()
  217. ;
  218. } catch (\Doctrine\ORM\NoResultException $e) {
  219. throw $this->createNotFoundException('Groupe introuvable.');
  220. }
  221. }
  222. /**
  223. * Retourne un Group en fonction du id passé
  224. *
  225. * @param string $slug
  226. * @return Group
  227. */
  228. protected function findGroupWithId($id)
  229. {
  230. try {
  231. return $this->getDoctrine()
  232. ->getRepository('MuzichCoreBundle:Group')
  233. ->findOneById($id)
  234. ;
  235. } catch (\Doctrine\ORM\NoResultException $e) {
  236. throw $this->createNotFoundException('Groupe introuvable.');
  237. }
  238. }
  239. protected function getSearchForm($search_object)
  240. {
  241. return $this->createForm(
  242. new ElementSearchForm(),
  243. $search_object->getParams(true),
  244. array()
  245. );
  246. }
  247. protected function getAddForm($element = array())
  248. {
  249. return $this->createForm(
  250. new ElementAddForm(),
  251. $element,
  252. array()
  253. );
  254. }
  255. /**
  256. * Retourne une réponse contenant du json
  257. *
  258. * @param array $content
  259. * @return Response
  260. */
  261. protected function jsonResponse($content)
  262. {
  263. $response = new Response(json_encode($content));
  264. $response->headers->set('Content-Type', 'application/json; charset=utf-8');
  265. return $response;
  266. }
  267. protected function getAssetUrl($path, $packageName = null)
  268. {
  269. return $this->container->get('templating.helper.assets')->getUrl($path, $packageName);
  270. }
  271. /**
  272. *
  273. * @param strin $string
  274. * @param array $params
  275. * @param string $package
  276. * @return string
  277. */
  278. protected function trans($string, $params = array(), $package = null)
  279. {
  280. return $this->get('translator')->trans($string, $params, $package);
  281. }
  282. }