Nuevo en Symfony 2.7: refactorización de ChoiceType
El tipo de campo de formulario Choice es uno de los más avanzados definidos por Symfony. También es uno de los más importantes, ya que muchos otros tipos heredan de el, como EntityType, CountryTipe y LocaleType.
En Symfony 2.7 este tipo de campo ha sido completamente refactorizado para soportar la generación dinámica de títulos, valores, índices y atributos. Todo ello gracias a las nuevas opciones choice_label
, choice_name
,
choice_value
, choice_attr
, group_by
y choices_as_values
.
Generación dimámica de títulos
Por defecto, las claves del array choices
se utilizan como el título o label de cada opción. Ahora también puedes pasar cualquier callable de PHP (por ejemplo una función anónima) para generarlos dinámicamente:
$builder->add('attending', 'choice', array( 'choices' => array( 'yes' => true, 'no' => false, 'maybe' => null, ), 'choices_as_values' => true, 'choice_label' => function ($opciones, $claveOpcionActual) { return 'form.choice.'.$claveOpcionActual; }, ));
Si lo prefieres, en vez de un callable también puedes pasar el nombre de una propiedad del objeto que representa a cada opción:
$builder->add('attending', 'choice', array( 'choices' => array( Status::getInstance(Status::YES), Status::getInstance(Status::NO), Status::getInstance(Status::MAYBE), ), 'choices_as_values' => true, 'choice_label' => 'displayName', ));
Generación dimámica de nombres y valores
Utiliza la nueva opción choice_name
para generar los nombres de los elementos HTML que representan a las opciones y la opción choice_value
para generar los valores de esos mismos elementos HTML:
$builder->add('attending', 'choice', array( 'choices' => array( 'Yes' => true, 'No' => false, 'Maybe' => null, ), 'choices_as_values' => true, 'choice_name' => function ($opciones, $claveOpcionActual) { // utiliza como nombre el título o label return strtolower($claveOpcionActual); }, 'choice_value' => function ($opciones, $claveOpcionActual) { if (null === $claveOpcionActual) { return 'null'; } if (true === $claveOpcionActual) { return 'true'; } return 'false'; }, ));
En este caso, en vez de un callable de PHP también puedes usar el nombre de una propiedad del objeto que representa a cada opción.
Generación dinámica de los atributos HTML
La opción choice_attr
define los atributos HTML que se añaden al elemento HTML que representa a cada opción. Si las opciones a elegir son pocas y sencillas, puedes utilizar directamente un array:
$builder->add('attending', 'choice', array( 'choices' => array( 'Yes' => true, 'No' => false, 'Maybe' => null, ), 'choices_as_values' => true, 'choice_attr' => array( 'Maybe' => array('class' => 'text-muted'), ), ));
Si las opciones son más complejas, es mejor utilizar un callable:
$builder->add('attending', 'choice', array( 'choices' => array( 'Yes' => true, 'No' => false, 'Maybe' => null, ), 'choices_as_values' => true, 'choice_attr' => function ($opciones, $claveOpcionActual) { if (null === $claveOpcionActual) { return array('class' => 'text-muted'); } }, ));
Como en las anteriores opciones, también puedes pasar el nombre de una propiedad del objeto que representa a cada opción.
Generación dinámica de grupos de opciones
Por defecto las opciones se pueden agrupar definiendo los grupos mediante arrays anidados en la opción choices
:
$builder->add('attending', 'choice', array( 'choices' => array( 'Decided' => array( 'Yes' => true, 'No' => false, ), 'Undecided' => array( 'Maybe' => null, ), ), 'choices_as_values' => true, ));
Si lo prefieres, puedes definir los grupos dinámicamente usando un callback con la opción group_by
:
$builder->add('attending', 'choice', array( 'choices' => array( 'Yes' => true, 'No' => false, 'Maybe' => null, ), 'choices_as_values' => true, 'group_by' => function ($opciones, $claveOpcionActual) { if (null === $claveOpcionActual) { return 'Undecided'; } return 'Decided'; }, ));
Generación dinámica de las opciones destacadas
Por último, el nuevo tipo Choice
permite generar dinámicamente mediante la opción preferred_choices
la lista de opciones que aparecen destacadas respecto del resto de opciones mostradas por el campo de formulario. Esto es habitual por ejemplo al mostrar un selector de países, donde quieres mostrar destacados y separados un pequeño grupo de países que son los más habituales para tus usuarios.
$builder->add('attending', 'choice', array( 'choices' => array( 'Yes' => true, 'No' => false, 'Maybe' => null, ), 'choices_as_values' => true, // using an array to show the 'true' choice as preferred 'preferred_choices' => array(true), // using a callable to show the 'true' choice as preferred 'preferred_choices' => function ($choice, $key) { return true === $choice; }, ));
Esta funcionalidad ha sido desarrollada por Bernhard Schussek en el pull request #14050 de Symfony.
Comentarios
Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente
unos meses después de su publicación para asegurar que estos sigan
siendo relevantes.
Proyectos Symfony destacados
La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.