Controller.php 9.4KB

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