Drupal 10
Le guide complet pour le développement de solutions web robustes
Avant-propos
1. Public concerné et prérequis19
2. Objectifs20
3. Méthodologie20
4. Conclusion21
Chapitre 1
Introduction à Drupal 10
1. Historique et évolution23
1.1 Évolution de Drupal23
1.2 Nouveautés et améliorations25
2. Avantages de Drupal25
2.1 Liberté de création26
2.2 Flexibilité et extensibilité27
2.3 Robustesse et sécurité28
2.4 Communauté active28
2.5 Écosystème modulaire29
3. Pourquoi choisir Drupal ?29
3.1 Flexibilité et polyvalence29
3.1.1 Gestion de contenu et plus29
3.1.2 Enjeux multiples30
3.1.3 Fonctionnalités personnalisées30
3.2 Comparaison avec d'autres CMS30
3.2.1 WordPress30
3.2.2 Joomla !31
3.2.3 Magento31
3.2.4 PrestaShop31
3.2.5 Wix31
3.3 Thèmes et flexibilité de design32
3.3.1 Flexibilité pour des designs personnalisés32
3.3.2 Thèmes Drupal vs thèmes d'autres CMS32
3.3.3 Adaptabilité aux besoins esthétiques32
3.4 Cas d'utilisation courants33
3.5 Cas où Drupal peut ne pas convenir33
3.6 Conclusion34
Chapitre 2
Préparation de l'environnement
1. Installation de l'environnement de développement35
1.1 Prérequis système35
1.1.1 Prérequis généraux35
1.1.2 Prérequis par système d'exploitation36
1.2 Installation de Docker36
1.2.1 Installation de Docker avec WSL2 sous Windows37
1.2.2 Installation de Docker sur macOS38
1.2.3 Installation de Docker sur Linux39
1.3 Surcouche Docker pour Drupal39
1.3.1 DDEV (recommandé)40
1.3.2 Lando40
1.3.3 Docker4Drupal41
1.3.4 Docksal41
2. Installation de Drupal 1042
2.1 Préparation de DDEV42
2.1.1 Créez un répertoire pour votre projet42
2.1.2 Configuration de DDEV43
2.1.3 Démarrage de DDEV43
2.2 Nouveau projet Drupal via Composer44
2.3 Racine du projet et Docroot45
2.3.1 La racine du projet45
2.3.2 Le Docroot46
2.4 Installation de Drush47
2.5 Site simple et multisite48
2.5.1 Site simple48
2.5.2 Multisite49
2.6 Paramètres de site Drupal50
2.6.1 Le fichier sites/default/settings. php50
2.6.2 Le fichier sites/example. settings. local. php51
2.6.3 Cas particulier : settings. ddev. php51
3. Répertoires spéciaux52
3.1 Fichiers temporaires52
3.2 Fichiers publics52
3.3 Fichiers privés53
3.4 Fichiers de configuration53
4. Modules Drupal54
4.1 Installer un module via Composer55
4.2 Désinstaller un module Drupal56
4.3 Appliquer un correctif via Composer57
4.4 Mettre à jour un module58
4.4.1 Afficher les mises à jour disponibles59
4.4.2 Mettre à jour les modules59
4.4.3 Appliquer les mises à jour de la base de données59
4.4.4 Reconstruire le cache Drupal60
4.4.5 Aller plus loin.60
Chapitre 3
Création de modules personnalisés
1. Introduction61
2. Structure d'un module Drupal62
3. Création d'un module simple65
3.1 Création de la structure65
3.2 Fichier. info. yml65
3.3 Fichier. module66
3.4 Contrôleur67
3.5 Fichier. routing67
3.6 Reconstruire le cache68
3.7 Activation du module69
3.8 Vérification70
4. Drush pour générer du code71
5. Utilisation des hooks71
5.1 Utiliser un hook existant72
5.2 Créer ses propres hooks73
5.2.1 Alter hooks74
5.2.2 Hooks normaux75
5.2.3 Alter hooks vs hooks normaux76
Chapitre 4
Types de contenu
1. Introduction79
1.1 Exemples courants80
2. Gérer les types de contenu81
2.1 Créer un type de contenu81
2.2 Modifier un type de contenu83
2.3 Supprimer un type de contenu84
2.4 Paramétrer un type de contenu84
2.4.1 Paramètres du formulaire de soumission85
2.4.2 Options de publication86
2.4.3 Paramètres d'affichage86
2.4.4 Paramètres des menus87
2.5 Autres sections88
2.5.1 Gérer les champs (Manage fields)88
2.5.2 Gérer l'affichage du formulaire (Manage form display)89
2.5.3 Gérer l'affichage (Manage display)90
2.5.4 Gérer les permissions (Manage permissions)90
3. Les champs92
3.1 Gestion des champs92
3.1.1 Créer un champ92
3.1.2 Paramétrer le champ94
3.1.3 Finaliser le champ95
3.1.4 Réutiliser un champ existant96
3.2 Affichage du formulaire98
3.2.1 Les widgets de champ99
3.2.2 Tester le formulaire101
3.3 Affichage du contenu103
3.3.1 Les formatters de champ105
3.3.2 Tester l'affichage106
3.3.3 Accéder à la liste des contenus109
Chapitre 5
Entités personnalisées
1. Introduction111
1.1 Cas d'utilisation112
1.1.1 Suivi d'événements dans un calendrier112
1.1.2 Gestion de produits dans un site e-commerce112
1.1.3 Suivi des performances des employés113
1.2 En résumé114
2. Entités simples et bundleables115
2.1 Entité simple115
2.2 Entité bundleable115
2.3 Génération d'entités avec Drush116
3. Générer une entité simple117
3.1 Fichiers impactés120
3.2 Personnalisation des champs125
4. Générer une entité bundleable130
4.1 Fichiers impactés et adaptations132
4.2 Personnalisation des champs134
4.3 Champs de base (Base Fields)136
4.3.1 Avantages et inconvénients136
4.3.2 Cas d'utilisation137
Chapitre 6
Structures Drupal
1. Introduction145
1.1 Concept de structure dans Drupal145
1.2 Types de contenu et entités personnalisées146
2. La taxonomie146
2.1 Création et gestion des vocabulaires147
2.1.1 Créer des vocabulaires147
2.1.2 Gérer les termes148
2.1.3 Ajouter des champs à un vocabulaire150
2.2 Champ de référence à des termes de taxonomie151
2.3 Bonnes pratiques155
3. Les blocs156
3.1 Types de blocs et blocs de contenu157
3.1.1 Gérer les types de blocs157
3.1.2 Gérer les blocs de contenus159
3.2 Placement des blocs161
3.3 Bonnes pratiques166
4. Les menus168
4.1 Création et gestion des menus169
4.2 Liens de menu171
4.2.1 Ajouter un lien de menu171
4.2.2 Modifier un lien de menu173
4.2.3 Supprimer un lien de menu173
4.3 Attribution de menus à des régions174
4.4 Bonnes pratiques176
5. Les Display Modes178
5.1 View Modes pour l'affichage de contenu178
5.1.1 Personnaliser un View Mode179
5.1.2 Afficher une entité dans un View Mode182
5.1.3 Créer un View Mode personnalisé185
5.1.4 Bonnes pratiques188
5.2 Form Modes pour l'affichage de formulaire188
5.2.1 Créer un Form Mode personnalisé189
5.2.2 Afficher un Form Mode personnalisé192
Chapitre 7
Utilisateurs et permissions
1. Introduction197
2. Gérer les comptes utilisateurs198
2.1 Créer un compte utilisateur198
2.1.1 Création manuelle198
2.1.2 Inscription par l'utilisateur200
2.2 Administrer les comptes utilisateurs203
2.2.1 Annulation de compte utilisateur204
2.3 Personnaliser les comptes utilisateurs206
2.3.1 Ajout de champs personnalisés206
2.3.2 Affichage et gestion des champs207
3. Rôles et permissions208
3.1 Définition des rôles209
3.2 Attribution des permissions211
3.2.1 Bonnes pratiques213
4. Permissions personnalisées214
4.1 Permissions simples214
4.1.1 Création d'une permission simple214
4.1.2 Utilisation dans le code216
4.1.3 Utilisation dans le fichier de routing217
4.2 Permissions d'entités personnalisées218
4.2.1 Déclaration des permissions219
4.2.2 Création de la classe ProjectAccessControlHandler220
4.2.3 Référencement de la classe dans l'entité Project223
4.2.4 Vérification du fonctionnement224
4.3 Permissions dynamiques225
4.3.1 Génération des permissions226
4.3.2 Déclarer la classe générant des permissions228
4.3.3 Définir la logique d'accès228
4.3.4 Vérification du fonctionnement230
Chapitre 8
Views
1. Introduction233
1.1 Qu'est-ce qu'une View ?233
1.2 Vue d'ensemble235
1.2.1 Les composants235
1.2.2 Réglages du display237
1.2.3 Réglages de base et avancés238
2. Administration des Views242
3. Gestion des composants248
3.1 Définir le format248
3.2 Gérer les champs249
3.3 Critères de filtrage260
3.3.1 Critère de filtrage simple261
3.3.2 Critère de filtrage exposé263
3.4 Critères de tri267
3.4.1 Critère de tri simple269
3.4.2 Critère de tri exposé270
4. Réglages de base272
4.1 Header et Footer272
4.2 Absence de résultats275
4.3 Pagination277
5. Réglages avancés280
5.1 Les relations281
5.2 Filtres contextuels285
5.3 Options du formulaire exposé289
5.4 Autres réglages290
6. Gestion de différents displays292
7. Intégration des Views dans le code301
Chapitre 9
Manipuler les entités
1. Introduction305
2. Chargement des entités307
2.1 Entity::load vs EntityTypeManageru::load308
2.2 Valeurs de champs309
2.2.1 Champ à valeur unique309
2.2.2 Champ à valeur multiple310
2.3 Tester les entités312
3. Opérations sur les entités313
3.1 Création d'entités313
3.2 Modification d'entités314
3.3 Suppression d'une entité316
4. Requêtes avec EntityQuery316
4.1 Requêtes simples317
4.1.1. Déclaration du type d'entité317
4.1.2 Filtrer en utilisant les conditions318
4.1.3 Pagination et tri319
4.1.4 Exécution de la requête320
4.1.5 Compter les résultats321
4.2 Requêtes avancées321
4.2.1 Propriétés de champs321
4.2.2 Champs d'entités référencés322
4.2.3 Conditions OR322
4.2.4 Groupe de conditions (OR et AND)323
5. Affichage des entités323
5.1 Préparation du contrôleur324
5.2 Renderable Array327
5.3 Affichage d'un champ329
5.4 Affichage d'un View Mode d'entité331
Chapitre 10
Les configurations
1. Introduction335
1.1 Contenus et configurations335
1.2 Gestion et stockage336
2. Exporter des configurations340
3. Importer des configurations342
4. Ignorer des configurations343
5. Les états (states)344
5.1 Mise en maintenance du site345
5.2 Autre cas d'utilisation347
Chapitre 11
Langues et localisation
1. Introduction349
1.1 Gérer les langues351
.2 Ajout de nouvelles langues352
1.3 Détection et sélection353
1.4 Changement de langue355
2. Traduire l'interface358
2.1 Administrer la traduction d'interface361
2.2 Rendre traduisibles des chaînes de caractères363
2.2.1 En PHP363
2.2.2 En Twig366
2.2.3 En JavaScript367
2.2.4 Contexte de traduction368
2.3 Exporter et importer des traductions371
2.3.1 Exporter des traductions371
2.3.2 Importer des traductions374
3. Traduire les contenus376
3.1 Activer la traduction des contenus377
3.2 Ajouter des traductions aux contenus381
3.3 Views et contenus traduits383
3.3.1 Affichage exclusif des contenus traduits385
3.3.2 Affichage de la traduction avec repli sur l'original387
4. Traduire les configurations390
4.1 Traduire la configuration d'entités392
4.2 Traduire la configuration des champs394
4.3 Traduire les configurations spécifiques396
4.4 Exporter les traductions de configuration399
Chapitre 12
Les formulaires
1. Introduction401
2. Formulaire personnalisé402
2.1 Les variables $form et $form_state406
2.2 Form API et documentation409
2.3 Les éléments de formulaire410
2.3.1 Textfield410
2.3.2 Textarea411
2.3.3 Select411
2.3.4 Checkbox412
2.3.5 Radios et Checkboxes413
2.4 Les éléments spéciaux414
2.4.1 markup414
2.4.2 container415
2.4.3 submit416
2.4.4 button418
2.4.5 actions418
2.5 Validation419
2.5.1 Type de champ et attributs419
2.5.2 Champ obligatoire420
2.5.3 Validation par élément421
2.5.4 Validation du formulaire422
2.6 Soumission424
2.7 Les states426
2.8 AJAX427
2.8.1 Utilisation simple428
2.8.2 Utilisation des AJAX Callback Commands429
3. Formulaire de configuration431
3.1 Générer le formulaire de configuration431
3.2 Sauvegarde et configuration par défaut437
3.3 Lire et manipuler une configuration438
3.3.1 Lire la configuration438
3.3.2 Modifier la configuration439
3.3.3 Supprimer la configuration439
Chapitre 13
Techniques avancées
1. Introduction441
2. Librairies personnalisées442
2.1 Créer et déclarer une librairie442
2.1.1 Importance de Once JS avec BigPipe444
2.1.2 Fichiers JavaScript et CSS444
2.2 Injecter une librairie446
2.3 Utiliser les drupalSettings446
3. Services447
3.1 Créer des services personnalisés447
3.2 Utiliser les services personnalisés450
3.3 Optimiser l'appel des services451
4. Tâches planifiées et traitement par lots452
4.1 Tâches CRON452
4.1.1 Déclencher les tâches CRON453
4.1.2 Administrer les tâches CRON456
4.1.3 Créer une tâche CRON personnalisée457
4.2 Queue Worker459
4.2.1 Créer un Queue Worker459
4.2.2 Ajouter des éléments à une queue462
4.3 Opérations Batch463
4.3.1 Préparation du Batch465
4.3.2 Ajout d'opérations466
4.3.3 Finalisation et exécution du batch467
4.3.4 Fonctions de rappels467
4.3.5 Fonction de finalisation469
4.3.6 Résultat et visualisation470
5. Événements et abonnés d'événements472
5.1 S'abonner à un événement472
5.2 Événements personnalisés476
5.3 Déclencher les événements477
Chapitre 14
Performance et cache
1. Introduction479
2. Compression et Cache Navigateur480
2.1 Activer les compressions480
2.2 Browser Caching481
2.2.1 Apache et. htaccess482
2.2.2 Cache-Control max-age483
2.3 Vider le cache484
3. Gérer le cache Drupal485
3.1 Modules de cache486
3.1.1 Internai Page Cache486
3.1.2 Internai Dynamic Page Cache486
3.2 Cache Tags488
3.2.1 Les différents types de Cache Tags489
3.2.2 Invalidation du cache basé sur les tags491
3.2.3 Ajout de Cache Tags492
3.3 Cache Context494
3.3.1 Assignation de Cache Contexts495
3.3.2 Cumul des Cache Contexts496
3.4 Cache max-age497
3.5 Cache API498
3.5.1 Écrire dans le cache498
3.5.2 Récupérer un élément en cache498
3.5.3 Invalider ou supprimer le cache499
3.5.4 Utiliser des Cache Tags499
4. Les styles d'image500
4.1 Créer un style d'image500
4.2 Utiliser un style d'image504
4.2.1 Depuis un champ Image504
4.2.2 Depuis le code507
4.3 Bonnes pratiques509
4.4 Aller plus loin510
Chapitre 15
Les plugins
1. Introduction513
2. Bloc dynamique514
2.1 Création d'un plugin de type bloc515
2.2 Utilisations avancées518
2.2.1 Afficher les articles adjacents518
2.2.2 Afficher un formulaire523
3. Élément de menu dynamique525
3.1 Création d'un élément de menu dynamique526
3.2 Configuration de l'élément de menu528
3.3 Intégration dans un menu spécifique529
3.4 Test de l'affichage530
4. Type de champ531
4.1 Field Type533
4.2 Field Widget542
4.3 Field Formatter547
4.4 Test et vérification551
Chapitre 16
Thème personnalisé
1. Introduction557
1.1 Pourquoi utiliser un thème existant ?557
1.2 Quelques thèmes notables559
2. Gérer les thèmes560
2.1 Installer et activer un thème560
2.2 Créer un sous-thème564
3. Structure d'un thème569
3.1 Déclaration (info. yml)569
3.2 Fichier. theme572
3.3 Libraries573
3.3.1 SCSS et CSS573
3.3.2 JavaScript574
3.3.3 Multiple libraries576
3.4 Breakpoints577
4. Personnaliser le thème578
4.1 Activer le mode debug578
4.2 Surcharger un template580
4.2.1 Suggestions de template581
4.2.2 Identifier le template à surcharger584
4.2.3 Créer le fichier de template584
4.2.4 Enregistrer et tester586
4.2.5 Gérer les variables587
4.3 Gérer les régions592
4.3.1 Créer une région593
4.3.2 Placer des blocs dans la nouvelle région595
4.3.3 Finaliser l'apparence595
Index599