2012-05-15 6 views
35

Sé que puede dividir un formulario en ramitas y optar por no presentar la etiqueta para un campo en particular, pero no puedo evitar pensar que debe poder hacer esto desde la clase de formulario. La tecla 'etiqueta' en la matriz de opciones le permite cambiar este valor a lo que quiera, pero pasar una cadena falsa o una cadena vacía simplemente devuelve el nombre del campo (vea ejemplos a continuación donde se representa 'roles' como la etiqueta).¿Cómo se ocultan las etiquetas en una clase de formulario en symfony2?

$builder 
      ->add('roles', 'entity', array(
       'class' => 'Acme\UserBundle\Entity\Role', 
       'label' => '' 
      )); 

$builder 
      ->add('roles', 'entity', array(
       'class' => 'Acme\UserBundle\Entity\Role', 
       'label' => false 
      )); 

Extrañamente, pasando un espacio vacío (que se siente muy sucio) parece representar una etiqueta completamente vacío, sin espacio, incluso a la de la fuente. ¿Alguien puede arrojar alguna luz sobre el mejor enfoque, o incluso por qué el espacio vacío parece funcionar?

+0

Corrección, no había forma de hacer esto para Symfony 2.0.x, pero cheesemacfly ha proporcionado las versiones de respuesta correcta 2.2+. – Mark

Respuesta

83

Desde Symfony 2.2 se puede evitar la prestación <label> utilizando el valor false para el atributo label:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('Name', null, array('label' => false)) 
    ; 
} 

Source

+1

Gracias por esto. Originalmente, hice la pregunta en relación con un proyecto 2.0.x, pero como no he especificado una versión, creo que esta es la respuesta correcta. Además, dado que se trata de una nueva incorporación, no había manera de hacerlo en las versiones anteriores de la clase de formulario, por lo que es de esperar que ayude a personas con problemas similares. – Mark

+3

@Mark Lo suficientemente gracioso, está disponible en 2.0.x desde hoy: http://symfony.com/blog/symfony-2-0-23-released (juro que no tengo nada que ver con eso: D) – cheesemacfly

+0

Ha . En ese caso, definitivamente esta es definitivamente la respuesta correcta. Podría valer la pena agregar eso a su respuesta en caso de que alguien no lea los comentarios y actualice toda su aplicación a 2.2 solo para obtener esta increíble funcionalidad :) – Mark

2

que no entiendo muy bien su pregunta, pero en forma de mostrar el nombre de la etiqueta, personnaly me gusta que:

$builder 
     ->add('role', 'text') 

en mi rama:

<tr> 
     <td>{{ form_widget(form.role) }} </td> 
     <td>{{ form_label(form.role, "Name of Label") }}</td> 
    </tr> 
    <tr> 
     <td>{{ form_errors(form.role) }}</td> 
    </tr> 
2

esto debería funcionar (aunque no es una solución muy limpia)

$builder 
     ->add('roles', 'entity', array(
      'class' => 'Acme\UserBundle\Entity\Role', 
      'label' => ' ' 
     )); 

(tenga en cuenta el espacio entre las garrapatas)

+0

Gracias por esto, pero notará que menciono esta solución debajo de mi fragmento de código en la pregunta – Mark

3

Para ocultar mi etiqueta, tuve que representar solo el widget para el campo y no la etiqueta, p.

{{ form_widget(edit_form.event) }} 
{{ form_rest(edit_form) }} 

El problema con el '' etiqueta con un espacio en, es que todavía hace que la entrada de html que es allí y afecta a la página.

+0

. De esta manera es mejor porque no pone especificaciones 'Ver' dentro de su Modelo. es posible que también desee agregar '{{form_errors (form.name)}}' si desea conservar los errores. – Chris

11

mantener el 'View' especificaciones sus separan de su 'Modelo'

Si sigue la respuesta aceptada que dice:

$builder 
     ->add('Name', null, array('label' => false)) 
    ; 

su formulario no es tan reutilizable. Especialmente si su formulario aparece en más de una ubicación (o podría en el futuro).

Si no desea representar la etiqueta del formulario, es mejor hacerlo en Twig (suponiendo que usa Twig).

en vez de traer {{ form_row(form.name) }}, representar cada elemento de archivo aparte, y no incluyen el ex form_label

.

{{ form_errors(form.name) }} 
{# {{ form_label(form.name) }} <-- just dont include this #} 
{{ form_widget(form.name) }} 

Si por el camino que quería la etiqueta en una instancia del formulario, pero el otro no, simplemente añadiendo {{ form_label(form.name) }} sería suficiente; Donde como cambiar array('label' => true) convertiría la etiqueta en todas partes

Si va a renderizar formulario con el forro {{ form(form) }} entonces usted debe echar un vistazo a la symfony docs

+0

Estoy totalmente de acuerdo con este suplemento. – moudug

+1

Sin embargo, hay una pequeña desventaja con esto: si está utilizando un diseño (como bootstrap_3_horizontal_layout), puede romperlo y obtener problemas de representación. Sugeriría OP para sobrescribir el diseño de su formulario (es bastante fácil: [consulte la documentación de Symfony] (http://symfony.com/doc/current/form/form_customization.html)) – moudug

0

Sólo tiene que añadir { 'etiqueta': false} a tu form_row()

{{ form_row(form.name, {'label':false}) }} 
Cuestiones relacionadas