Créer des packages fonctionnels pour Drupal 8

Des grues sur un chantier

Ce billet fait suite à la création d'un profil d'installation pour Drupal 8, solution permettant d'industrialiser la production de sites (n'hésitez pas à contacter un développeur spécialiste Drupal 8 pour connaître plus en détail le potentiel de ces solutions). Nous allons explorer ici plus en avant la création d'un package fonctionnel et son intégration dans un profil d'installation.

La méthode la plus simple, tout du moins dans un premier temps, pour concevoir un package fonctionnel consiste d'abord à concevoir la fonctionnalité souhaitée sur un site Drupal 8 fraichement installé, puis à exporter la configuration créée au sein d'un module.

Pour réaliser cet export de configuration nous allons utiliser le module Configuration development, qui permet également d'automatiser l'export de configuration, pratique en phase de développement. A noter, que le module Features, en phase beta actuellement, proposera une interface pour réaliser ces exports de configuration. Quelque soit le module utilisé, le résultat sera identique : des fichiers de configuration exportés au format YAML permettant d'installer les fonctionnalités en un clic.

La nouvelle gestion de la configuration de Drupal 8 a pour conséquence de disposer d'une consistance quelque soit la méthode utilisée pour gérer et exporter les configurations. Pour transformer en Feature un module embarquant une configuration exportée au moyen de Configuration development, il suffit de rajouter le fichier nom_module.features.yml contenant true à la racine du module.  Et nous pouvons alors bénéficier pour ce module de toutes les fonctions et méthodes de Features.

Pour illustrer la méthode, nous allons créer des styles d'images responsives, suffisament génériques pour être réutilisables quelque soit le site ou le thème utilisé. Le but étant de pouvoir réinstaller ces styles d'images de façon automatique (ou en un clic), nous évitant ainsi de devoir refaire, toujours, les mêmes opérations de configuration.

Création des styles d'images

Nous allons créer les styles d'image.

Création des styles d'image Drupal 8

Puis nous configurons des styles d'image adaptatifs. A noter que pour ne pas dépendre de breakpoints (qui peuvent varier d'un projet à un autre selon le framework utilisé), nous configurons nos styles d'image adaptatifs en utilisant l'attribut HTML5 srcset des éléments <img>. Il serait possible de définir nos breakpoints dans le module qui va embarquer ces configurations (avec le fichier de configuration mon_mondule.breakpoints.yml), mais alors nous n'aurions pas la certitude que ces breakpoints seraient les mêmes sur tout projet, et de ce fait le caractère générique et réutilisable de cette configuration en serait amoindrie (même s'il suffirait de modifier le fichier de configuration des breakpoints pour les faire correspondre au projet).

Style d'image adaptatif sur un contenu

 

Style d'image adaptatif sur une page

Nous créons ici deux styles d'image adaptatifs :

  • Uas Full content : une image qui s'adaptera en pleine largeur de l'écran sur les terminaux mobile ( < 768px) et sur 70% de la largeur sur les terminaux plus larges (correspondant au cas typique de l'affichage d'un contenu avec une barre latérale présente)
  • Uas Full screen : une image qui s'adaptera en pleine largeur de l'écran, quelque soit le terminal.

C'est grâce à l'attribut srcset des éléments img que le navigateur choisira l'image adaptée à la largeur de l'écran.

Préparation du module qui va embarquer la configuration

Afin d'exporter nos configurations, nous créons un module uas_image qui embarquera la configuration exportée.

Ce module devra disposer d'un répertoire config/install (une issue est en cours pour créer automatiquement ce répertoire s'il n'existe pas).

Structure du module uas_image

Afin de lister les différentes configurations créées, et les déclarer dans notre module, nous utilisons Drush.


[flocon@detoile /srv/www/uas]drush config-list | grep image.style
image.style.uas_large
image.style.uas_medium
image.style.uas_mobile
image.style.uas_narrow
image.style.uas_normal
image.style.uas_thumbnail
image.style.uas_wide_large
image.style.uas_wide_medium
image.style.uas_wide_mobile
image.style.uas_wide_narrow
image.style.uas_wide_normal
image.style.uas_wide_thumbnail
responsive_image.styles.uas_full_content
responsive_image.styles.uas_full_screen

Il nous suffit alors de copier cette liste de configurations dans le fichier de déclaration de notre module, sous la clé config_devel.


name: 'Uas Image'
description: 'Provide image styles and responsive settings'
type: module
core: 8.x
package: Uas
dependencies:
  - responsive_image
  - image
config_devel:
  - image.style.uas_large
  - image.style.uas_medium
  - image.style.uas_mobile
  - image.style.uas_narrow
  - image.style.uas_normal
  - image.style.uas_thumbnail
  - image.style.uas_wide_large
  - image.style.uas_wide_medium
  - image.style.uas_wide_mobile
  - image.style.uas_wide_narrow
  - image.style.uas_wide_normal
  - image.style.uas_wide_thumbnail
  - responsive_image.styles.uas_full_content
  - responsive_image.styles.uas_full_screen

Export de la configuration

Afin d'exporter la configuration créée, il ne reste plus qu'à activer le module uas_image, puis d'exécuter le commande drush fournie par le module Configuration Development :


[flocon@detoile /srv/www/uas]drush cd-em uas_image

Et notre configuration est exportée et pourra être réutilisé à volonté sur tout type de projet.

Configuration exportée dans le module uas_image

 

Les différentes stratégies pour la maintenance des configurations

Lors de l'installation du module uas_image créé, tous les styles d'image (normaux et adaptatifs) seront créés sur notre projet. On peut adopter plusieurs stratégies concernant le comportement de ces configurations vis à vis du module qui les a créées :

  • Les configurations sont indépendantes du module, et dans ce cas nous pourrons désinstaller et supprimer le module sans impact sur les configurations créées
  • Les configurations sont dépendantes du module, et dans ce cas à la désinstallation du module, les configurations seront supprimées

Le premier cas est celui généré par défaut. Les configurations sont indépendantes du module, et celui-ci peut être désinstallé et supprimé du projet une fois utilisé.

Pour prendre en charge le deuxième cas (suppression des configurations à la désinstallation du module), il suffit de rajouter une dépendance forcée sur le module pour chaque configuration. Pour ce faire, il suffit de rajouter ces quelques lignes sur chaque configuration :


dependencies:
  enforced:
    modules:
      - uas_image

 

Intégration du package fonctionnel dans un profil d'installation

Cette intégration sera réalisée simplement en déclarant notre module créé (uas_image) comme dépendance du profil d'installation, ou une dépendance optionnelle si nous souhaitons pouvoir choisir, lors du processus d'installation, les différents packages et configurations à créer initialement.

Gérer la configuration d'un site Drupal 8 avec les modules

Par défaut, une fois une configuration chargée lors de l'installation d'un module, la conception du système de configuration de Drupal 8 part du principe qu'une fois la configuration chargée et importée depuis un module, c'est désormais le site lui-même qui est en charge de la gestion de cette configuration et non plus le module lui-même, ayant apporté initialement cette configuration (voir Les nouveautés de Drupal 8 : son système de configuration).

Maintenir le module activé sur le projet Drupal 8 va nous permettre de pouvoir contrôler la configuration du site pour les configurations importées. Ceci peut être particulièrement intéressant, dans le cas d'une usine à site, où nous souhaiterions pouvoir maintenir et modifier en masse les différentes configurations gérées par nos packages fonctionnels, et ainsi garantir une consistance sur tous les sites générés et propulsés par l'usine à sites. Mais ceci fera l'objet d'un prochain billet, Une usine à sites avec Drupal 8

 

Ajouter un commentaire