获取 FormField 在 FormEvent 中传递的选项

问题描述 投票:0回答:1

在 Symfony 项目中,我有一个作用于多个表单的 Form EventSubscriber。

它的目的是禁用已填充的每个字段。

在订阅者中,当我使用:

$childOptions = $child->getConfig()->getOptions();

我收到了孩子的所有已解决选项,我只想获取在表单构建期间通过的选项。 (因为从某些 FormType(即 DocumentType)中不可能重新注入所有已解析的选项,其中一些选项会引起麻烦)。

  • FormType 示例:

    class FooType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('entity',EntityType::class,array( 
                            'class' => 'AppBundle:User',
                            'choice_label' => 'username',
                    ))
                ->addEventSubscriber($this->changesSubscriber); // See next class
        }
    }
    
  • 订阅者:

    class ChangesSubscriber implements EventSubscriberInterface
    {
        // Disables filled inputs
        public function postSetData(FormEvent $event)
        {
            $form = $event->getForm();
    
            foreach($form->all() as $child)
            {
                $childName = $child->getName();
                $childType = $child->getConfig()->getType()->getName();
    
                // Here I receive all resolved options
                // But I only want the options passed above during 'buildForm' ('class','choice_label') :
                $childOptions = $child->getConfig()->getOptions(); 
    
                if(!$child->isEmpty()){
                    $form->add($childName,$childType,array_merge($childOptions,array('disabled'=>true)));
                }
            }
        }
    }
    

这是许多用例的一个示例,另一个示例可能是: Alsatian\FormBundle ExtensibleSubscriber

-> 表单订阅者,用于使 AJAX 提交的选择接受选择/实体/文档类型。 此时,如您所见,我选择只采用几个已解决的选项,但我对此解决方案并不满意。

php symfony symfony-forms
1个回答
1
投票

听起来你需要改变你的方法。

也许制作一个自定义表单类型,其中的一些选项应该是创建原始类型的选项,类似于

CollectionType
的工作方式。

也许看起来有点像这样:


->add('entity', AjaxType::class,array(
     'ajax_type' => EntityType:class,
     'ajax_options' => [
         'class' => 'AppBundle:User',
         'choice_label' => 'username',
     ]
))

该类型可以添加监听数据并决定做什么的事件。

© www.soinside.com 2019 - 2024. All rights reserved.