Php 如何在Symfony中获取表单生成器中的字段值
如何在Symfony的form builder中获取字段值。 我在表单中有两个下拉列表 当页面打开时,我想在Dropdown1的基础上在Dropdown2中添加相关选项 这是我的表格Php 如何在Symfony中获取表单生成器中的字段值,php,forms,symfony,symfony-forms,builder,Php,Forms,Symfony,Symfony Forms,Builder,如何在Symfony的form builder中获取字段值。 我在表单中有两个下拉列表 当页面打开时,我想在Dropdown1的基础上在Dropdown2中添加相关选项 这是我的表格 use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\Event\DataEvent; use C2Educate\ToolsBundle\Entity\Students; public function buildForm(FormBu
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Event\DataEvent;
use C2Educate\ToolsBundle\Entity\Students;
public function buildForm(FormBuilder $builder, array $options) {
字段1:
$builder->add('leadSource', 'entity', array(
'label' => 'How did you hear about C2? Source ',
'class' => 'C2EducateToolsBundle:LeadSources',
'query_builder' => function($repo) {
return $repo->createQueryBuilder('p')->orderBy('p.sort_order', 'ASC');
},
'property' => 'name',
'empty_value' => 'Select'
));
$leadSource = 1;
$leadSource=1代码>-当我静态赋值时,它会工作,但我想获取“leadSource”的值并将其赋值给$leadSource
我想获取leadSource并将其传递给leadSourceSub查询
字段2:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) {
$form = $event->getForm();
$entity = $event->getData();
$leadSource = $entity->getLeadSourceID();
$form->add('leadSourceSub', 'C2Educate\ToolsBundle\Entity\Students', array(
'label' => ' Source Detail ',
'required' => true,
'class' => 'C2EducateToolsBundle:LeadSourceSubs',
'query_builder' => function($repo) use ($leadSource) {
return $repo->createQueryBuilder('p')
->where('p.lead_source_id =:leadSource')
->setParameter('leadSource', $leadSource)
->orderBy('p.sort_order', 'ASC');
},
'property' => 'name',
'empty_value' => 'Select'
));
});
无法从$builder
获取表单数据,因为。。。它是一个表单生成器,而不是表单。它还没有包含任何数据
要实现这一点,您需要使用FormEvents
。在这种情况下,您可能需要FormEvents::PRE_SET_DATA
事件侦听器
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
// in your case it's C2EducateToolsBundle:LeadSourceSubs
$entity = $event->getData();
$leadSource = $entity->getLeadSource();
// adding this field again will override it.
$form->add('leadSourceSub', 'entity', array(
'label' => ' Source Detail ',
'required' => true,
'class' => 'C2EducateToolsBundle:LeadSourceSubs',
'query_builder' => function($repo) use ($leadSource) {
return $repo->createQueryBuilder('p')
->where('p.lead_source_id =:leadSource')
->setParameter('leadSource', $leadSource)
->orderBy('p.sort_order', 'ASC');
},
'property' => 'name',
'empty_value' => 'Select'
));
}
});
请注意,此代码未经测试,可能需要一些验证,例如检查$entity
是否是您在任何情况下所期望的。是的,我从中尝试了相同的操作。我收到一个错误可捕获的致命错误:参数1传递给C2Educate\ToolsBundle\Form\Type\StudentsType::C2Educate\ToolsBundle\Form\Type\{Close}()必须是C:\xampp\htdocs\c2Education\src\C2Educate\ToolsBundle\Form\Type\FormEvent中给定的C2Educate\ToolsBundle\Form\Type\FormEvent的实例,Symfony\Component\Form\Event\DataEvent的实例。您可能只是复制了代码,忘记了导入名称空间<代码>使用Symfony\Component\Form\FormEvent
似乎您的Symfony很旧,因此可能需要使用Symfony\Component\Form\Event\DataEvent
而不是上面的一个,并修改闭包以期望DateEvent
而不是FormEvent
。是的。我使用了DataEvent,它工作正常,当我试图访问我的实体时,它不可用。我更新了我在字段2中的问题,您是否可以查看它。我收到了这个问题致命错误:在C:\xampp\htdocs\c2Education\src\C2Educate\ToolsBundle\Form\Type\StudentsType.php的第123行调用null上的成员函数getLeadSourceID()
您能告诉我们哪里做错了吗。