2011-09-26 10 views
11

que estoy tratando de implementar algo como esto:HTML en Symfony2 formar etiquetas en lugar de texto plano

<div> 
    <input type="checkbox" name="checkbox" id="checkbox_id" /> 
    <label for="checkbox_id">I agree to the <a href="/tos">Terms of Service</a></label> 
</div> 

Lo más cerca que he llegado a poner en práctica este es a través de:

<div> 
    {{ form_widget(form.agreeWithTos) }} 
    <label for="{{ form.agreeWithTos.vars.id }}">I agree to the <a href="#">Terms of Service</a></label> 
</div> 

¿Existe una ¿mejor manera? Tener que especificar {{form.agreeWithTos.vars.id}} es poco elegante. :)

+1

¿Cuál es su problema exactamente? –

Respuesta

1

Creo que está buscando form theming. De esta forma, puede diseñar cada parte del formulario, en un archivo independiente, de todos modos, y luego simplemente renderizarlo de manera "elegante", fila por fila con {{ form_row(form) }} o simplemente con {{ form_widget(form) }}. Depende de usted cómo lo configuró.

9

solucionado este problema usando el siguiente código en mi forma de temática:

{# ---- form-theme.html.twig #} 
{% block checkbox_row %} 
{% spaceless %} 
<div> 
    {{ form_errors(form) }} 

    <label class="checkbox" for="{{ form.vars.id }}"> 
     {{ form_widget(form) }} 
     {{ label|default(form_label(form)) | raw }} 
    </label> 
</div> 
{% endspaceless %} 
{% endblock %} 

en su Forma-Plantilla A continuación, puede utilizar:

{% form_theme form '::form-theme.html.twig' %} 

{{form_row(form.termsOfServiceAccepted, { 
     'label' : 'I have read and agree to the <a href="#">Terms and conditions</a>' 
    }) 
}} 

esta manera, el bloque de la forma- el tema se aplicaría a cualquier casilla de verificación en la página. Si es necesario utilizar la opción por defecto-tema, se puede agregar un parámetro para habilitar especial-renderizado:

{# ---- form-theme.html.twig #} 
{% block checkbox_row %} 
{% spaceless %} 
    {% if not useTosStyle %} 
     {{ parent() }} 
    {% else %} 
     {# ... special rendering ... #} 
    {% endif %} 
{% endspaceless %} 
{% endblock %} 

que se utilizaría como esto:

{% form_theme form '::form-theme.html.twig' %} 

{{form_row(form.termsOfServiceAccepted, { 
     'useTosStyle' : true, 
     'label' : 'I have read and agree to the <a href="#">Terms and conditions</a>' 
    }) 
}} 
0

Así formar tematización es bastante complicado. Lo más fácil que he encontrado es simplemente suprimir la etiqueta del campo ('label'=> false en la clase de formulario Symfony) y luego simplemente agregar la etiqueta html en twig html.

0

He estado golpeando mi cabeza sobre esto y luego tuve un momento eureka. La forma más fácil de hacerlo, BY ALL, es crear una extensión Twig.

Aquí está mi código de la ramita:

{# twig example #} 
{% block form_label %} 
    {% set label = parent() %} 
    {{ label|unescape|raw }} 
{% endblock %} 

y PHP:

<?php 
new Twig_SimpleFilter('unescape', function($value) { 
    return html_entity_decode($value); 
}); 

Un par de notas:

  • Este código de caracteres de escape previamente toda escapó. Definitivamente deberías volver a escapar después según sea necesario.
  • Esto requiere una etiqueta extends para su tema de formulario de destino en su propio tema de formulario personalizado que puede utilizar en sus formularios posteriores. Coloque el código de rama en un tema de formulario personalizado y reemplace las referencias a su otro tema/tema de formulario con este.

En general, esta es la menor cantidad de líneas de código para el mayor y mejor resultado que he podido encontrar. También es ultraportátil y DRY: puedes extender cualquier tema de formulario y la etiqueta cambiará sin que cambies el resto de tu código.

0

Se podría aprovechar forma tematización de otra manera: se podía mover la etiqueta <label>fuera la función form_label().

crear un tema de forma personalizada, y por casillas de verificación sólo se mueven la etiqueta <label> fuera de la función form_label:

{% block checkbox_row %} 
    <label>{{ form_label(form) }}</label> 
    {{ form_errors(form) }} 
    {{ form_widget(form) }} 
{% endblock checkbox_row %} 

{% block checkbox_label %} 
    {{ label }} 
{% endblock checkbox_label %} 

Ahora, en su teplate, anulan la label de su casilla, y por lo tanto efectivamente inyectar HTML en el función de etiqueta:

{% form_theme form 'yourtheme.html.twig' _self %} 

{% block _your_TOS_checkbox_label %} 
    I agree with <a href="#" target="_blank">terms and conditions</a> 
{% endblock _your_TOS_checkbox_label %} 
Cuestiones relacionadas