Php 如何在Symfony中获取表单生成器中的字段值

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

如何在Symfony的form builder中获取字段值。 我在表单中有两个下拉列表 当页面打开时,我想在Dropdown1的基础上在Dropdown2中添加相关选项

这是我的表格

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()
您能告诉我们哪里做错了吗。