/** * {@inheritdoc} */ public function reverseTransform($value) { if (is_string($value)) { return $this->tagRepository->resolveWithString($value, $this->delimiter); } return $value; }
/** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder->addModelTransformer(new TaggingTransformer($this->tagRepository, $options['delimiter'])); $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($options) { $tags = $event->getData(); $event->setData(is_array($tags) ? implode($options['delimiter'], $tags) : $tags); }); // TODO: BUG FIXME not work when object have no id (none persited object) $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) { $object = $event->getForm()->getParent()->getData(); if (!$object instanceof TagsAwareInterface || !$object instanceof OriginContextInterface) { return; } $tags = $this->tagRepository->resolveWithString($event->getData()) ?: array(); $object->setTags(null); /** @var TaggingInterface[] $oldTaggings */ $oldTaggings = $this->taggingRepository->findBy(array('originAlias' => $object->getOriginalAlias(), 'originId' => $object->getId())); foreach ($oldTaggings as $oldTagging) { if (!in_array($oldTagging->getTag(), $tags)) { $this->taggingRepository->getManager()->remove($oldTagging); } } $this->taggingRepository->getManager()->flush(); foreach ($tags as $tag) { $tagging = $this->taggingRepository->findWithTagAndAlias($tag, $object, true); $this->originator->setOrigin($tagging, $object); $this->taggingRepository->add($tagging); $object->addTag($tag); } }); }