2016-07-04 26 views
4

Die Symfony MoneyType Field rendert als input type="text", die einem Benutzer ermöglicht, einzugeben, was sie in das Feld möchten.So überschreiben Symfony-Formular MoneyType-Eingabe als Typ = "Nummer"?

Wie kann ich dies überschreiben, um als input type="number" zu rendern, so dass Benutzer nur numerische Zeichen eingeben können?

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

Stromausgang:

<div><label for="form_amount" class="required">Amount</label>$ <input type="text" id="form_amount" name="form[amount]" required="required" /></div>

Was ich zu erreichen versuchen:

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

Ich habe versucht, den Attributtyp einfach zu überschreiben, aber all dies tat ein zweites type Attribut am Ende hinzufügen, die nicht funktionierte, weil es offensichtlich HTML ungültig ist.

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

Hier ist mein einfacher Zweig:

{{ form_start(form) }} 

    {{ form_widget(form) }} 

    <input type="submit" /> 

{{ form_end(form) }} 

ich auch neugierig bin, warum ist dies der Standardeingabetyp für Geld? Ich überlege, die Klasse zu erweitern oder zu modifizieren, um dies zu berücksichtigen, aber ich bin mir sicher, dass es einen Vorteil gibt, den ich nicht sehe.

Antwort

0

Sie sollten in der Lage sein, die Standardfeldvorlage außer Kraft zu setzen:

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

von

{%- block money_widget -%} 
    <!-- set your custom html input here --> 
{%- endblock money_widget -%} 

In einer benutzerdefinierten Vorlage Definition

app/Ressourcen/Ansichten/form/Felder .html.twig

Weitere Informationen darüber, wie Felder Vorlagen außer Kraft zu setzen finden Sie in diesem Dokument:

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

2

Warum nicht ‚scale‘ verwenden, um die Anzahl der Dezimalstellen angeben, und verwenden Sie auch ‚Platzhalter‘ zu sagen, der Benutzer das Format:

->add('amount', MoneyType::class, array(
     'label' => 'Enter Amount:', 
     'scale' => 2, 
     'attr' => array(
       'placeholder' => 'x.xx', 
     ), 
)) 

ich bin mir nicht sicher, ob dies hilfreich ist oder nicht.

Bearbeiten # 2. Nach Feedback bekommen, ich denke, dies sollte für Sie arbeitet:

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

diesen Link für Informationen Siehe zum Hinzufügen von Validierung: http://symfony.com/doc/current/book/forms.html#adding-validation

Der obige reguläre Ausdruck gibt mindestens 1 Verfahren Ziffer vor dem Komma, und 2 Stellen nach der Dezimalstelle. In Ihrem ursprünglichen Beitrag haben Sie von "Währung" gesprochen, aber das ist eine "Zeichenfolge". Sie können den regulären Ausdruck basierend auf Ihren Anforderungen ändern.

Ich habe dies nicht verifiziert (ich benutze etwas ähnliches), aber ich denke, es sollte funktionieren.

+0

Danke für die Antwort, aber immer noch erlaubt Leute statt nur numerische diejenigen Buchstaben einzutippen. –

+0

Hallo, können Sie das Format der Eingabe angeben, die Sie benötigen? Dann kann ich dir eine viel bessere Antwort geben. Zum Beispiel das Format d.dd, wobei 'd' ein Dezimalwert ist. –

+0

Zwei Dezimalstellen ist großartig, das ist die Standardeinstellung. Ich merke bei der Einreichung, wenn es eine gültige Zahl ist, dann schneidet es auf zwei Dezimalstellen, was in Ordnung ist. –

0

Ich hatte das gleiche Problem. Als ich eine Zeichenfolge in einem Money Type-Feld eingegeben habe, hatte ich eine PHP-Nummer "Nummer Parsing fehlgeschlagen" Nachricht.

Um dies zu lösen, habe ich den Wert intl.error_level in meiner php.ini-Datei auf 0 geändert. Sie können die Zeile auch kommentieren.

Kein PHP-Fehler mehr. Wenn ich eine Zeichenkette gebe, wird der Fehler von Symfony behandelt und ich bekomme nur die Meldung "Dieser Wert ist nicht gültig" unter meiner Eingabe angezeigt. Also keine Notwendigkeit, die input type="text" zu überschreiben!