2012-05-20 22 views
25

Acabo de empezar a usar Twig y estoy intentando crear un formulario de registro. Para añadir un campo de contraseña contraseña/volver a entrar en uso el "repetida" filetype:Representación personalizada de un campo "repetido" de Symfony 2 en Twig

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

que funciona según lo previsto. Sin embargo, el problema que tengo es que quiero agregar algunas clases personalizadas, etc. a mi formulario. Así que mi plantilla se ve así:

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

esto funciona bien para todo excepto para la parte de la contraseña. Quiero mostrar ambos campos por separado, ahora solo se representan en el mismo div.

¿Cómo puedo solucionar esto? ¿Hay alguna manera de seleccionar los campos separados en Twig? O simplemente estoy haciendo algo mal porque encuentro este problema en primer lugar.

+0

Aquí está la respuesta a su pregunta (usando Symfony 2.2): http: // stackoverflow.com/a/16119798/2056878 – Sherlock

+0

Aquí está la respuesta que está buscando (usando Symfony 2.2): http://stackoverflow.com/a/16119798/2056878 – Sherlock

Respuesta

51

Después de una conjetura al azar resolví mi propio problema. Voy a publicar aquí como otros que puedan venir a esta pregunta mediante la búsqueda también saben la respuesta:

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

Fantástico. ¡Gracias por regresar y responder tu propia pregunta! – Nick

0

Si usted quiere tener aplicaciones amplias clases para las etiquetas y los insumos, se puede personalizar la forma de las etiquetas y componentes son prestado Compruebe http://symfony.com/doc/current/cookbook/form/form_customization.html

Si nos fijamos en este archivo:

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

se puede ver los valores por defecto para todos los widgets. Para lograr específicamente lo que usted necesita, usted podría invalidar el bloque generic_label añadir clase de formulario de etiqueta:

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

Y widget_attributes bloque para agregar clase de formulario de entrada de:

{% 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 estas dos plantillas de todas las entradas debe renderizar con las clases que necesita, sin tener que repetir los parámetros 'attr' en todos sus formularios.

No lo he probado, pero esto debería resolver el problema repetido del campo. Incluso si no fuera así, podría crear una plantilla repeat_widget y/o repeat_row para personalizar cómo se renderiza el widget repetido, y así arreglar ese widget para todos los formularios que lo usan.

22

Si desea separar tanto campo de contraseñas de un método repetido en su plantilla ramita sólo hay que llamar de nuevo a sus respectivos nombres como:

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

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

Y, por supuesto, en su función:

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

Saludos.

18

Esto funciona para mí:

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

Si está utilizando Usuarios Bundle utilizan el password.first y password.second, aún mejor tratar de usar el generador de perfiles para ver qué variables proviene de la vista y los controladores;)

Cuestiones relacionadas