在 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 提交的选择接受选择/实体/文档类型。 此时,如您所见,我选择只采用几个已解决的选项,但我对此解决方案并不满意。
听起来你需要改变你的方法。
也许制作一个自定义表单类型,其中的一些选项应该是创建原始类型的选项,类似于
CollectionType
的工作方式。
也许看起来有点像这样:
->add('entity', AjaxType::class,array(
'ajax_type' => EntityType:class,
'ajax_options' => [
'class' => 'AppBundle:User',
'choice_label' => 'username',
]
))
该类型可以添加监听数据并决定做什么的事件。