2012-05-20 3 views
25

Ho appena iniziato a utilizzare Twig e sto provando a creare un modulo di registrazione. Per aggiungere una password/reinserire il campo password uso il tipo di file "ripetuto":Rendering personalizzato di un campo "ripetuto" da Symfony 2 in Twig

->add('password', 'repeated', array(
    'type' => 'password', 
    'invalid_message' => 'Passwords have to be equal.', 
    'first_name'  => 'Password', 
    'second_name'  => 'Re-enter password', 
)); 

che funziona come previsto. Il problema è che voglio aggiungere alcune classi personalizzate ecc. Al mio modulo. Così il mio modello assomiglia a questo:

<form action="{{ path('register') }}" method="post" {{ form_enctype(form) }}> 
    {{ form_errors(form) }} 
    {{ form_errors(form.username) }} 
    <div class="form-field"> 
     {{ form_label(form.username, null, { 'attr': {'class': 'form-label'} }) }} 
     {{ form_widget(form.username, { 'attr': {'class': 'form-input'} }) }} 
    </div> 
    {{ form_errors(form.email) }} 
    <div class="form-field"> 
     {{ form_label(form.email, null, { 'attr': {'class': 'form-label'} }) }} 
     {{ form_widget(form.email, { 'attr': {'class': 'form-input'} }) }} 
    </div> 
    {{ form_errors(form.password) }} 
    <div class="form-field"> 
     {{ form_label(form.password, null, { 'attr': {'class': 'form-label'} }) }} 
     {{ form_widget(form.password, { 'attr': {'class': 'form-input'} }) }} 
    </div> 

    {{ form_rest(form) }} 

    <input type="submit" class="contact-submit" /> 
</form> 

questo funziona bene per tutto tranne che per la parte password. Voglio rendere entrambi i campi separatamente lì, ora sono entrambi resi nello stesso div.

Come posso risolvere questo problema? C'è un modo per selezionare i campi separati in Twig? O sto solo facendo qualcosa di sbagliato perché ho riscontrato questo problema in primo luogo.

+0

Ecco la risposta alla domanda (utilizzando Symfony 2.2): http: // stackoverflow.it/a/16119798/2056878 – Sherlock

+0

Ecco la risposta che stai cercando (utilizzando Symfony 2.2): http://stackoverflow.com/a/16119798/2056878 – Sherlock

risposta

51

Dopo un'ipotesi casuale ho risolto il mio problema. Vi posto qui così altri che potrebbero venire a questa domanda cercando conoscono anche la risposta:

{% for passwordField in form.password %} 
    <div class="form-field"> 
     {{ form_label(passwordField, null, { 'attr': {'class': 'form-label'} }) }} 
     {{ form_widget(passwordField, { 'attr': {'class': 'form-input'} }) }} 
    </div> 
{% endfor %} 
+4

Fantastico. Grazie per essere tornato e aver risposto alla tua stessa domanda! – Nick

0

Se si desidera avere classi ampia applicazione per le etichette e gli ingressi, è possibile personalizzare la modalità di etichette e widget sono reso. Controllare http://symfony.com/doc/current/cookbook/form/form_customization.html

Se si guarda a questo file:

vendor/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig 

si possono vedere i valori di default per tutti i widget. Per raggiungere in particolare quello che vi serve, si potrebbe sovrascrivere blocco generic_label aggiungere classe form-label:

{% block generic_label %} 
{% spaceless %} 
    {% if required %} 
     {# We add form-label class in the next line! #} 
     {% set attr = attr|merge({'class': attr.class|default('') ~ ' required form-label'}) %} 
    {% endif %} 
    <label{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>{{ label|trans }}</label> 
{% endspaceless %} 
{% endblock %} 

E widget_attributes blocco per aggiungere classe form-input:

{% block widget_attributes %} 
{% spaceless %} 
    {# We add form-input class in the next line! #} 
    {% set attr = attr|merge({'class': attr.class|default('') ~ ' form-input'}) %} 
    id="{{ id }}" name="{{ full_name }}"{% if read_only %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %} 
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %} 
{% endspaceless %} 
{% endblock widget_attributes %} 

Con questi due modelli di tutti i tuoi ingressi dovresti renderizzare con le classi di cui hai bisogno, senza dover ripetere i parametri "attr" su tutti i tuoi moduli.

Non l'ho provato, ma questo dovrebbe risolvere il problema del campo ripetuto. Anche se così non fosse, è possibile creare un modello repeat_widget e/o repeat_row per personalizzare il rendering del widget ripetuto, fissando in tal modo il widget per tutti i moduli che lo utilizzano.

22

Se si vuole separare sia del campo password da un metodo ripetuto nel modello ramoscello è sufficiente richiamare i rispettivi nomi come:

{{ form_label(form.password.pass, "Password :") }} 
{{ form_widget(form.password.pass) }} 

{{ form_label(form.password.confirm, "Confirm :") }} 
{{ form_widget(form.password.confirm) }} 

E, naturalmente, nella funzione:

/.. 
->add('password', 'repeated', array(
'first_name' => 'pass', 
'second_name' => 'confirm', 
'type' => 'password' 
)) 

Saluti.

18

questo funziona per me:

.... 
{{ form_errors(form.password.first) }} 
<div class="form-field"> 
    {{ form_label(form.password.first, null, { 'attr': {'class': 'form-label'} }) }} 
    {{ form_widget(form.password.first, { 'attr': {'class': 'form-input'} }) }} 
</div> 

{{ form_errors(form.password.second) }} 
<div class="form-field"> 
    {{ form_label(form.password.second, null, { 'attr': {'class': 'form-label'} }) }} 
    {{ form_widget(form.password.second, { 'attr': {'class': 'form-input'} }) }} 
</div> 
.... 
3

Se si utilizza Utenti Bundle usano il password.first e password.second, meglio ancora provare a utilizzare il vostro profiler per vedere quali variabili deriva dal panorama e controllori;)