【问题标题】:Symfony Dynamic Modification of Form without EntitySymfony 动态修改无实体的表单
【发布时间】:2016-05-10 15:06:05
【问题描述】:

我正在关注 dynamic form modification 的 Symfony (v2.7) Cookbook 食谱。我的目标是根据用户的单选按钮选择显示某些字段。例如,如果用户希望根据上一会计年度的记录过滤搜索,他从 criteriaFilter 选择字段类型(示例如下)中选择“会计年度”单选按钮,然后选择合适的生成字段。如果他改变主意并选择“学期”,则会计年度字段将替换为学期字段,依此类推。

示例代码:

$builder    
        ->add('librarian', 'entity', array(
            'class' => 'AppBundle:Staff',
            'query_builder' => function(EntityRepository $er){
                $qb = $er->createQueryBuilder('st');
                $qb
                    ->where('st.employmentStatus = :employmentStatus')
                    ->setParameter('employmentStatus', 'faclib')
                    ->orderBy('st.lastName', 'DESC')
                    ->getQuery();
                return $qb;
            },
            'placeholder' => 'All Librarians',
            'required' => false
        ))
        ->add('program', 'entity', array(
            'class' => 'AppBundle:LiaisonSubject',
            'query_builder'=>function(EntityRepository $er){
              $qb = $er->createQueryBuilder('ls');
              $qb
                ->orderBy('ls.root, ls.lvl, ls.name', 'ASC')
                ->getQuery();
              return $qb;
            },
            'property' => 'indentedTitle',
            'placeholder' => 'All Programs',
            'required' => false,
            'label' => 'Program'
        ))
        ->add('criteriaFilter', 'choice', array(
                'expanded' => true,
                'multiple' => false,
                'choices' => array(
                    'academic' => 'Academic Year',
                    'fiscal' => 'Fiscal Year',
                    'semester' => 'Semester',
                    'custom' => 'Custom Range'
                ),
            ))
            ;

根据食谱条目,这似乎非常简单。但是,我创建的表单并未绑定到实体。因此,通过方法获取数据

$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){
            $form = $event->getForm();

            //normally the entity, but NULL in this case 
            $data = $event->getData();
...

通常允许在实体属性上调用 getter 方法返回 null。所以显然这在这种情况下是行不通的。

所以问题是,是否有另一种方法可以在不绑定到实体的表单内动态生成字段?

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案1】:

    您可以将选项传递给表单,包括数据。像这样的东西(来自记忆,但未经测试):

    // controller
    $this->createForm(SomeForm::class, null, ['fiscalYears' => [2001, 2002]);
    
    // type
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(['fiscalyears' => []);
    }
    
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $fiscalYears = $options['fiscalYears'];
    
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) use ($fiscalYears) {
            $form = $event->getForm();
    
            $form->add('fiscalYear', ChoiceType::class, [
                'choices' => $fiscalYears
            ]);
        }
    }
    

    【讨论】:

    • 这让我开始上路了。我最终制作了一个初步表格,用户基本上选择了发送到实际表格的选项。然后我在事件监听器中使用条件语句来添加我想要的字段。这可能不是最优雅的解决方案,但它已经足够好。
    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2018-03-18
    • 2015-11-01
    • 2021-11-10
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多