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.

Publicada el

27 de abril de 2015

Etiquetas

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.