symfony-forms – 在FormEvent中获取FormField传递的选项

在Symfony项目中,我有一个Form EventSubscriber,可以使用多种形式.

它旨在禁用已填充的每个字段.

在我使用的订阅服务器中:

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

我收到一个孩子的所有已解决的选项,我想只获得在表单构建期间传递的选项. (因为形成一些FormTypes(i.o. 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提交的选择/实体/文档类型的选择接受者的表格订阅者.
在这个时候,正如你所看到的,我选择了只有几个已经解决的选项,但我对这个解决方案并不满意.

最佳答案 听起来你需要改变你的方法.

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

也许它看起来有点像这样:

– > add(‘entity’,AjaxType :: class,array(
     ‘ajax_type’=>的EntityType:类,
     ‘ajax_options’=> [
         ‘class’=> ‘的appbundle:用户’,
         ‘choice_label’=> ‘用户名’,
     ]
))

该类型可以添加侦听数据的事件并决定要执行的操作.

点赞