php 如何覆盖Symfony表单MoneyType输入为type=“number”?

mccptt67  于 2023-05-12  发布在  PHP
关注(0)|答案(5)|浏览(122)

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的默认输入类型?* 我正在考虑扩展或修改类以适应这一点,但我确信有一些优势我没有看到。

f5emj3cl

f5emj3cl1#

为什么不使用'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}/')),
        ),
))

有关添加验证的信息,请参阅此链接:http://symfony.com/doc/current/book/forms.html#adding-validation
上面的正则表达式指定小数点前至少有1位数字,小数点后至少有2位数字。在你最初的帖子中,你提到了“货币”,但那是一个“字符串”。您可以根据需要修改正则表达式。
我还没有验证这一点(我使用类似的东西),但我认为它应该工作。

mbjcgjjk

mbjcgjjk2#

您可以自定义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-templatehttps://github.com/symfony/symfony/issues/22937#issuecomment-304609466

9rnv2umw

9rnv2umw3#

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

{%- 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
有关如何覆盖字段模板的详细信息,请参阅此文档:
http://symfony.com/doc/current/cookbook/form/form_customization.html#method-2-inside-a-separate-template

yhxst69z

yhxst69z4#

我也有同样的问题。当我在Money Type字段中输入一个字符串时,我收到一条php“number parsing failed”消息。
为了解决这个问题,我修改了我的php.ini文件中的intl.error_level值为0。您也可以对该行进行注解。
PHP不再出错如果我输入一个字符串,错误是由Symfony处理的,我只是在我的输入下显示消息“此值无效”。所以不需要覆盖input type="text"

o7jaxewo

o7jaxewo5#

有同样的问题。您可以通过将“html5”选项设置为true并将“step”属性传递给值为“.01”的“attr”选项以允许浮点数来覆盖MoneyType字段作为字符串的默认呈现。
下面是如何执行此操作的示例:

$builder->add('amount', MoneyType::class, [
    'label' => 'Amount',
    'scale' => 2,
    'html5' => true,
    'attr' => [
        'step' => '.01',
    ],
]);

通过浏览MoneyType,你可以看到“html5”选项在做什么:

public function buildView(FormView $view, FormInterface $form, array $options)
{
    $view->vars['money_pattern'] = self::getPattern($options['currency']);

    if ($options['html5']) {
       $view->vars['type'] = 'number';
    }
}

我希望它有帮助!

相关问题