Nuevo en Symfony 4.3: Nuevas mejoras en los formularios
Symfony 4.3 incluye mejoras importantes relacionadas con los formularios, tales como temas de formulario más sencillos y algunas mejoras en la traducción de formularios. Este artículo explica algunas de las otras mejoras que incluye Symfony 4.3 relacionadas con los formularios.
Mantener el orden de las opciones destacadas
El campo de formulario ChoiceType que se usa para mostrar elementos de tipo
<select>
, define una opción llamada preferred_choices
para mostrar algunas
opciones destacadas (ej. mostrar la lista completa de países del mundo, pero
arriba del todo mostrar 5 o 6 de los países más comunes en tu proyecto):
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Intl\Countries; ->add('country', ChoiceType::class, [ 'choices' => Countries::getNames(), 'preferred_choices' => ['US', 'JP', 'CN'], ])
En las versiones de Symfony anteriores, las opciones destacadas se ordenaban
automáticamente como el resto de opciones (en el ejemplo anterior, se mostrarían
en este orden: CN
, JP
, US
). En Symfony 4.3 las opciones destacadas se
muestran siempre en el mismo orden en el que las has definido.
Esta funcionalidad fue contribuida por Valentin Udaltsov en el pull request #30985.
Mejorado el comando para depurar formularios
El comando debug:form
es muy útil para depurar formularios y en Symfony 4.3
se ha mejorado. Si un campo de formulario define opciones asociadas con
normalizadores del componente OptionsResolver, el comando ahora los
muestra:
Esta funcionalidad fue contribuida por Yonel Ceruto en el pull request #31082.
Atributos de fila en los temas de formulario
Actualmente, cuando quieres hacer algún pequeño retoque en el bloque form_row
de un tema de formulario (como por ejemplo añadirle una clase CSS) tienes
que redefinir el bloque form_row
entero. Symfony 4.3 añade una nueva opción
de configuración llamada row_attr
para definir los atributos de ese bloque:
{% block form_row %} {% set row_attr = { class: 'some_custom_class' } %} {{ parent() }} {% endblock %}
Esta funcionalidad fue contribuida por Alexander Schranz en el pull request #30320.
Errores personalizados en los data mappers
En ocasiones, cuando se usan data mappers, el mensaje de error genérico que se muestra cuando se produce un error no es muy claro. Así que en Symfony 4.3 puedes definir un mensaje de error diferente para los usuarios de la aplicación:
class MoneyDataMapper implements DataMapperInterface { public function mapDataToForms($data, $forms) { $forms = iterator_to_array($forms); $forms['amount']->setData($data ? $data->getAmount() : 0); $forms['currency']->setData($data ? $data->getCurrency() : 'EUR'); } public function mapFormsToData($forms, &$data) { $forms = iterator_to_array($forms); $amount = $forms['amount']->getData(); if (!is_numeric($amount)) { // este es el mensaje en tus logs $failure = new TransformationFailedException('Expected numeric value'); // este es el mensaje que verán los usuarios $failure->setInvalidMessage('Money amount should be numeric. {{ amount }} is invalid.', [ '{{ amount }}' => json_encode($amount) ]); throw $failure; } $data = new Money($forms['amount']->getData(), $forms['currency']->getData()); } }
Esta funcionalidad fue contribuida por Maxime Steinhausser en el pull request #20978.
Símbolo de porcentaje personalizable
El campo de formulario PercentType muestra por defecto el símbolo %
al
lado de los valores. En symfony 4.3 esto es configurable gracias a una nueva
opción llamada symbol
. Si su valor es false
, no se muestra ningún símbolo.
Si su valor es una cadena de texto (ej. ‰
), se muestra ese contenido al lado
de los valores:
use Symfony\Component\Form\Extension\Core\Type\PercentType; ->add('salinity', PercentType::class, [ 'symbol' => '‰', ])
Esta funcionalidad fue contribuida por Oskar Stark en el pull request #30433.
Fuente: New in Symfony 4.3: More Form improvements
Comentarios
Proyectos Symfony destacados
La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.