如何将Symfony表单MoneyType输入覆盖为type =" number"?

时间:2016-07-04 19:04:34

标签: php symfony-forms symfony currency

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>
&#13;
&#13;
&#13;

我想要实现的目标:

&#13;
&#13;
<div><label for="form_amount" class="required">Amount</label>$ <input type="number" id="form_amount" name="form[amount]" required="required"  /></div>
&#13;
&#13;
&#13;

我试图简单地覆盖属性类型,但所有这一切都是在最后添加了第二个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的默认输入类型?我考虑扩展或修改课程以适应这种情况,但我确定我没有看到一些优势。

4 个答案:

答案 0 :(得分:2)

为什么不使用&#39; scale&#39;指定小数位数,并使用&#39;占位符&#39;告诉用户格式:

->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}/')),
        ),
))

有关添加验证的信息,请参阅此链接: http://symfony.com/doc/current/book/forms.html#adding-validation

上述正则表达式指定小数点前至少1个前进位,小数点后2位数。在您的原始帖子中,您引用了“货币”,但这是一个&#39;字符串&#39;。您可以根据需要修改正则表达式。

我还没有证实这一点(我使用类似的东西),但我认为它应该有用。

答案 1 :(得分:1)

您可以自定义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

答案 2 :(得分:0)

您应该能够覆盖默认字段模板:

{%- 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 -%}

在自定义模板定义

  

应用程序/资源/视图/形式/ fields.html.twig

有关如何覆盖字段模板的详细信息,请参阅此文档:

  

http://symfony.com/doc/current/cookbook/form/form_customization.html#method-2-inside-a-separate-template

答案 3 :(得分:0)

我有同样的问题。当我在Money Type字段中输入一个字符串时,我有一个php&#34;数字解析失败&#34;消息。

要解决此问题,我将php.ini文件中的intl.error_level值修改为0.您也可以对该行进行注释。

不再有php错误了。如果我输入一个字符串,则错误由Symfony处理,我只是收到消息&#34;此值无效&#34;在我的输入下显示。所以不需要覆盖input type="text"