form_theme form_start form _self css class input symfony formbuilder

css - form_start - symfony form



Symfony2-FormBuilder-agrega una clase al campo y la entrada (3)

Quiero agregar una clase a ciertos campos de entrada o etiqueta desde dentro de symfony2.

Puedo hacer algo como esto en mi formulario dentro de Twig:

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

Que funciona bien. Pero tengo que configurar la plantilla para cada formulario. Y tengo que descomponerlo al nivel de salida más pequeño posible. En realidad quiero usar:

{{ form_widget(form) }}

Entonces, estaba pensando, ¿cómo podría agregar una clase css para el l en algún lugar en:

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 solo tengo que hacer cambios en un lugar.

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

Cualquier ayuda seria genial

Muchas gracias Philipp


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 ramita para sus formularios:

Cree un archivo fields.html.twig en Resources/views/Form de su paquete y defina cómo se formará la fila de su formulario, 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 solo ciertos campos, por ejemplo, el campo fieldName del formulario formName , personalice 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 solo el campo:

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

Luego, en todas las plantillas de formulario que desee, use este tema agregue:

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

Esto se explica en profundidad en el libro de cocina.


Puedes hacerlo así:

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


Formar Theming

Cada parte de cómo se representa un formulario se puede personalizar. Usted es libre de cambiar la forma en que se representa cada "fila" del formulario, cambiar el marcado utilizado para generar errores, o incluso personalizar cómo se debe representar una etiqueta de área de texto. Nada está fuera de los límites, y diferentes personalizaciones pueden usarse en diferentes lugares.

Symfony usa 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 "fragmento" está representada por un bloque Twig. Para personalizar cualquier parte de cómo se representa un formulario, solo tiene que anular el bloque apropiado.

En PHP, cada formulario "fragmento" se procesa a través de un archivo de plantilla individual. Para personalizar cualquier parte de la forma en que se representa 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 a cada fila. Para hacer esto, cree un nuevo archivo de plantilla que almacenará la nueva marca:

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

El fragmento de formulario form_row se utiliza al representar la mayoría de los campos a través de la función form_row. Para indicar al componente del formulario que use su nuevo fragmento form_row definido anteriormente, agregue lo siguiente a la parte superior de la plantilla que representa el formulario:

{# 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) "importa" los fragmentos definidos en la plantilla dada y los usa al representar el formulario. En otras palabras, cuando se llame 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 predeterminado form_row que viene con Symfony).

Tu tema personalizado no tiene que anular todos los bloques. Al representar un bloque que no está anulado en su tema personalizado, el motor de tematización volverá al tema global (definido en el nivel del 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 anular 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 obtener más información, consulte Cómo personalizar la representación en el libro de recetas de Symfony.

Formas globales

En el ejemplo anterior, usó el ayudante form_theme (en Twig) para "importar" los fragmentos de formulario personalizados solo en ese formulario. También puedes decirle a Symfony que importe las personalizaciones de formularios en todo tu proyecto.

Ramita

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

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

Todos los bloques dentro de la plantilla fields.html.twig ahora se usan globalmente para definir la salida del formulario.