[英]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';
}
}
现在我有几个问题:
我进行了一些测试,问题是,在Submit事件中,我无法获得始终为NULL的剧院值(代码中的变量$ theatre )。
在球场触发提交事件时,什么是正确的代码来获取场戏剧的价值?
实际上,我想像在初始化时一样在表单上触发Submit事件,因为否则我将不得不为Theater编写相同的事件。
我试图复制初始化代码,只是将事件更改为* POST_SUBMIT *,但是随后收到一条错误消息,提示我无法在提交时向表单添加字段。
显然,当我从字段而不是表单触发事件时,Symfony在表单和添加项之间进行匹配。
为什么? 有什么不同吗?
额外的问题:如何在表格中间插入字段(例如在play和Theater之间)?
谢谢您的帮助 !! :)
听起来您最好使用两种形式。
第一个表格要求剧院和剧院,然后您将使用javascript判断两个字段是否都已填写,然后用ajax请求获取第二个表格,该表格将在您已经为其准备好的空div中呈现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.