You need to enable JavaScript to run this app. Symfony 3.4 如何根据条件动态添加不同类型的表单字段
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 3.4 如何根据条件动态添加不同类型的表单字段

Symfony 3.4 条件动态表单字段实现问题

基础信息

  • 开发环境:Symfony 3.4
  • 开发者状态:Symfony新手

现有表单结构

  • 根对象为Registry登记表单,包含头部信息模块,以及0到多个RegistryElement登记项
  • 单个登记项包含0到多个答案、elementScore得分复选框、可选的elementComment备注文本框

现有表单Type实现代码

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",
        ))
        ;

}

期望实现逻辑

需要在RegistryElementAnswerType中根据传入条件动态切换answer字段类型,参考逻辑如下:

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数组传递判断条件参数时,未打通从根表单到嵌套答案表单的参数传递链路,无法实现动态字段切换。


内容的提问来源于stack exchange,提问作者KenshinApa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 21:36:03