gol*_*ife 3 php forms events symfony
我的场景如下:
如果用户从“maxRedemptionForDiscount”中选择 true 并在“maxRedemptionForDiscountValue”中输入“0”,则应该有一条错误消息呈现到特定字段(在 TextType 字段的位置)
这是带有事件监听器的形式:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'maxRedemptionForDiscount',
ChoiceType::class,
[
'placeholder' => false,
'multiple' => false,
'choices' => [
true => 'discount.form_fields.set_max_redemptions',
false => 'discount.form_fields.unlimited',
],
'label' => 'discount.form_fields.max_redemption_for_discount',
'translation_domain' => 'entities',
'required' => false,
'error_bubbling' => true,
'attr' => [
'class' => 'maxRedemptionForDiscountSelect',
],
]
)->add(
'maxRedemptionForDiscountValue',
TextType::class,
[
'label' => 'discount.form_fields.set_max_redemptions',
'translation_domain' => 'entities',
'required' => false,
]
)->addEventListener(
FormEvents::PRE_SUBMIT,
[$this, 'onPreSubmit']
);
}
Run Code Online (Sandbox Code Playgroud)
这是 onPreSubmit 函数:
/**
* @param FormEvent $event
*/
public function onPreSubmit(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if ($data['maxRedemptionForDiscount'] == 1) {
if ($data['maxRedemptionForDiscountValue'] == 0) {
$form->addError(new FormError('error message'));
}
}
$event->setData($data);
}
Run Code Online (Sandbox Code Playgroud)
这是树枝代码:
{{ form_row(form.maxRedemptionForDiscount) }}
<div id="maxRedemptionForDiscountValue">
{{ form_row(form.maxRedemptionForDiscountValue) }}
</div>
Run Code Online (Sandbox Code Playgroud)
这会在表单上方呈现一条错误消息。但我希望我向特定字段呈现错误消息。
这不起作用:
$form->get('maxRedemptionForDiscountValue')->addError(new FormError('error message'));
Run Code Online (Sandbox Code Playgroud)
如果我尝试这样做,错误消息将在表单顶部消失,但不会显示在特定字段位置。
我在这里做错了什么?
首先,您应该设置error_bubbling
为false
(或将其删除,因为它是默认行为)。
正如文档所述
如果为 true,则此字段的任何错误都将传递到父字段或表单。例如,如果在普通字段上设置为 true,则该字段的任何错误都将附加到主表单,而不是特定字段。
特别适用于ChoiceType
设置该字段上的错误必须附加到该字段而不是父字段(大多数情况下是表单)。
其次,您应该将错误添加到特定的表单字段
$form
->get('maxRedemptionForDiscountValue')
->addError(new FormError('error message'));
Run Code Online (Sandbox Code Playgroud)
第三,您应该编辑您的模板
<div id="maxRedemptionForDiscountValue">
{{ form_errors(form.maxRedemptionForDiscountValue) }}
{{ form_row(form.maxRedemptionForDiscountValue) }}
</div>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8036 次 |
最近记录: |