Sonata admin PRE_SUBMIT 表单事件使 admin twig 变量为空
Sonata admin PRE_SUBMIT form event makes admin twig variable null
我在管理员 class 中遇到表单事件问题。
我在自定义实体中动态添加了选项 type.Choices 由 javascript 通过 controller.To 添加到数据库能够验证这些动态选项(在呈现表单后添加),我添加了在提交表单之前,将 PRE_SUBMIT 表单事件发送到管理员 class.So 中的字段 我从数据库中加载新的选择列表,然后删除该字段并将其添加回表单以更新其选项,如此处所示https://gist.github.com/webdevilopers/fef9e296e77bb879d138
在表单类型的树枝模板中,我使用 sonata_admin.admin 变量来获取所需的数据。
问题是当表单中存在错误时(在表单中任何其他字段上),sonata_admin.admin 变量表单 twig 模板为空。
感谢帮助
admin::configureFormFields()
$class = 'LibrinfoVarietiesBundle:SelectChoice';
$repo = $this->getConfigurationPool()->getContainer()->get('doctrine.orm.entity_manager')->getRepository($class);
$admin = $this;
$formBuilder = $formMapper->getFormBuilder();
$formBuilder->addEventListener(FormEvents::SUBMIT, function ($event) use ($formBuilder, $admin, $repo, $class) {
$form = $event->getForm();
$subject = $admin->getSubject($event->getData());
$label = 'librinfo_varieties_admin_variety_regulatory_status_librinfo_core_customchoice';
$choices = $repo->findBy(array(
'label' => $label
));
$choiceViews = array();
foreach ($choices as $choice)
{
$choiceViews[$choice->getvalue()] = $choice;
}
if ($form->has('regulatory_status'))
{
$form->remove('regulatory_status');
}
$customChoice = $formBuilder->getFormFactory()->createNamed('regulatory_status', 'librinfo_customchoice', null, array(
'choices' => $choices,
'class' => $class,
'auto_initialize' => false,
));
$form->add($customChoice);
});
表单类型 ConfigureOptions()
$label = 'librinfo_varieties_admin_variety_regulatory_status_librinfo_core_customchoice';
$choices = $this->repo->findBy(array(
'label' => $label
));
$choiceViews = array();
foreach ($choices as $choice)
{
$choiceViews[$choice->getvalue()] = $choice;
}
$resolver->setDefaults(array(
'choice_label' => 'value',
'class' => 'LibrinfoVarietiesBundle:SelectChoice',
'placeholder' => '',
'choices' => $choiceViews,
));
树枝方块
{% block librinfo_customchoice_widget %}
{% set subject = sonata_admin.admin.subject %}
{% spaceless %}
{{ block('choice_widget') }}
{% if subject.fieldset is defined %}
<a id="{{ subject.fieldset }}_{{ subject.field }}" class="add-choice editable editable-click inline-input" href="#"><i class="fa fa-plus-circle"></i></a>
{% else %}
<a id="{{ block_prefixes.4 }}" class="add-choice editable editable-click inline-input" href="#"><i class="fa fa-plus-circle"></i></a>
{% endif %}
{% endspaceless %}
{% endblock %}
这是因为通过事件直接向表单对象添加字段时,不会调用 Sonata FormTypeFieldExtension
。
但我找到了解决方法,您必须先使用 FormMapper 添加字段。这将设置奏鸣曲管理选项。
然后,在您的事件回调中,取回该字段的当前选项并将它们与您自己的选项合并:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('date', null, [
'widget' => 'single_text',
])
->add('method', EnumType::class, [
'class' => PaymentMethod::class,
'translation_domain' => 'global',
'prefix_label_with_class' => true,
'attr' => [
'class' => 'payment-method',
],
])
->add('reference', TextType::class, [
'required' => false,
'attr' => [
'class' => 'payment-reference',
]
])
->add('amount')
;
$builder = $formMapper->getFormBuilder();
$factory = $builder->getFormFactory();
$referenceTypeMaker = function (FormEvent $event) use ($factory) {
$form = $event->getForm();
$data = $event->getData();
$paymentMethod = $data instanceof Payment ? $data->getMethod() : $data['method'];
if (PaymentMethod::CREDIT_NOTE === $paymentMethod) {
$form->add($factory->createNamed('reference', CreditNoteRefType::class, null, array_merge(
$form->get('reference')->getConfig()->getOptions(), // Put back original options here.
[
'auto_initialize' => false
]
)));
}
};
$builder->addEventListener(FormEvents::PRE_SET_DATA, $referenceTypeMaker);
$builder->addEventListener(FormEvents::PRE_SUBMIT, $referenceTypeMaker);
}
如您在我的代码示例中所见,reference
字段是 TextType
,但也可以是 CreditNoteRefType
,具体取决于付款方式选择。
将已定义的字段选项放回新字段选项即可解决问题。
我在管理员 class 中遇到表单事件问题。 我在自定义实体中动态添加了选项 type.Choices 由 javascript 通过 controller.To 添加到数据库能够验证这些动态选项(在呈现表单后添加),我添加了在提交表单之前,将 PRE_SUBMIT 表单事件发送到管理员 class.So 中的字段 我从数据库中加载新的选择列表,然后删除该字段并将其添加回表单以更新其选项,如此处所示https://gist.github.com/webdevilopers/fef9e296e77bb879d138
在表单类型的树枝模板中,我使用 sonata_admin.admin 变量来获取所需的数据。 问题是当表单中存在错误时(在表单中任何其他字段上),sonata_admin.admin 变量表单 twig 模板为空。
感谢帮助
admin::configureFormFields()
$class = 'LibrinfoVarietiesBundle:SelectChoice';
$repo = $this->getConfigurationPool()->getContainer()->get('doctrine.orm.entity_manager')->getRepository($class);
$admin = $this;
$formBuilder = $formMapper->getFormBuilder();
$formBuilder->addEventListener(FormEvents::SUBMIT, function ($event) use ($formBuilder, $admin, $repo, $class) {
$form = $event->getForm();
$subject = $admin->getSubject($event->getData());
$label = 'librinfo_varieties_admin_variety_regulatory_status_librinfo_core_customchoice';
$choices = $repo->findBy(array(
'label' => $label
));
$choiceViews = array();
foreach ($choices as $choice)
{
$choiceViews[$choice->getvalue()] = $choice;
}
if ($form->has('regulatory_status'))
{
$form->remove('regulatory_status');
}
$customChoice = $formBuilder->getFormFactory()->createNamed('regulatory_status', 'librinfo_customchoice', null, array(
'choices' => $choices,
'class' => $class,
'auto_initialize' => false,
));
$form->add($customChoice);
});
表单类型 ConfigureOptions()
$label = 'librinfo_varieties_admin_variety_regulatory_status_librinfo_core_customchoice';
$choices = $this->repo->findBy(array(
'label' => $label
));
$choiceViews = array();
foreach ($choices as $choice)
{
$choiceViews[$choice->getvalue()] = $choice;
}
$resolver->setDefaults(array(
'choice_label' => 'value',
'class' => 'LibrinfoVarietiesBundle:SelectChoice',
'placeholder' => '',
'choices' => $choiceViews,
));
树枝方块
{% block librinfo_customchoice_widget %}
{% set subject = sonata_admin.admin.subject %}
{% spaceless %}
{{ block('choice_widget') }}
{% if subject.fieldset is defined %}
<a id="{{ subject.fieldset }}_{{ subject.field }}" class="add-choice editable editable-click inline-input" href="#"><i class="fa fa-plus-circle"></i></a>
{% else %}
<a id="{{ block_prefixes.4 }}" class="add-choice editable editable-click inline-input" href="#"><i class="fa fa-plus-circle"></i></a>
{% endif %}
{% endspaceless %}
{% endblock %}
这是因为通过事件直接向表单对象添加字段时,不会调用 Sonata FormTypeFieldExtension
。
但我找到了解决方法,您必须先使用 FormMapper 添加字段。这将设置奏鸣曲管理选项。
然后,在您的事件回调中,取回该字段的当前选项并将它们与您自己的选项合并:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('date', null, [
'widget' => 'single_text',
])
->add('method', EnumType::class, [
'class' => PaymentMethod::class,
'translation_domain' => 'global',
'prefix_label_with_class' => true,
'attr' => [
'class' => 'payment-method',
],
])
->add('reference', TextType::class, [
'required' => false,
'attr' => [
'class' => 'payment-reference',
]
])
->add('amount')
;
$builder = $formMapper->getFormBuilder();
$factory = $builder->getFormFactory();
$referenceTypeMaker = function (FormEvent $event) use ($factory) {
$form = $event->getForm();
$data = $event->getData();
$paymentMethod = $data instanceof Payment ? $data->getMethod() : $data['method'];
if (PaymentMethod::CREDIT_NOTE === $paymentMethod) {
$form->add($factory->createNamed('reference', CreditNoteRefType::class, null, array_merge(
$form->get('reference')->getConfig()->getOptions(), // Put back original options here.
[
'auto_initialize' => false
]
)));
}
};
$builder->addEventListener(FormEvents::PRE_SET_DATA, $referenceTypeMaker);
$builder->addEventListener(FormEvents::PRE_SUBMIT, $referenceTypeMaker);
}
如您在我的代码示例中所见,reference
字段是 TextType
,但也可以是 CreditNoteRefType
,具体取决于付款方式选择。
将已定义的字段选项放回新字段选项即可解决问题。