Отредактируйте ребенка в buildForm - PullRequest
0 голосов
/ 27 августа 2018

Я использую Symfony 3.4.7. Я работаю в форме. У меня есть formType с функцией buildForm с некоторым ребенком. Я добавляю eventListener для нескольких детей. В функции, которая прикреплена к eventListener, я хотел бы редактировать существующий дочерний элемент. Но я хочу отредактировать дочерний элемент, к которому также прикреплен eventListener.

Это форма, которую я имею:

<?php

namespace AppBundle\Form;
// use ...

class ArticlesCategoriesType extends AbstractType
{
private $em;
private $ac;
private $max_long_arbo;

public function __construct(EntityManagerInterface $em, ArborescenceCategories $ac, $max_prof_arbo_cat)
{
    $this->em = $em;
    $this->ac = $ac;
    $this->max_long_arbo = $max_prof_arbo_cat;
}

/**
 * Construction du formulaire
 *
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $parents = $this->em->getRepository('AppBundle:Categories')->findByParent(null);
    $builder

        ->add('categorie_enfant1', EntityType::class, [
            'class' => 'AppBundle\Entity\Categories',
            'placeholder' => 'Sélectionnez la gamme',
            'choices' => $parents,
            'mapped' => false,
            'label' => ' '
        ])
        ->add('codeCategorie', HiddenType::class, [
            'label' => ' '
        ]);


        $builder->add('categorie_enfant2', HiddenType::class, [
            'mapped' => false,
            'label' => ' '
        ]);

    $builder->get('categorie_enfant1')->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event){
            $form = $event->getForm();
            /* @var $categorie Categories */
            $categorie = $form->getData();

            $this->addEnfantCategorie($event->getForm(), 2, $categorie);
        }
    );

    $builder->get('categorie_enfant2')->addEventListener(
        FormEvents::POST_SUBMIT,
        function (FormEvent $event){
            $form = $event->getForm();
             /* @var $categorie Categories */
             $categorie = $form->getData();
             $this->addEnfantCategorie($form, 3, $categorie);
        }
    );
 }
 }

И код функции addEnfantCategorie:

<?php
public function addEnfantCategorie(FormInterface $form, $i, Categories $categorie){
    $builder = $form->getParent();
    // récupère les catégories enfants
    $categories = null;
    dump($form->getName().' '.$categorie);
    $categories = $this->em->getRepository('AppBundle:Categories')->findByParent($categorie->getIdCategorie());
    $builder->add('categorie_enfant2', EntityType::class, [
            'class' => 'AppBundle\Entity\Categories',
            'label'=> ' ',
            'placeholder' => 'Sélectionner la catégorie',
            'choices' => $categories,
            'mapped' => false
        ]);
}

Чтобы отредактировать дочерний элемент, я нахожу решение добавить дочерний элемент с тем же именем, что и тот, которого я добавил в построителе происхождения. Но он стирает прикрепленный к нему eventListener.

Я не нахожу решение просто отредактировать ребенка и не удалять ребенка с тем же именем. Я надеюсь, что существует решение для этого.

[РЕДАКТИРОВАТЬ 1] В результате я хочу неопределенное количество кнопок. Максимальное количество кнопок определяется глобальной переменной. enter image description here Кнопка 1 отображает только те категории, у которых нет родителей. Когда я выбираю категорию на кнопке 2, я хочу, чтобы она отображала категории, которые являются дочерними для категории 1 и т. Д. Для остальной части кнопки. Вот почему мне нужно в форме EventListener для всех кнопок. Для динамического отображения я использую Javascript.

[РЕДАКТИРОВАТЬ 2] Я пытался использовать встроенную форму. Это код для формы, которая вставляется:

<?php

namespace AppBundle\Form;

use ...

class CategoryType extends AbstractType{

private $em;

public function __construct(EntityManagerInterface $em)
{
    $this->em = $em;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $parents = $this->em->getRepository('AppBundle:Categories')->findByParent(null);
    $builder->add('reference', EntityType::class, [
        'class' => 'AppBundle\Entity\Categories',
        'placeholder' => 'Sélectionner la gamme',
        'choices' => $parents,
        'label' => ' '
    ]);
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => Categories::class,
    ));
}
}

Я бы передал атрибут в форме CatgeoryType, который является родителем. Я хотел бы использовать этот атрибут 'parent', чтобы получить всех потомков этого родителя. Но я не знаю, как я могу это сделать.

И в моей основной форме ArticlesCatgeories, когда я добавляю в свой конструктор тип CatgeoryType, я хотел бы отправить параметры 'parent', который является категорией, выбранной прецедентом 'categoryorie_enfant'.

Это код для моей основной формы. СтатьиКатегорииТип:

<?php

namespace AppBundle\Form;

use ...

class ArticlesCategoriesType extends AbstractType
{
private $em;
private $ac;
private $max_long_arbo;

public function __construct(EntityManagerInterface $em, ArborescenceCategories $ac, $max_prof_arbo_cat)
{
    $this->em = $em;
    $this->ac = $ac;
    $this->max_long_arbo = $max_prof_arbo_cat;

}

/**
 * Construction du formulaire
 *
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $enfants = $this->ac->getDernierEnfants($this->em);
    $builder
        ->add('codeCategorie', null, [
            'placeholder' => 'Sélectionnez une catégorie',
            'choices' => $enfants
        ])
        // ... others attributes 
    ->add('categorie_enfant1', CategoryType::class, [
        'parent' => 'A1'
    ])
    ->add('categorie_enfant2', CategoryType::class, [
            'mapped' => false,
            'label' => ' '
        ]);
     }
   }

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...