array - Representación personalizada de un campo "repetido" de Symfony 2 en Twig
twig documentation (5)
Después de una suposición aleatoria, resolví mi problema. Lo publicaré aquí para que otros que puedan llegar a esta pregunta buscando también sepan 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 %}
Empecé a usar Twig y estoy intentando crear un formulario de registro. Para agregar un campo de contraseña / reingresar contraseña, uso el tipo de archivo "repetido":
->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. Entonces 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 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.
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>
....
Si desea separar el campo de ambas contraseñas de un método repetido en su plantilla de rama, solo tiene que volver a llamar 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 tu función:
/..
->add(''password'', ''repeated'', array(
''first_name'' => ''pass'',
''second_name'' => ''confirm'',
''type'' => ''password''
))
Saludos.
Si desea tener amplias clases de aplicaciones para sus etiquetas y entradas, puede personalizar cómo se procesan las etiquetas y los widgets. Verifique http://symfony.com/doc/current/cookbook/form/form_customization.html
Si miras este archivo:
vendor/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
Puede ver los valores predeterminados para todos los widgets. Para lograr específicamente lo que necesita, puede anular el bloque generic_label para agregar la clase de etiqueta de formulario:
{% 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 bloque widget_attributes para agregar clase de entrada de formulario:
{% 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, todas sus entradas deberían representarse con las clases que necesita, sin tener que repetir los parámetros ''atr'' en todos sus formularios.
No lo he intentado, pero esto debería encargarse del 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.
Si está utilizando Users Bundle, usa la contraseña.primero y la contraseña.segundo, incluso mejor intente usar su generador de perfiles para ver qué variables provienen de la vista y los controladores;)