Nuevo en Symfony 4.3: Temas de formulario más sencillos

Imagina una aplicación Symfony que contiene un campo de formulario especial con un selector de color que requiere de JavaScript para funcionar. Aunque Symfony dispone de muchas formas de personalizar el diseño de los formularios, la mejor solución para este caso no es lo bastante sencilla.

El motivo es que para hacer este campo de formulario realmente reusable, el nombre del bloque de Twig asociado a él debe ser inmutable. Sin embargo, Symfony prefija por defecto los nombres de los bloques de los campos con el nombre del bloque del element padre (ejemplos: _product_color_widget, _user_color_widget, etc. en vez de un nombre fijo como color_widget).

La solución a este problema es sencilla, pero requiere varios pasos:

Paso 1. Crea un nuevo campo de formulario para el selector de color (como no hace falta definir ninguna opción ni lógica de negocio para el campo, su clase está casi vacía):

class ColorPickerType extends AbstractType
{
    public function getParent(): string
    {
        return TextType::class;
    }
}

Paso 2. Actualiza tus formularios para usar el nuevo campo:

// ...
$builder->add('color', ColorPickerType::class);

El valor asignado por Symfony para la opción block_prefixes será un array con los siguientes valores: form, text, color_picker y _<parent_form_name>_color. Gracias al valor color_picker, que es fijo, ya puedes definir una única plantilla Twig usando ese nombre de bloque y funcionará con cualquier formulario de la aplicación.

Paso 3. Crea la plantilla Twig que redefine el diseño del widget asociado a ese campo de formulario:

{# templates/form/fields.html.twig #}
{% block color_picker_widget %}
    {{ form_widget(form, {'attr': {'v-model': 'color', '@focus': 'open'}}) }}
    {# ... más código aquí; si hace falta ... #}
{% endblock %}

En Symfony 4.3 todo lo anterior seguirá funcionando, pero lo hemos simplificado al máximo. Gracias a la nueva opción block_prefix, puedes definir un nombre de bloque arbitrario que se añadirá a los nombres generados por Symfony.

Siguiendo el mismo ejemplo que antes, ya no hace falta que crees la clase ColorPickerType. Solo tienes que seguir dos pasos:

Paso 1. Define un nombre de bloque especial para el campo de formulario:

// ...
$builder->add('color', null, ['block_prefix' => 'color_picker']);

Paso 2. Usa ese nombre de bloque en la plantilla Twig que redefine el diseño del campo de formulario:

{# templates/form/fields.html.twig #}
{% block color_picker_widget %}
    {# ... #}
{% endblock %}

Esta funcionalidad fue contribuida por Yonel Ceruto en el pull request #29680.

Fuente: New in Symfony 4.3: Simpler Form Theming

Comentarios

Publicada el

26 de marzo de 2019

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.