Как переопределить Symfony форму ввода MoneyType как type = "number"?

Поле Symfony MoneyType отображается как input type="text" который позволяет пользователю вводить все, что захочет, в поле.

Как я могу переопределить это для рендеринга в качестве input type="number" чтобы пользователи могли вводить только числовые символы?

 $formBuilder->add("amount", MoneyType::class, [ 'currency' => 'USD' ]); 

Токовый выход:

То, что я пытаюсь достичь:

 <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) }} 

Мне также интересно, почему это тип ввода по умолчанию для денег? Я рассматриваю возможность расширения или модификации класса, чтобы это учесть, но я уверен, что есть некоторые преимущества, которых я не вижу.

Вы можете настроить способ рендеринга 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

Почему бы не использовать «масштаб», чтобы указать количество знаков после запятой, а также использовать «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 цифры после десятичного знака. В вашем исходном сообщении вы ссылались на «валюту», но это «строка». Вы можете изменить регулярное выражение на основе ваших потребностей.

Я не проверял это (я использую нечто подобное), но я думаю, что он должен работать.

Вы должны переопределить шаблон поля по умолчанию:

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

Я была такая же проблема. Когда я ввожу строку в поле «Тип денег», у меня возникло сбой php «разбор номера».

Чтобы решить эту проблему, я изменил значение intl.error_level в файле php.ini равным 0. Вы также можете прокомментировать строку.

Нет ошибки php. Если я введу строку, ошибка обрабатывается Symfony, и я просто получаю сообщение «Это значение недействительно», отображаемое под моим вводом. Поэтому нет необходимости переопределять input type="text" !