【问题标题】:Is there a way to add a form field depending on a condition on Symfony?有没有办法根据 Symfony 上的条件添加表单字段?
【发布时间】:2021-05-31 12:57:18
【问题描述】:

朋友。这是我在这里提出的第一个问题;因此,欢迎任何反馈。

我是 Symfony 的新手;我正在使用的版本是 3.4 我已经为我的表单实现了三个 Type 类,结构是这样的: 有一个注册表,其标题加上零、一个或多个问题。每个问题都是一个“RegistryElement”,由零个、一个或多个答案加上一个“elementScore”和一个可选的“elementComment”组成。

Type 类的 buildForm 方法如下所示:

在 RegistryType.php 上:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('registryHeaderId', RegistryHeaderType::class, array(
            'label' => false,
        ))
        ->add('registryElements', CollectionType::class, array(
            'label'=>false,
            'entry_type' => RegistryElementType::class,
            'entry_options' => [
                'label' => false,
                'tokens'=>$options['tokens'],
            ],
            'allow_add' => true,
            'by_reference' => false,
        ))
        ->add('save', SubmitType::class, array("attr"=>array(
            "class"=>"form-submit btn-success",
            "style"=>"margin:10px;"
        )))
        ;

}

在 RegistryElementType.php 上:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('registryElementAnswers', CollectionType::class, array(
            'label'=>false,
            'entry_type' => RegistryElementAnswerType::class,
            'entry_options' => [
                'label' => false,
            ],
            'allow_add' => true,
            'by_reference' => false,
        ))
        ->add('elementScore', CheckboxType::class, array(
            "label"=>'type.registry_element_type.score',
            'required' => false,
            "translation_domain" => "FirstPieceBundle",
        ))
        ->add('elementComment', TextType::class, array(
            "label"=>'type.registry_element_type.element_comment',
            "required"=>false,
            "attr"=>array(
                "class"=>"form-name form-control",
            ),
            "translation_domain" => "FirstPieceBundle",
        ))
        ;

}

而且,在 RegistryElementAnswerType.php 上:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('answer', TextType::class, array(
            "label"=>false,
            "required"=>false,
            "attr"=>array(
                "class"=>"form-name form-control",
            ),
            "translation_domain" => "FirstPieceBundle",
        ))
        ;

}

现在,我想知道是否有办法根据条件“添加不同类型的字段”。像这样的:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    if(condition){
        $builder
            ->add('answer', TextType::class, array(
                "label"=>false,
                "required"=>false,
                "attr"=>array(
                    "class"=>"form-name form-control",
                ),
                "translation_domain" => "FirstPieceBundle",
            ))
            ;
    }
    else{
        $builder
            ->add('answer', ChoiceType::class, array(
                "label"=>false,
                "required"=>false,
                "attr"=>array(
                    "class"=>"form-name form-control",
                ),
                "translation_domain" => "FirstPieceBundle",
            ))
            ;
    }

}

我试图通过 $options 数组传递一些值,但我真的被困在这里。 非常感谢您的知识和指导。

您好。

【问题讨论】:

  • 执行您询问的那种事情非常具有挑战性,特别是如果条件来自您的实体。 Form events 是您的起点。特别是 PRE_SET_DATA。和题外话,但除非你需要维护遗留项目,那么你真的应该迁移到 Symfony 5 或至少 4.4。 3.4 不再维护。
  • 如果您的条件基于数据,表单事件很有用。如果不是(或者如果你愿意处理这个有点脏),通过表单 setDefaults 设置一个新选项(可以在控制器的 createForm 中覆盖)将起作用。
  • 感谢你们两位的cmets。我将检查表单事件以尝试找到一种方法来实现我所需要的。我已经尝试过用肮脏的方式处理这个问题,但没有成功,但我只是想到了一种我还没有尝试过的新方法。题外话,感谢关于使用受支持版本的 Symfony 的建议,但是我实习的企业已经在 Symfony 3.4 中构建了所有内容,并且迁移到更新版本将是一种斗争。如果我找到解决问题的方法,我会分享它作为答案。祝你有美好的一天。

标签: php forms symfony dynamic field


【解决方案1】:

你需要在那里使用的具体条件是什么?

如果要传递$options 数组中的数据,则需要在configureOptions 方法中添加选项键作为必需选项。

假设你想在$options 中传递condition,你的RegistryElementAnswerType 类应该包含:

public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setRequired('condition');
    }

现在,每当您引用 RegistryElementAnswerType 时,您都需要传递此选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2019-06-27
    • 2023-03-24
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多