动态表格生成 - 字段取决于其他2

时间:2014-01-04 16:43:16

标签: php forms events symfony field

.Hello Everyone,

我很难尝试生成一个动态依赖于其他2个字段的字段。我尝试了不同的东西,但我得到了一点,我只是不知道该怎么做。

基本上我有一个实体 预订 ,其中包含(其中包括)指向实体的1个字段 showw Showw 即可。 实体 Showw 有2个字段 影院 播放 指向其他2个同名实体。

我现在想要的是构建 预订表单 ,以便我可以先选择 影院 播放 ,然后选择 showw ,使用相同的 影院 播放

所以我需要过滤 showw 字段。这就是我做的:
在初始化时发生的事件工作正常(字段 showw 已正确过滤)但不是在提交时发生的事件( showw 总是空的。)

<?php
// src/MySite/MyBundle/Form/ReservationType.php

namespace MySite\MyBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;

use MySite\MyBundle\Entity\ShowwRepository;

class ReservationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
    {
    // Generating Form
    $builder
        ->add('play',           'entity',   array('label'  => 'Play',
                                                'class' => 'MySiteMyBundle:Play',
                                                'property'  => 'title',
                                                'required' => false))
        ->add('theatre',        'entity',   array('label'  => 'Theatre',
                                                'class' => 'MySiteMyBundle:Theatre',
                                                'property'  => 'name',
                                                'required' => false))
    ;

    // Modifier to Generate the Showw Field
    $formModifier = function (FormInterface $form, $play, $theatre) {
        $form->add('showw',     'entity',   array('label'  => 'Show',
                                                'class' => 'MySiteMyBundle:Showw',
                                                'property'  => 'showwDateAsString',
                                                'query_builder' => function(ShowwRepository $r) use ($play, $theatre) { return $r->wherePlayAndTheatre($play, $theatre); }));
    };

    // Initialisation Event
    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use ($formModifier) {

            $data = $event->getData();
            $formModifier($event->getForm(), $data->getPlay(), $data->getTheatre());
        }
    );

    // Submit Event
    $builder->get('play')->addEventListener(
        FormEvents::POST_SUBMIT,
        function(FormEvent $event) use ($formModifier) {

            $theatre = $event->getForm()->getParent()->getData()->getTheatre();
            $formModifier($event->getForm()->getParent(), $event->getForm()->getData(), $theatre);
        }
    );
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MySite\MyBundle\Entity\Reservation'
    ));
}

public function getName()
{
    return 'MySite_MyBundle_reservationtype';
}
}

现在我有几个问题:

  1. 我做了一些测试,问题是,在 提交 事件中,我无法获得 影院 值(代码中的变量 $ theater ),始终为NULL。
    播放 字段上触发提交事件时,获取 影院 字段值的正确代码是什么

  2. 实际上我想在初始化时触发表单上的提交事件,否则我将不得不为 theater <编写相同的事件/ strong>即可。
    我试图复制初始化代码只是将事件更改为 * POST_SUBMIT * ,但后来我收到一条错误消息,说我无法在提交时向表单添加字段。
    显然,当我从字段而不是表单触发事件时,Symfony在表单和添加之间进行匹配。
    为什么?有什么不同?

  3. 加分问题:如何在表单中间插入字段(例如 播放 剧院之间 )?

  4. 感谢您的帮助! :)

1 个答案:

答案 0 :(得分:0)

听起来你可能更喜欢使用两种形式。

第一个表格要求剧院和游戏,你将使用javascript告诉两个字段是否已填写,然后ajax请求获取第二个表单,你在一个已经为它布局的空div中呈现