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;
我想要实现的目标:
<div><label for="form_amount" class="required">Amount</label>$ <input type="number" id="form_amount" name="form[amount]" required="required" /></div>
&#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的默认输入类型?我考虑扩展或修改课程以适应这种情况,但我确定我没有看到一些优势。
答案 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
有关如何覆盖字段模板的详细信息,请参阅此文档:
答案 3 :(得分:0)
我有同样的问题。当我在Money Type字段中输入一个字符串时,我有一个php&#34;数字解析失败&#34;消息。
要解决此问题,我将php.ini文件中的intl.error_level值修改为0.您也可以对该行进行注释。
不再有php错误了。如果我输入一个字符串,则错误由Symfony处理,我只是收到消息&#34;此值无效&#34;在我的输入下显示。所以不需要覆盖input type="text"
!