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.
- Création du champ avec une liste d'options vide
- Export de la configuration du champ
- Modification de la configuration du champ en lui associant une fonction pour fournir la liste des options
- 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.
Et laissons les options de champs vide.
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.
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.
Commentaires
Super intéressant je…
Super intéressant je connaissais pas ! Merci pour l'astuce :)
Ajouter un commentaire