Fournir automatiquement les options à un champ de type Liste sur Drupal 8

Des emporte-pièces

Drupal 8 dispose d'une multitude de type de champs permettant de couvrir un grand nombre de cas d'usage et de situations quand il s'agit de structurer et modéliser un contenu. Parmi ceux-ci, nous disposons d'un champ de type Liste qui, comme son nom l'indique, nous permet de configurer un champ de saisie sur la base d'une liste d'options prédéfinies. Cette liste d'options doit être paramétrée manuellement dans les options de stockage du champ au moment de sa création.

Mais nous pouvons également utiliser ce champ sur la base d'une liste d'options qui peuvent être fournies dynamiquement. Regardons comment nous devons procéder pour disposer d'un champ qui nous permet de choisir parmi une liste d'options dynamiques.

Pour l'exemple, nous allons créer un champ de type liste qui aura pour fonction de nous fournir la liste de tous les types de contenu disponibles sur un projet Drupal 8. La création d'un tel champ va se passer en 4 étapes.

  1. Création du champ avec une liste d'options vide
  2. Export de la configuration du champ
  3. Modification de la configuration du champ en lui associant une fonction pour fournir la liste des options
  4. Import de la nouvelle configuration du champ

Création du champ Liste

La création d'un tel champ est assez simple. Ajoutons un champs intitulé Type de contenu (nom machine field_content_type) sur un type de paragraph par exemple.

add field list type

Et laissons les options de champs vide.

Field list settings empty

Exportation de la configuration du champ

Nous pouvons exporter la configuration du nouveau champ, avec la commande drush cex, ou encore avec le module Features, ou encore à l'aide de l'interface d'export de la configuration disponible nativement avec Drupal Core.

Nous obtenons cette configuration pour notre nouveau champ

langcode: fr
status: true
dependencies:
  module:
    - options
    - paragraphs
id: paragraph.field_content_type
field_name: field_content_type
entity_type: paragraph
type: list_string
settings:
  allowed_values: {  }
  allowed_values_function: ''
module: options
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

Modification de la configuration du champ

Nous éditons alors cette configuration du champ pour lui associer une fonction sur le paramètre allowed_values_function. Cette fonction sera en charge de fournir une liste dynamique des options possibles, à savoir les différents types de contenu présent sur le projet.

Notre configuration devient alors

langcode: fr
status: true
dependencies:
  module:
    - options
    - paragraphs
id: paragraph.field_content_type
field_name: field_content_type
entity_type: paragraph
type: list_string
settings:
  allowed_values: {  }
  allowed_values_function: my_module_allowed_values_bundle
module: options
locked: false
cardinality: 1
translatable: true
indexes: {  }
persist_with_no_fields: false
custom_storage: false

 

Il nous faut bien entendu désormais créer cette fonction dans le module my_module.

/**
 * Set dynamic allowed values for the bundle field.
 *
 * @param \Drupal\field\Entity\FieldStorageConfig $definition
 *   The field definition.
 * @param \Drupal\Core\Entity\ContentEntityInterface|null $entity
 *   The entity being created if applicable.
 * @param bool $cacheable
 *   Boolean indicating if the results are cacheable.
 *
 * @return array
 *   An array of possible key and value options.
 *
 * @see options_allowed_values()
 */
function my_module_allowed_values_bundle(FieldStorageConfig $definition, ContentEntityInterface $entity = NULL, $cacheable) {
  $entity_type_id = 'node';
  $options = [];
  /** @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entityBundleInfo */
  $entityTypeBundleInfo = \Drupal::service('entity_type.bundle.info');
  $entity_type_bundles = $entityTypeBundleInfo->getBundleInfo($entity_type_id);

  foreach ($entity_type_bundles as $key => $entity_type_bundle) {
    $options[$key] = $entity_type_bundle['label'];
  }
  return $options;
}

Import de la nouvelle configuration du champ

Nous pouvons alors importer cette nouvelle configuration au moyen de la commande drush cim, ou encore à l'aide du module Features ou encore depuis l'interface d'import de la configuration, selon votre projet, qu'il s'agisse d'un simple site ou d'une Usine à sites Drupal 8.

Et le tour joué. Désormais la configuration du champ vous indique que la liste des options est fournie dynamiquement.

Liste des types de contenu

Et vous pouvez désormais offrir une sélection parmi les différents types de contenu présents sur le site. Ce type de mise en oeuvre est particulièrement efficace quand il s'agit de réaliser des composants, quelqu'ils soient, qui peuvent alors être utiliser sur tout type de projet, du site simple, au site complexe en passant par une usine à site Drupal 8.

 

Ajouter un commentaire