Skip to content

[Form] Dynamic Form - Multiple field dependant #11902

Closed
@raziel057

Description

@raziel057

Hi,

Currently it's possible to create and populate fields based on an other one by using Listeners as in sample http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms

But I seems to be not possible to make the field depend on multiple fields. For example, I would like to populate a list of available rooms depending on the type of room, start date and end date.

I tried by adding the following listener:

$formModifier = function (FormInterface $form, RoomType $roomType = null, \DateTime $startTime = null, \DateTime $endTime = null) {

    $roomTypeId = ($roomType !== null) ? $roomType->getId() : null;

    $hallConfigurations = $this->entityManager->getRepository('PTCNoventoBundle:HallConfiguration')
        ->getAllAvailableForCriteria($roomTypeId, $startTime, $endTime);

    $form->add('hallConfiguration', 'entity', array(
        'label' => 'hall',
        'choices' => $hallConfigurations,
        'class' => 'PTCNoventoBundle:HallConfiguration',
    ));
};

$builder->get('roomType')->addEventListener(
    FormEvents::POST_SUBMIT,
    function (FormEvent $event) use ($formModifier) {
        $roomType = $event->getForm()->getData();
        $startTime = $event->getForm()->getParent()->getData()->getStartTime(); // <- null
        $endTime = $event->getForm()->getParent()->getData()->getEndTime(); // <- null
        $formModifier($event->getForm()->getParent(), $roomType, $startTime, $endTime)           
    }
);

As you can see $startDate and $endDate are null at this time (not yet bound in the root form, I think). So I also tried to create a POST_SUBMIT listener attached to the root form but I have an error because I can't create new field on POST_SUBMIT at root form level.

If I replace the listener on roomType by a listener with SUBMIT EVENT at root level, I get always null in hallConfiguration (because the field was bound before).

$builder->addEventListener(
    FormEvents::SUBMIT,
    function (FormEvent $event) use ($formModifier) {

        $roomType = $event->getForm()->get('roomType')->getData(); // <- ok - RoomType object
        $startTime = $event->getForm()->get('startTime')->getData(); // <- ok - DateTime object
        $endTime = $event->getForm()->get('endTime')->getData(); // <- ok - DateTime object

        $formModifier($event->getForm(), $roomType, $startTime, $endTime);

        $this->logger->info(print_r($event->getData()->getHallConfiguration(), true)); // <- null
    }
);

It would be interesting to be able to support dynamic form with multiple dependent fields as in my sample.

@webmozart Any ideas on this possible feature ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions