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
相关产品推荐
相关产品推荐

