TagManager.php 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace Muzich\CoreBundle\Managers;
  3. use Muzich\CoreBundle\Entity\Tag;
  4. use Doctrine\ORM\EntityManager;
  5. use Symfony\Component\DependencyInjection\Container;
  6. use FOS\UserBundle\Util\CanonicalizerInterface;
  7. use Doctrine\Bundle\DoctrineBundle\Registry;
  8. use Muzich\CoreBundle\Util\StrictCanonicalizer;
  9. use Muzich\CoreBundle\Entity\UsersTagsFavorites;
  10. use Muzich\CoreBundle\Entity\GroupsTagsFavorites;
  11. /**
  12. *
  13. *
  14. * @author bux
  15. */
  16. class TagManager
  17. {
  18. protected $nameCanonicalizer;
  19. public function __construct(CanonicalizerInterface $nameCanonicalizer = null)
  20. {
  21. if ($nameCanonicalizer)
  22. {
  23. $this->nameCanonicalizer = $nameCanonicalizer;
  24. }
  25. else
  26. {
  27. $this->nameCanonicalizer = new StrictCanonicalizer();
  28. }
  29. }
  30. public function updateSlug(Tag $tag)
  31. {
  32. $tag->setSlug($this->nameCanonicalizer->canonicalize($tag->getName()));
  33. }
  34. public function addTag(Registry $doctrine, $name, $user, $arguments = null)
  35. {
  36. $name_canonicalized = $this->nameCanonicalizer->canonicalize(trim($name));
  37. // Check avant de commencer: On regarde si ce tag n'existe pas déjà en tag
  38. // public (en cas de gruge)
  39. if (($tag = $doctrine->getRepository('MuzichCoreBundle:Tag')
  40. ->findOneBy(array(
  41. 'slug' => $name_canonicalized,
  42. 'tomoderate' => false
  43. ))))
  44. {
  45. // Si il existe déjà pas besoin de l'ajouter
  46. return $tag;
  47. }
  48. // Première étape, on regarde en base si quelqu'un a pas déjà ajouté ce tag
  49. if (($tag = $doctrine->getRepository('MuzichCoreBundle:Tag')
  50. ->findOneBy(array(
  51. 'slug' => $name_canonicalized,
  52. 'tomoderate' => true
  53. ))))
  54. {
  55. // Si il existe déjà pas besoin de l'ajouter ou le retourne
  56. // après avoir ajouté cet utilisateurs a la liste de ceux pouvant le voir
  57. $privatesids = json_decode($tag->getPrivateids());
  58. if (!in_array($user->getId(), $privatesids))
  59. {
  60. $privatesids[] = (string)$user->getId();
  61. }
  62. $tag->setPrivateids(json_encode($privatesids));
  63. $tag->setArguments($tag->getArguments(). " ****" . $user->getName()."****: " .$arguments);
  64. $doctrine->getEntityManager()->persist($tag);
  65. $doctrine->getEntityManager()->flush();
  66. return $tag;
  67. }
  68. else
  69. {
  70. // Sinon on l'ajoute en base
  71. $tag = new Tag();
  72. $tag->setName(ucfirst(strtolower($name)));
  73. $tag->setSlug($name_canonicalized);
  74. $tag->setTomoderate(true);
  75. $tag->setPrivateids(json_encode(array((string)$user->getId())));
  76. $tag->setArguments(" ****" . $user->getName()."****: " .$arguments);
  77. $doctrine->getEntityManager()->persist($tag);
  78. $doctrine->getEntityManager()->flush();
  79. return $tag;
  80. }
  81. }
  82. protected function replaceTagByAnother(EntityManager $em, $tag, $new_tag)
  83. {
  84. /*
  85. * Trois cas de figures ou sont utilisés les tags
  86. * * Sur un élément
  87. * * Tag favori
  88. * * Tag d'un groupe
  89. */
  90. // Sur un élément
  91. foreach ($elements = $em->createQuery("
  92. SELECT e, t FROM MuzichCoreBundle:Element e
  93. JOIN e.tags t
  94. WHERE t.id = :tid
  95. ")
  96. ->setParameter('tid', $tag->getId())
  97. ->getResult() as $element)
  98. {
  99. // Pour chaque elements lié a ce tag
  100. // On ajoute un lien vers le nouveau tag si il n'en n'a pas déjà
  101. if (!$element->hasTag($new_tag))
  102. {
  103. $element->addTag($new_tag);
  104. $em->persist($element);
  105. }
  106. }
  107. // Tag favoris
  108. foreach ($favorites = $em->createQuery("
  109. SELECT f FROM MuzichCoreBundle:UsersTagsFavorites f
  110. WHERE f.tag = :tid
  111. ")
  112. ->setParameter('tid', $tag->getId())
  113. ->getResult() as $fav)
  114. {
  115. // Pour chaque favoris utilisant ce tag on regarde si l'utilisateur
  116. // n'a pas déjà le nouveau tag en favoris.
  117. if (!$em->createQuery("
  118. SELECT COUNT(f.id) FROM MuzichCoreBundle:UsersTagsFavorites f
  119. WHERE f.tag = :tid AND f.user = :uid
  120. ")
  121. ->setParameters(array('tid' => $new_tag->getId(), 'uid' => $fav->getUser()->getId()))
  122. ->getSingleScalarResult())
  123. {
  124. $new_fav = new UsersTagsFavorites();
  125. $new_fav->setTag($new_tag);
  126. $new_fav->setUser($fav->getUser());
  127. $new_fav->setPosition($fav->getPosition());
  128. $em->persist($new_fav);
  129. }
  130. $em->remove($fav);
  131. }
  132. // groupe
  133. foreach ($em->createQuery("
  134. SELECT f FROM MuzichCoreBundle:GroupsTagsFavorites f
  135. WHERE f.tag = :tid
  136. ")
  137. ->setParameter('tid', $tag->getId())
  138. ->getResult() as $fav)
  139. {
  140. // Pour chaque favoris utilisant ce tag on regarde si le groupe
  141. // n'a pas déjà le nouveau tag en favoris.
  142. if (!$em->createQuery("
  143. SELECT COUNT(f.id) FROM MuzichCoreBundle:GroupsTagsFavorites f
  144. WHERE f.tag = :tid AND f.group = :gid
  145. ")
  146. ->setParameters(array('tid' => $new_tag->getId(), 'gid' => $fav->getGroup()->getId()))
  147. ->getSingleScalarResult())
  148. {
  149. $new_fav = new GroupsTagsFavorites();
  150. $new_fav->setTag($new_tag);
  151. $new_fav->setGroup($fav->getGroup());
  152. $new_fav->setPosition($fav->getPosition());
  153. $em->persist($new_fav);
  154. }
  155. $em->remove($fav);
  156. }
  157. $em->remove($tag);
  158. $em->flush();
  159. }
  160. /**
  161. *
  162. * @param \Doctrine\Bundle\DoctrineBundle\Registry $doctrine
  163. * @param \Muzich\CoreBundle\Entity\Tag $tag
  164. * @param type $accept
  165. * @param type $replacing_id
  166. * @return boolean
  167. */
  168. public function moderateTag(Registry $doctrine, Tag $tag, $accept, $replacing_id = null)
  169. {
  170. if ($tag)
  171. {
  172. if ($accept)
  173. {
  174. $tag->setTomoderate(false);
  175. $tag->setPrivateids(null);
  176. $doctrine->getEntityManager()->persist($tag);
  177. $doctrine->getEntityManager()->flush();
  178. }
  179. else
  180. {
  181. if ($replacing_id)
  182. {
  183. // Si c'est un remplacement on envoit la sauce
  184. if (!($new_tag = $doctrine->getRepository('MuzichCoreBundle:Tag')->findOneById($replacing_id)))
  185. {
  186. return false;
  187. }
  188. $this->replaceTagByAnother($doctrine->getEntityManager(), $tag, $new_tag);
  189. }
  190. else
  191. {
  192. $doctrine->getEntityManager()->remove($tag);
  193. $doctrine->getEntityManager()->flush();
  194. }
  195. }
  196. return true;
  197. }
  198. else
  199. {
  200. return false;
  201. }
  202. }
  203. }