繁体   English   中英

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

[英]Dynamic Form Generation - Field depending on 2 Others

。大家好,

我很难尝试动态生成一个依赖于其他2个字段的字段。 我尝试了不同的事情,但是到了要点,就是我不知道该做什么了。

基本上,我有一个实体Reservation ,其中包含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. 我进行了一些测试,问题是,在Submit事件中,我无法获得始终为NULL的剧院值(代码中的变量$ theatre )。
    球场触发提交事件时,什么是正确的代码来获取场戏剧的价值?

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

  3. 额外的问题:如何在表格中间插入字段(例如在playTheater之间)?

谢谢您的帮助 !! :)

听起来您最好使用两种形式。

第一个表格要求剧院和剧院,然后您将使用javascript判断两个字段是否都已填写,然后用ajax请求获取第二个表格,该表格将在您已经为其准备好的空div中呈现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM