如何将 Symfony 形式的 MoneyType 输入覆盖为 type="number"?
How to override Symfony form MoneyType input as type="number"?
Symfony MoneyType Field 呈现为 input type="text"
,允许用户在字段中键入他们想要的任何内容。
如何覆盖它以呈现为 input type="number"
,以便用户只能输入数字字符?
$formBuilder->add("amount", MoneyType::class, [
'currency' => 'USD'
]);
当前输出:
<div><label for="form_amount" class="required">Amount</label>$ <input type="text" id="form_amount" name="form[amount]" required="required" /></div>
我想要达到的目标:
<div><label for="form_amount" class="required">Amount</label>$ <input type="number" id="form_amount" name="form[amount]" required="required" /></div>
我试图简单地覆盖属性类型,但这所做的只是在末尾添加第二个 type
属性,这没有用,因为它显然是无效的 HTML.
$formBuilder->add("amount", MoneyType::class, [
'attr' => [
'type' => 'number',
],
'currency' => 'USD'
]);
这是我的简单树枝:
{{ form_start(form) }}
{{ form_widget(form) }}
<input type="submit" />
{{ form_end(form) }}
我也很好奇,为什么这是 Money 的默认输入类型?我正在考虑扩展或修改 class 以适应这种情况,但我肯定有一些我没有看到的优势。
您应该能够覆盖默认字段模板:
{%- block form_widget_simple -%}
{%- set type = type|default('text') -%}
<input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
{%- endblock form_widget_simple -%}
.... other templates ....
{%- block money_widget -%}
{{ money_pattern|replace({ '{{ widget }}': block('form_widget_simple') })|raw }}
{%- endblock money_widget -%}
来自
{%- block money_widget -%}
<!-- set your custom html input here -->
{%- endblock money_widget -%}
在自定义模板定义中
app/Resources/views/form/fields.html.twig
有关如何覆盖字段模板的更多信息,请参阅此文档:
为什么不用'scale'指定小数位数,还要用'placeholder'告诉用户格式:
->add('amount', MoneyType::class, array(
'label' => 'Enter Amount:',
'scale' => 2,
'attr' => array(
'placeholder' => 'x.xx',
),
))
我不确定这是否有帮助。
编辑#2。
收到反馈后,我认为这对您有用:
use Symfony\Component\Validator\Constraints\Regex;
...
->add('amount', MoneyType::class, array(
'label' => 'Enter Amount:',
'scale' => 2,
'attr' => array(
'placeholder' => 'x.xx',
),
'constraints' => array(
new Regex( array( 'pattern' => '/[0-9]{1,}\.[0-9]{2}/')),
),
))
有关添加验证的信息,请参阅此 link:
http://symfony.com/doc/current/book/forms.html#adding-validation
上述正则表达式至少指定小数点前1位,小数点后2位。在您原来的 post 中,您提到了 'currency',但那是 'string'。您可以根据需要修改正则表达式。
我还没有验证这个(我用的是类似的东西),但我认为它应该可以。
我遇到了同样的问题。当我在 Money Type 字段中输入字符串时,我收到 php "number parsing failed" 消息。
为了解决这个问题,我将 php.ini 文件中的 intl.error_level 值修改为 0。您也可以注释该行。
没有 php 错误了。如果我输入一个字符串,错误由 Symfony 处理,我只会在我的输入下显示消息 "This value is not valid"。所以不需要覆盖 input type="text"
!
您可以自定义 MoneyType 的呈现方式。
{% extends 'form_div_layout.html.twig' %}
{% block money_widget %}
{%- set type = type|default('number') -%}
{{ parent() }}
{% endblock %}
来源:
http://symfony.com/doc/current/form/form_customization.html#method-2-inside-a-separate-template
https://github.com/symfony/symfony/issues/22937#issuecomment-304609466
Symfony MoneyType Field 呈现为 input type="text"
,允许用户在字段中键入他们想要的任何内容。
如何覆盖它以呈现为 input type="number"
,以便用户只能输入数字字符?
$formBuilder->add("amount", MoneyType::class, [
'currency' => 'USD'
]);
当前输出:
<div><label for="form_amount" class="required">Amount</label>$ <input type="text" id="form_amount" name="form[amount]" required="required" /></div>
我想要达到的目标:
<div><label for="form_amount" class="required">Amount</label>$ <input type="number" id="form_amount" name="form[amount]" required="required" /></div>
我试图简单地覆盖属性类型,但这所做的只是在末尾添加第二个 type
属性,这没有用,因为它显然是无效的 HTML.
$formBuilder->add("amount", MoneyType::class, [
'attr' => [
'type' => 'number',
],
'currency' => 'USD'
]);
这是我的简单树枝:
{{ form_start(form) }}
{{ form_widget(form) }}
<input type="submit" />
{{ form_end(form) }}
我也很好奇,为什么这是 Money 的默认输入类型?我正在考虑扩展或修改 class 以适应这种情况,但我肯定有一些我没有看到的优势。
您应该能够覆盖默认字段模板:
{%- block form_widget_simple -%}
{%- set type = type|default('text') -%}
<input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
{%- endblock form_widget_simple -%}
.... other templates ....
{%- block money_widget -%}
{{ money_pattern|replace({ '{{ widget }}': block('form_widget_simple') })|raw }}
{%- endblock money_widget -%}
来自
{%- block money_widget -%}
<!-- set your custom html input here -->
{%- endblock money_widget -%}
在自定义模板定义中
app/Resources/views/form/fields.html.twig
有关如何覆盖字段模板的更多信息,请参阅此文档:
为什么不用'scale'指定小数位数,还要用'placeholder'告诉用户格式:
->add('amount', MoneyType::class, array(
'label' => 'Enter Amount:',
'scale' => 2,
'attr' => array(
'placeholder' => 'x.xx',
),
))
我不确定这是否有帮助。
编辑#2。 收到反馈后,我认为这对您有用:
use Symfony\Component\Validator\Constraints\Regex;
...
->add('amount', MoneyType::class, array(
'label' => 'Enter Amount:',
'scale' => 2,
'attr' => array(
'placeholder' => 'x.xx',
),
'constraints' => array(
new Regex( array( 'pattern' => '/[0-9]{1,}\.[0-9]{2}/')),
),
))
有关添加验证的信息,请参阅此 link: http://symfony.com/doc/current/book/forms.html#adding-validation
上述正则表达式至少指定小数点前1位,小数点后2位。在您原来的 post 中,您提到了 'currency',但那是 'string'。您可以根据需要修改正则表达式。
我还没有验证这个(我用的是类似的东西),但我认为它应该可以。
我遇到了同样的问题。当我在 Money Type 字段中输入字符串时,我收到 php "number parsing failed" 消息。
为了解决这个问题,我将 php.ini 文件中的 intl.error_level 值修改为 0。您也可以注释该行。
没有 php 错误了。如果我输入一个字符串,错误由 Symfony 处理,我只会在我的输入下显示消息 "This value is not valid"。所以不需要覆盖 input type="text"
!
您可以自定义 MoneyType 的呈现方式。
{% extends 'form_div_layout.html.twig' %}
{% block money_widget %}
{%- set type = type|default('number') -%}
{{ parent() }}
{% endblock %}
来源:
http://symfony.com/doc/current/form/form_customization.html#method-2-inside-a-separate-template https://github.com/symfony/symfony/issues/22937#issuecomment-304609466