FormAlter como Plugin
Proporciona un sistema basado en plugins para alteraciones de formularios, reemplazando las implementaciones tradicionales de hook_form_alter() con plugins orientados a objetos.
pluginformalter
Instalar
composer require 'drupal/pluginformalter:8.x-1.8'
composer require 'drupal/pluginformalter:8.x-1.7'
Overview
FormAlter as Plugin es un módulo de utilidad para desarrolladores que moderniza la forma en que se alteran los formularios de Drupal. En lugar de usar el enfoque procedimental tradicional de hook_form_alter(), los desarrolladores pueden crear plugins orientados a objetos con anotaciones para modificar formularios. Este enfoque proporciona una mejor organización del código, soporte para dependency injection y una separación de responsabilidades más clara.
El módulo soporta tres tipos de alteraciones de formularios: formularios estándar de Drupal (por form_id o base_form_id), formularios de widgets de Paragraphs (por paragraph_type) y formularios de Inline Entity Form (por entity_type y bundle). Cada tipo de plugin viene con su propia anotación y servicio manager, permitiendo una orientación precisa a formularios específicos.
Además, el módulo se integra con el módulo Webprofiler para mostrar qué plugins están alterando cada formulario en la barra de herramientas de depuración, facilitando el desarrollo y la depuración.
Nota: A partir de Drupal 11.2, este módulo genera advertencias de deprecación porque Drupal core ahora soporta OOP Hooks de forma nativa. El módulo dejará de funcionar en Drupal 12.0.0, y los desarrolladores deberían migrar a los OOP Hooks del core.
Features
- Sistema de alteración de formularios basado en plugins que reemplaza hook_form_alter() con un enfoque orientado a objetos
- Soporte para orientar formularios por form_id o base_form_id con coincidencia de comodines
- Integración con el módulo Paragraphs para alterar formularios de widgets de tipos de párrafo
- Integración con el módulo Inline Entity Form para alterar formularios de entidades IEF, formularios de referencia y campos de tabla
- Ordenamiento de plugins basado en peso para controlar la secuencia de alteraciones de formularios
- Múltiples plugins pueden alterar el mismo formulario con un orden de ejecución predecible
- Integración con Webprofiler que muestra todos los plugins de alteración de formularios en la barra de herramientas de depuración
- Soporte completo de dependency injection a través de ContainerFactoryPluginInterface
- Trait de traducción de cadenas incluido en la clase base para soporte de localización
Use Cases
Organizar alteraciones de formularios por dominio
Crea plugins FormAlter separados para cada área funcional de tu aplicación. Por ejemplo, crea UserLoginFormAlter para modificaciones de inicio de sesión, NodeFormAlter para edición de contenido y CommerceCheckoutFormAlter para comercio electrónico. Cada plugin encapsula su lógica de forma limpia con dependency injection.
Alterar todos los formularios de Node
Usa la orientación por base_form_id para alterar todos los formularios de node a la vez. Crea un plugin con @FormAlter(id = "node_form_base_alter", base_form_id = {"node_form"}) para añadir funcionalidad común como validación personalizada o modificaciones de campos en todos los tipos de contenido.
Alteraciones de formularios condicionales
Combina el sistema de plugins con lógica condicional dentro del método formAlter(). El plugin se instancia solo cuando se renderiza el formulario objetivo, y puedes añadir condiciones adicionales en tiempo de ejecución dentro de tu implementación.
Orientar tipos de Paragraphs específicos
Cuando trabajes con el módulo Paragraphs, crea plugins ParagraphsFormAlter para personalizar formularios de tipos de párrafo específicos. Por ejemplo, modifica el widget de párrafo de imagen para añadir comportamientos JavaScript personalizados o validación.
Extender Inline Entity Forms
Usa plugins InlineEntityFormAlter para personalizar cómo se incrustan las entidades en los formularios. Orienta tipos de entidad y bundles específicos, o modifica la visualización de campos de tabla para listas de referencia de entidades.
Controlar el orden de alteración
Cuando múltiples plugins alteran el mismo formulario, usa la propiedad weight para controlar el orden de ejecución. Los pesos más bajos se ejecutan primero. Esto es esencial cuando una alteración depende de los cambios de otra.
Depurar alteraciones de formularios
Cuando Webprofiler está habilitado, el módulo muestra todos los plugins FormAlter que afectan cada formulario en la barra de herramientas de depuración. Esto ayuda a identificar qué plugins están modificando los formularios y rastrear comportamientos inesperados.
Tips
- Las clases de plugins deben colocarse en el directorio src/Plugin/FormAlter/ para ser descubiertas
- Usa patrones de comodín (ej., 'node_*_form') en form_id para orientar múltiples formularios
- La clase base FormAlterBase incluye StringTranslationTrait y DependencySerializationTrait por conveniencia
- Implementa ContainerFactoryPluginInterface (incluida en FormAlterBase) para inyectar servicios en tus plugins
- Los plugins soportan orientación tanto por form_id como por base_form_id; las alteraciones de base_form_id se ejecutan antes que las de form_id
- A partir de Drupal 11.2+, considera migrar a la funcionalidad OOP Hooks del core en lugar de este módulo
- Limpia las cachés después de añadir o modificar plugins para que los cambios surtan efecto
Technical Details
Hooks 1
pluginformalter_form_alter_info_alter
Altera las definiciones de plugins de alteración de formularios descubiertas por cualquiera de los tres managers de plugins.
Troubleshooting 5
Asegúrate de que tu plugin esté en el namespace correcto (Drupal\yourmodule\Plugin\FormAlter), tenga la anotación correcta (@FormAlter, @ParagraphsFormAlter o @InlineEntityFormAlter), y limpia todas las cachés.
Ajusta la propiedad weight en las anotaciones de tu plugin. Los pesos más bajos se ejecutan primero. Usa el hook pluginformalter_form_alter_info_alter para modificar los pesos en tiempo de ejecución si es necesario.
Estas advertencias indican que el módulo está deprecado a favor de los OOP Hooks del core de Drupal. Planifica la migración a la implementación OOP de hook_form_alter del core antes de actualizar a Drupal 12.
Asegúrate de que tanto el módulo pluginformalter como webprofiler estén habilitados. Limpia las cachés para asegurar que el service provider decore correctamente el recolector de datos de formularios.
Verifica que estés usando la anotación @ParagraphsFormAlter (no @FormAlter) y que el paragraph_type coincida exactamente. El paragraph_type debe ser el nombre máquina de tu tipo de párrafo.