2012-06-14 16 views
17

Quiero agregar una clase a ciertos campos de entrada o etiqueta dentro de symfony2.Symfony2 - FormBuilder - agregue una clase al campo e ingrese

puedo hacer algo como esto en mi forma dentro de la ramita:

<div class="row"> 
    {{ form_label(form.subject) }} 
    {{ form_widget(form.subject, { 'attr': {'class': 'c4'} }) }} 
</div> 

que funciona muy bien. Pero tengo que configurar la plantilla para cada formulario. Y tengo que dividirlo en el nivel de salida más pequeño posible. De hecho, me quiero usar:

{{ form_widget(form) }} 

Por lo tanto, yo estaba pensando, ¿cómo podría agregar una clase css para la l en algún lugar:

class SystemNotificationType extends AbstractType { 
    public function buildForm(FormBuilder $builder, array $options) { 
     $builder ->add('subject', 'text', array('label' => 'Subject')) 
– 

pensé que esto podría ser más útil, ya que sólo tiene que hacer cambios en un solo lugar

Entonces, ¿cómo podría hacerse esto, o tal vez estoy pensando de la manera incorrecta.

Cualquier ayuda sería grande,

Muchas gracias, Philipp

Respuesta

26

La clase de un campo es parte de la capa de presentación de su aplicación, por lo que es mejor crear un tema de rama para sus formularios:

Crear un archivo fields.html.twig en Resources/views/Form de su paquete y definir cómo se formatea su fila forma, por ejemplo:

{% block field_row %} 
<div class="row"> 
    {{ form_errors(form) }} 
    {{ form_label(form) }} 
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }} 
</div> 
{% endblock field_row %} 

Si desea personalizar único cierto campo, por ejemplo el campo fieldName de la forma formName, personalizar la fila:

{% block _formName_fieldName_row %} 
<div class="row"> 
    {{ form_label(form) }} 
    {{ form_errors(form) }} 
    {{ form_widget(form, { 'attr': {'class': 'c4'} }) }} 
</div> 
{% endblock %} 

EDITAR: personalizar sólo el campo:

{% block _formName_fieldName_widget %} 
    {% set type = type|default('text') %} 
    <input type="{{ type }}" {{ block('widget_attributes') }} value="{{ value }}" class="c4" /> 
{% endblock %} 

Luego, en todo el para Plantillas m que quieren utilizar este tema Añadir:

{% form_theme form 'MyBundle:Form:fields.html.twig' %} 

Esto se explica en profundidad en the cookbook

+0

Gracias, este también está bien. Absolutamente no noté esta parte en el libro de cocina. :) Pero todavía tengo que construir filas para cada elemento en los campos twig. Pero tal vez esto es así, cómo debe ser. – insertusernamehere

+0

@insertusernameheredad de personalización agregada del campo en mi respuesta. No probado, pero debería funcionar. –

+0

Funciona muy bien. Gracias de nuevo. :) – insertusernamehere

40

Puede hacerlo de esta manera:

class SystemNotificationType extends AbstractType { 
    public function buildForm(FormBuilder $builder, array $options) { 
     $builder->add('subject', 'text', array( 
      'label' => 'Subject', 
      'attr' => array(
       'class' => 'c4') 
      ) 
     ); 
    } 
} 
+0

Eso funciona bien. Pero agrega la clase a ambos, la etiqueta y el campo de entrada. ¿Es posible decir que la etiqueta y el campo obtienen diferentes clases? – insertusernamehere

+0

¿Cómo agregar una clase 'c4' solo para el campo pero no para la etiqueta? – Mikhail

+0

Posible solución alternativa de JavaScript en el documento listo: $ ('label.c4').removeClass ('c4'); – sglessard

6

Tematizando formularios


Cada parte de cómo se representa una forma puede ser personalizado . Puede cambiar la forma en que se representa cada "fila" de formulario, cambiar el marcado usado para representar errores o incluso personalizar cómo se debe representar una etiqueta de texto. No hay nada prohibido, y se pueden usar diferentes personalizaciones en diferentes lugares.

Symfony utiliza plantillas para representar todas y cada una de las partes de un formulario, como etiquetas de etiquetas, etiquetas de entrada, mensajes de error y todo lo demás.

En Twig, cada forma de "fragmento" está representada por un bloque Twig.Para personalizar cualquier parte de cómo se renderiza un formulario, solo debe sobrescribir el bloque apropiado.

En PHP, cada forma de "fragmento" se representa a través de un archivo de plantilla individual. Para personalizar cualquier parte de cómo se renderiza un formulario, solo tiene que anular la plantilla existente creando una nueva.

Para comprender cómo funciona esto, personalice el fragmento form_row y agregue un atributo de clase al elemento div que rodea cada fila. Para ello, cree un nuevo archivo de plantilla que almacenará el nuevo marcado:

{# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #} 
{% block form_row %} 
{% spaceless %} 
<div class="form_row"> 
{{ form_label(form) }} 
{{ form_errors(form) }} 
{{ form_widget(form) }} 
</div> 
{% endspaceless %} 
{% endblock form_row %} 

La forma fragmento form_row se utiliza cuando se representa la mayoría de los campos a través de la función form_row. A decir el componente de forma de utilizar el nuevo fragmento form_row definido anteriormente, añadir lo siguiente a la parte superior de la plantilla que la muestra la forma:

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #} 
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %} 
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' 
'AcmeTaskBundle:Form:fields2.html.twig' %} 
{{ form(form) }} 

La etiqueta form_theme (en Twig) "importación" los fragmentos se define en la plantilla dada y los utiliza al procesar el formulario. En otras palabras, cuando se llama a la función form_row más adelante en esta plantilla, usará el bloque form_row de su tema personalizado (en lugar del bloque form_row predeterminado que viene con Symfony).

Su tema personalizado no tiene que anular todos los bloques. Al renderizar un bloque que no se reemplaza en su tema personalizado, el motor de temas volverá al tema global (definido en el nivel de paquete).

Si se proporcionan varios temas personalizados, se buscarán en el orden indicado antes de volver al tema global.

Para personalizar cualquier parte de un formulario, solo tiene que anular el fragmento apropiado. Saber exactamente qué bloque o archivo sobrescribir es el tema de la siguiente sección.

{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #} 

{% form_theme form with 'AcmeTaskBundle:Form:fields.html.twig' %} 

{% form_theme form with ['AcmeTaskBundle:Form:fields.html.twig', 
'AcmeTaskBundle:Form:fields2.html.twig'] %} 

Para más información ver la Cómo personalizar la representación en Symfony libro de cocina

Global Tematizando formularios


En el ejemplo anterior, se utilizó el form_theme ayudante (en Twig) para "importar" los fragmentos de formulario personalizados en solo th en la forma. También puede indicarle a Symfony que importe las personalizaciones de formularios en todo su proyecto.

ramita

para incluir automáticamente los bloques personalizados de la plantilla fields.html.twig creado anteriormente en todas las plantillas, modifique el archivo de configuración de la aplicación:

# app/config/config.yml 
    twig: 
    form: 
     resources: 
     - 'AcmeTaskBundle:Form:fields.html.twig' 

Cualquier bloques dentro de los campos. La plantilla html.twig ahora se usa globalmente para definir el resultado del formulario.

Cuestiones relacionadas