.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';
}
}
现在我有几个问题:
我做了一些测试,问题是,在 提交 事件中,我无法获得 影院 值(代码中的变量 $ theater ),始终为NULL。
在 播放 字段上触发提交事件时,获取 影院 字段值的正确代码是什么
实际上我想在初始化时触发表单上的提交事件,否则我将不得不为 theater <编写相同的事件/ strong>即可。
我试图复制初始化代码只是将事件更改为 * POST_SUBMIT * ,但后来我收到一条错误消息,说我无法在提交时向表单添加字段。
显然,当我从字段而不是表单触发事件时,Symfony在表单和添加之间进行匹配。
为什么?有什么不同?
加分问题:如何在表单中间插入字段(例如 播放 和 剧院之间 )?
感谢您的帮助! :)
答案 0 :(得分:0)
听起来你可能更喜欢使用两种形式。
第一个表格要求剧院和游戏,你将使用javascript告诉两个字段是否已填写,然后ajax请求获取第二个表单,你在一个已经为它布局的空div中呈现