protected function makeTagRec($data) { $tag = new Tag(); $tag->setTagName($data['tag_name']); $tag->setVisible($data['visible']); $tag->setLocked($data['locked']); foreach ($data["tag_translation"] as $source) { $trans = new Translation(); $trans->setLocale($source['translation']); $trans->setName(Translation::$availableLocales[$source['translation']]); $tagSource = new TagTranslation($tag, $trans); $tagSource->setName($source["title"]); $tagSource->setDescription($source["description"]); $tag->getTranslatedTags()->add($tagSource); } foreach ($data['children'] as $child) { $tmp = $this->makeTagRec($child); $tag->addChild($tmp); } return $tag; }
/** * Return an edition form for current translated tag. * * @param Symfony\Component\HttpFoundation\Request $request * @param integer $tagId * @param integer | null $translationId * * @return Symfony\Component\HttpFoundation\Response */ public function editTranslatedAction(Request $request, $tagId, $translationId = null) { $this->validateAccessForRole('ROLE_ACCESS_TAGS'); if (null === $translationId) { $translation = $this->getService('em')->getRepository('RZ\\Roadiz\\Core\\Entities\\Translation')->findDefault(); } else { $translation = $this->getService('em')->find('RZ\\Roadiz\\Core\\Entities\\Translation', (int) $translationId); } if (null !== $translation) { /* * Here we need to directly select tagTranslation * if not doctrine will grab a cache tag because of TagTreeWidget * that is initialized before calling route method. */ $gtag = $this->getService('em')->find('RZ\\Roadiz\\Core\\Entities\\Tag', (int) $tagId); $tt = $this->getService('em')->getRepository('RZ\\Roadiz\\Core\\Entities\\TagTranslation')->findOneBy(['translation' => $translation, 'tag' => $gtag]); if (null !== $tt) { /* * Tag is already translated */ $tag = $tt->getTag(); $this->assignation['tag'] = $tag; $this->assignation['translatedTag'] = $tt; $this->assignation['translation'] = $translation; $this->assignation['available_translations'] = $this->getService('em')->getRepository('RZ\\Roadiz\\Core\\Entities\\Translation')->findAllAvailable(); $form = $this->createForm(new TagTranslationType(), $tt, ['em' => $this->getService('em')]); $form->handleRequest($request); if ($form->isValid()) { $this->getService('em')->flush(); /* * Dispatch event */ $event = new FilterTagEvent($tag); $this->getService('dispatcher')->dispatch(TagEvents::TAG_UPDATED, $event); $msg = $this->getTranslator()->trans('tag.%name%.updated', ['%name%' => $tag->getTranslatedTags()->first()->getName()]); $this->publishConfirmMessage($request, $msg); /* * Force redirect to avoid resending form when refreshing page */ return $this->redirect($this->generateUrl('tagsEditTranslatedPage', ['tagId' => $tag->getId(), 'translationId' => $translation->getId()])); } $this->assignation['form'] = $form->createView(); } else { /* * If translation does not exist, we created it. */ $this->getService('em')->refresh($gtag); if ($gtag !== null) { $baseTranslation = $gtag->getTranslatedTags()->first(); $translatedTag = new TagTranslation($gtag, $translation); if (false !== $baseTranslation) { $translatedTag->setName($baseTranslation->getName()); } else { $translatedTag->setName('tag_' . $gtag->getId()); } $this->getService('em')->persist($translatedTag); $this->getService('em')->flush(); /* * Dispatch event */ $event = new FilterTagEvent($gtag); $this->getService('dispatcher')->dispatch(TagEvents::TAG_UPDATED, $event); return $this->redirect($this->generateUrl('tagsEditTranslatedPage', ['tagId' => $gtag->getId(), 'translationId' => $translation->getId()])); } else { return $this->throw404(); } } return $this->render('tags/edit.html.twig', $this->assignation); } else { return $this->throw404(); } }
/** * Find a tag according to the given path or create it. * * @param string $tagPath * * @return RZ\Roadiz\Core\Entities\Tag */ public function findOrCreateByPath($tagPath) { $tagPath = trim($tagPath); $tags = explode('/', $tagPath); $tags = array_filter($tags); $tagName = $tags[count($tags) - 1]; $parentName = null; $parentTag = null; if (count($tags) > 1) { $parentName = $tags[count($tags) - 2]; $parentTag = $this->findOneByTagName($parentName); if (null === $parentTag) { $ttagParent = $this->_em->getRepository('RZ\\Roadiz\\Core\\Entities\\TagTranslation')->findOneByName($parentName); if (null !== $ttagParent) { $parentTag = $ttagParent->getTag(); } } } $tag = $this->findOneByTagName($tagName); if (null === $tag) { $ttag = $this->_em->getRepository('RZ\\Roadiz\\Core\\Entities\\TagTranslation')->findOneByName($tagName); if (null !== $ttag) { $tag = $ttag->getTag(); } } if (null === $tag) { /* * Creation of a new tag * before linking it to the node */ $trans = $this->_em->getRepository('RZ\\Roadiz\\Core\\Entities\\Translation')->findDefault(); $tag = new Tag(); $tag->setTagName($tagName); $translatedTag = new TagTranslation($tag, $trans); $translatedTag->setName($tagName); $tag->getTranslatedTags()->add($translatedTag); if (null !== $parentTag) { $tag->setParent($parentTag); } $this->_em->persist($translatedTag); $this->_em->persist($tag); $this->_em->flush(); } return $tag; }