Symfony 4,3 Dynami c Форма для решения тегов с Doctrine много к одной ассоциации - PullRequest
0 голосов
/ 18 января 2020

Во-первых, я извиняюсь за мой плохой английский sh. Мне нужно создать форму для добавления новых тегов для статьи, но когда я отправляю форму, данные запроса не обрабатываются в моей форме, потому что новые добавленные теги не находятся в коллекции массива объектов. Можно ли добавить пользовательский выбор в поле формы со многими в одну ассоциацию?

Вот мой код:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        dump($builder->getFormConfig()); die;
        /** @var Domain $domain */
        $domain = $this->currentDomainService->getCurrentDomain();

        $builder
            ->add('articleTitle', TextType::class, [])
            ->addEventSubscriber(new TagsChoicesSubscriber())
        ;
    }

class TagshoicesSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA => ['preSetData', -50],
            FormEvents::PRE_SUBMIT => ['preSetData', -50],
        );
    }

    public function preSetData(FormEvent $event, $childName)
    {

        $choices = array();

        /** @var Article $article */
        $article = $event->getData();

        if ($article instanceof Article) {

            foreach ($article->getTags() as $tag) {
                $tags[] = $tag->getTagName();
            }

            $event->getForm()->add(
                'tags',
                ChoiceType::class,
                [
                    'multiple' => true,
                    'mapped' => false,
                    'choices' => $choices,
                    'data' => $tags,
                    'required' => true,
                    'constraints' => [
                        new NotBlank(),
                    ],
                ]
            );
        }
    }
}

/**
 * Article
 * @ORM\Entity()
 */
class Article
{
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Tags", mappedBy="article")
     */
    private $tags;
}
/**
 * Tag
 *
 * @ORM\Entity()
 */
class Tag
{
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Article", inversedBy="tags")
     * @ORM\JoinColumn(name="article_id", referencedColumnName="id")
     */
    private $article;
}


        $form = $this->createForm('App\Form\ArticleType', $article);
        $form->handleRequest($request);

1 Ответ

0 голосов
/ 18 января 2020

Вам необходимо реализовать либо поле типа коллекции, либо тип выбора с несколькими значениями, установленными в true, здесь Symfony тип коллекции , а здесь Symfony тип выбора , вам также понадобится функция toString в классе Tag. Дайте мне знать, если это помогло, если у вас все еще будут проблемы, я предоставлю вам несколько примеров кода

...