Я использую 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]
В результате я хочу неопределенное количество кнопок. Максимальное количество кнопок определяется глобальной переменной.
Кнопка 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' => ' '
]);
}
}
Спасибо.