drupal 8 – Cómo modificar fácilmente la definición de campo base de una entidad por paquete

Pregunta:

Estamos utilizando el módulo de grupo en Drupal 8, que introduce un "grupo" de entidad personalizada. Esta entidad presenta un campo base de "etiqueta" con el título "Título". Como administrador de grupos, puede crear varios tipos de grupos diferentes, que se manejan como paquetes de campo de la entidad de grupo y heredan su campo base de etiqueta.

Dependiendo del tipo de grupo, deseamos anular el título de la etiqueta genérica dentro de los formularios, vistas, plantillas, etc., por ejemplo, 'Etiqueta', 'Nombre', 'Sucursal', 'Departamento', 'Sección', …

Sin embargo, la entidad de grupo no expone el título de la etiqueta dentro de su forma de configuración como lo hace el módulo de nodo. Así que intentamos anular el título usando hook_entity_base_field_info_alter () así:

/**
 * Implements hook_entity_base_field_info_alter().
 */
function mymodule_entity_base_field_info_alter(&$fields, \Drupal\Core\Entity\EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'group' && !empty($fields['label'])) {
    $fields['label']->setLabel(t('Name'));
  }
}

Lo que funciona, pero cambia el título de todos los paquetes.

Nuestro siguiente intento fue hook_entity_bundle_field_info_alter () . Expone la información del paquete, pero no permite que se modifiquen los campos base. Intentar volver a agregar la definición de campo base con un título diferente (para permitir que el núcleo fusione las definiciones de campo y anule las definiciones de campo base) provocó diferentes excepciones en tiempo de ejecución.

Así que terminamos alterando manualmente las matrices de compilación de formularios y los títulos de los widgets, lo que puede causar problemas más adelante cuando la cantidad de tipos de grupos aumenta.

¿Cómo podemos alterar el título del campo base en una base por paquete sin tener que extender el módulo de grupo o alterar manualmente todas las apariciones de las etiquetas de campo de nuestras entidades de grupo?

Respuesta:

Las etiquetas específicas del paquete para los campos base se almacenan en la label de una entidad de configuración BaseFieldOverride :

Define la entidad de anulación del campo base.

Permite que los campos base se anulen a nivel de paquete.

Anotación de complemento

 @ConfigEntityType( id = "base_field_override", label = @Translation("Base field override"), handlers = { "storage" = "Drupal\Core\Field\BaseFieldOverrideStorage", "access" = "Drupal\Core\Field\BaseFieldOverrideAccessControlHandler", }, config_prefix = "base_field_override", entity_keys = { "id" = "id", "label" = "label" }, config_export = { "id", "field_name", "entity_type", "bundle", "label", "description", "required", "translatable", "default_value", "default_value_callback", "settings", "field_type", } )

Cuando obtiene un campo base de EntityFieldManager :: getFieldDefinitions ($ entity_type_id, $ bundle) , establece una nueva etiqueta para el campo y guarda la definición del campo, entonces esta etiqueta no se almacena en el tipo de entidad (lo cual no sería posible, porque esto está en el código y es el mismo para todos los paquetes), pero en la anulación del campo base mencionado.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım