Ich habe ein kleines Problem mit FormEvents, ich möchte 3 Felder dynamisch ausgefüllt werden. Ich erkläre, ich habe 3 Felder: Projekt> Box> Zelle, der Benutzer wählt ein Projekt, die Boxliste wird aktualisiert, er wählt eine Box, die Zellliste wird aktualisiert.Dynamische Generierung für übermittelte Formulare mit Formularereignissen
, es zu tun, ich benutze FormEvent wie die Dokumentation sagen (http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data)
Aber ich habe ein Problem, für nur ein einziges Feld dynamisch aktualisiert, es Arbeit ist, aber nicht für zwei Felder ... Eigentlich ein Benutzer kann ein Projekt auswählen, und wenn er es macht, wird das Feld Feld aktualisiert. Aber, wenn er eine Box wählte, wurde das Zellenfeld nicht aktualisiert ...
Aber ich habe etwas gefunden, die erlauben es zu arbeiten, nur etwas in einem ändern -> add() und umgekehrt - > hinzufügen(). Aber ich will es nicht.
Mein Code ist:
$builder
->add('project', EntityType::class, array(
'class' => 'AppBundle\Entity\Project',
'choice_label' => 'name',
'placeholder' => '-- select a project --',
'mapped' => false,
))
->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
'choices' => [],
))
->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
))
;
Und wenn ich es ändern:
builder
->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
// 'choices' => [],
))
->add('project', EntityType::class, array(
'class' => 'AppBundle\Entity\Project',
'choice_label' => 'name',
'placeholder' => '-- select a project --',
'mapped' => false,
))
->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
))
;
Es ist Arbeit ... Aber ich will eine leere Liste für Feld am Start, und ich möchte Projekt vor der Box ...
Ein wenig Präzision, diese Form ist in einer anderen Form als CollectionType eingebettet.
Der gesamte Code dieser Art:
<?php
namespace AppBundle\Form;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TubeType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('project', EntityType::class, array(
'class' => 'AppBundle\Entity\Project',
'choice_label' => 'name',
'placeholder' => '-- select a project --',
'mapped' => false,
))
->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
'choices' => [],
))
->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
))
;
// MODIFIER
$boxModifier = function (FormInterface $form, $project) {
$boxes = (null === $project) ? [] : $project->getBoxes();
$form->add('box', EntityType::class, array(
'class' => 'AppBundle\Entity\Box',
'choice_label' => 'name',
'placeholder' => '-- select a box --',
'choices' => $boxes,
));
};
$cellModifier = function(FormInterface $form, $box) {
$cells = (null === $box) ? [] : $box->getEmptyCells();
$form->add('cell', ChoiceType::class, array(
'placeholder' => '-- select a cell --',
'choices' => $cells,
));
};
// FORM EVENT LISTENER
$builder->get('project')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($boxModifier) {
$project = $event->getForm()->getData();
$boxModifier($event->getForm()->getParent(), $project);
}
);
$builder->get('box')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($cellModifier) {
$box = $event->getForm()->getData();
$cellModifier($event->getForm()->getParent(), $box);
}
);
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Tube'
));
}
}
Vielen Dank an Ihre Hilfe :)
Danke, aber nur eine Frage, wenn Sie Felder in EventListener generieren, wie fügen Sie einen Listener auf diesem? Da, wenn ich Felder in PRE_SET_DATA hinzufügen, kann ich nicht tun "$ Builder-> get ('Projekt') -> addEventListener (" weil das Feld noch nicht existiert.:/ – mpiot
Und wenn ich es versuche benutze 'builder-> addEventListener (FormEvents :: POST_SUBMIT, function (FormEvent $ event) {', Ich habe keine Daten wenn ich '$ event-> getData();' – mpiot
Ich habe meine Antwort aktualisiert, gehe durch das doc Link in der Antwort. Wenn Sie noch Hilfe benötigen, kommentieren. Ich kann später ein Code-Snippet hinzufügen. – Jeet