Skip to content

Étape 6 - Theming Drupal

This content is not available in your language yet.

⏱️ Durée estimée : 5h

À la fin de cette étape, vous serez capable de :

  • ✅ Créer un thème personnalisé Drupal
  • ✅ Comprendre le système de templates Twig
  • ✅ Personnaliser l’affichage du contenu
  • ✅ Ajouter des CSS et JavaScript au thème
  • ✅ Intégrer Tailwind CSS dans Drupal
  • ✅ Utiliser Alpine.js pour les interactions
  • Étape 5 terminée (navigation, blocs, menus)
  • HTML/CSS : Structure sémantique, flexbox/grid, responsive design
  • Twig : Notion de templating (sera approfondi dans cette étape)
  • Template TailStore analysé (référence visuelle depuis l’Étape 1)
  • Node.js >= 18.x et npm >= 9.x installés (pour Tailwind/Alpine.js)
Fenêtre de terminal
# Node.js et npm (pour Tailwind/Alpine)
node --version # >= 18.x
npm --version # >= 9.x
# Composer (pour dépendances Drupal)
composer --version # >= 2.x
# Drush
drush --version # >= 12.x
Fenêtre de terminal
# Sauvegarder la base de données avant modifications
drush sql:dump > backup-avant-etape6.sql
# En cas de problème, restaurer avec :
# drush sql:cli < backup-avant-etape6.sql
Fenêtre de terminal
# Désactiver le cache pour voir les modifications en temps réel
drush state:set system.performance css_preprocess 0 --input-format=string
drush state:set system.performance js_preprocess 0 --input-format=string
drush cr

Approche progressive : Nous suivrons une méthodologie logique — d’abord la structure du thème, puis les outils (CSS/JS), ensuite les templates Twig pour personnaliser l’affichage, et enfin l’interactivité avec Alpine.js.

1. Créer un thème

Structure et fichiers de base d’un thème. Voir →

2. Templates Twig

Personnaliser l’affichage avec Twig. Voir →

3. Assets (CSS/JS)

Ajouter des librairies CSS et JavaScript. Voir →

4. Tailwind CSS

Intégrer Tailwind CSS v4 dans Drupal. Voir →

5. Alpine.js

Ajouter des interactions dynamiques. Voir →

themes/custom/tailstore/
├── tailstore.info.yml # Déclaration du thème
├── tailstore.libraries.yml # CSS et JS
├── tailstore.theme # Fonctions PHP
├── tailstore.breakpoints.yml # Points de rupture responsive
├── css/
│ ├── base/
│ │ ├── reset.css
│ │ └── typography.css
│ ├── components/
│ │ ├── buttons.css
│ │ ├── cards.css
│ │ ├── forms.css
│ │ └── navigation.css
│ ├── layout/
│ │ ├── grid.css
│ │ └── regions.css
│ └── tailstore.css # Import principal
├── js/
│ ├── tailstore.js # Scripts principaux
│ ├── cart.js # Panier
│ └── slider.js # Carousel
├── images/
│ ├── logo.svg
│ └── icons/
├── templates/
│ ├── layout/
│ │ ├── page.html.twig
│ │ └── region.html.twig
│ ├── block/
│ │ ├── block.html.twig
│ │ └── block--system-branding-block.html.twig
│ ├── node/
│ │ ├── node.html.twig
│ │ ├── node--product.html.twig
│ │ ├── node--product--teaser.html.twig
│ │ └── node--product--card.html.twig
│ ├── field/
│ │ └── field--field-price.html.twig
│ ├── views/
│ │ └── views-view--products-catalog.html.twig
│ └── misc/
│ ├── pager.html.twig
│ └── breadcrumb.html.twig
└── config/
└── install/
└── tailstore.settings.yml

💡 Pourquoi des tokens ?

  • Centraliser les valeurs de design (couleurs, espacements, typographie)
  • Faciliter le rebranding (modifier une variable = tout le site)
  • Supporter le mode sombre (dark mode) facilement
  • Assurer la cohérence visuelle sur tout le site
VariableHexUsage
--color-primary#0073e6Actions principales
--color-secondary#6c757dActions secondaires
--color-success#28a745Succès, en stock
--color-warning#ffc107Alertes
--color-danger#dc3545Erreurs, soldes
--color-dark#1a1a2eTexte principal
--color-light#f8f9faArrière-plans
ÉlémentFontSizeWeight
H1Inter2.5rem700
H2Inter2rem600
H3Inter1.5rem600
BodyInter1rem400
SmallInter0.875rem400
PriceInter1.25rem700
--spacing-xs: 0.25rem; /* 4px */
--spacing-sm: 0.5rem; /* 8px */
--spacing-md: 1rem; /* 16px */
--spacing-lg: 1.5rem; /* 24px */
--spacing-xl: 2rem; /* 32px */
--spacing-2xl: 3rem; /* 48px */
Fenêtre de terminal
# Désactiver l'agrégation CSS/JS via Drush
drush state:set system.performance css_preprocess 0 --input-format=string
drush state:set system.performance js_preprocess 0 --input-format=string

Activer le débogage Twig dans sites/default/services.yml :

parameters:
twig.config:
debug: true
auto_reload: true
cache: false
Fenêtre de terminal
# Vider le cache après modification
drush cr
Fenêtre de terminal
# Cache des templates
drush cr
# Cache des CSS (si agrégation activée)
drush cc css-js
  • Drupal Syntax Highlighting
  • Twig Language 2
  • Tailwind CSS IntelliSense
  • Alpine.js IntelliSense
  1. Activez le débogage Twig
  2. Inspectez le HTML source pour voir :
    • Les suggestions de templates
    • Les variables disponibles
    • Les chemins des fichiers
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'node' -->
<!-- FILE NAME SUGGESTIONS:
* node--product--full.html.twig
* node--product.html.twig
* node--1.html.twig
* node.html.twig
-->
<!-- BEGIN OUTPUT from 'themes/custom/tailstore/templates/node/node--product.html.twig' -->

📊 Composants à créer (par ordre de développement)

Section intitulée « 📊 Composants à créer (par ordre de développement) »

Stratégie : Commencer par les composants de base (header, footer), puis les éléments de contenu (produits), et enfin les interactions avancées (slider, panier dynamique).

PrioritéComposantTemplateDifficultéÉtapeTemps
🔴 1Header + Logoblock--system-branding-block.html.twig⭐ Facile6.1-6.230min
🔴 2Footerregion--footer.html.twig⭐ Facile6.230min
🔴 3Product Cardnode--product--card.html.twig⭐⭐ Moyen6.21h
🟠 4Product Teasernode--product--teaser.html.twig⭐⭐ Moyen6.245min
🟠 5Homepage Layoutpage--front.html.twig⭐⭐ Moyen6.41h30
🟠 6Shop/Catalogpage--shop.html.twig⭐⭐ Moyen6.41h
🟡 7Mega Menumenu--main.html.twig⭐⭐⭐ Difficile6.52h
🟡 8Hero Sliderblock--hero-banner.html.twig⭐⭐⭐ Difficile6.52h
🟢 9Cart Icon (dynamique)block--cart-summary.html.twig⭐⭐⭐ Difficile6.51h30
🔵 10Fiche produit complètenode--product--full.html.twig⭐⭐⭐⭐ Expert6.2-6.52h

Légende priorités :

  • 🔴 Priorité haute — Fondations du thème (commencer par là)
  • 🟠 Priorité moyenne — Contenu principal (après les bases)
  • 🟡 Priorité basse — Fonctionnalités avancées (quand le reste fonctionne)
  • 🔵 Bonus/Expert — Fonctionnalités complexes (si temps disponible)

Le thème suit une approche atomique pour une maintenabilité optimale :

  • Boutons : .btn, .btn-primary, .btn-secondary
  • Champs de formulaire : .form-input, .form-select
  • Icônes : .icon, .icon--large
  • Product Card : Image + titre + prix + bouton
  • Search Bar : Input + bouton recherche
  • Navigation Item : Lien + icône
  • Header : Logo + menu + recherche + panier
  • Footer : Liens + newsletter + réseaux sociaux
  • Product Grid : Collection de product cards
1. Homepage → 2. Catalogue → 3. Fiche produit → 4. Panier → 5. Checkout → 6. Confirmation
(page.html) (views) (node--product) (custom) (custom) (custom)

Chaque étape nécessite des templates et styles spécifiques.

Symptôme : Modifications CSS/Twig non visibles dans le navigateur
Solution : drush cr après CHAQUE modification de template ou CSS
💡 Astuce : En mode dev avec cache: false, seul le cache de routing nécessite un flush

Problème : Conflits entre utility classes et CSS personnalisé
Bonne pratique : Utiliser Tailwind à 95%, CSS custom pour <5% des cas exceptionnels
Exemple valide : Animations complexes, reset CSS spécifique

Danger : Modifications perdues lors des mises à jour Drupal
Bonne pratique : TOUJOURS copier les templates dans themes/custom/tailstore/templates/
Jamais : Modifier directement dans core/themes/ ou modules/contrib/

Problème : node.html.twig s’applique à TOUS les types de contenu
Bonne pratique : Utiliser les suggestions spécifiques :

  • node--product--full.html.twig (type + mode d’affichage)
  • node--product.html.twig (type de contenu)
  • node.html.twig (trop large)

Problème : Site cassé sur mobile/tablette
Bonne pratique : Tester sur plusieurs tailles (F12 → Toggle Device Toolbar)
Points de rupture Tailwind : sm: (640px), md: (768px), lg: (1024px), xl: (1280px)

❌ Erreur 6 : Charger tous les assets globalement

Section intitulée « ❌ Erreur 6 : Charger tous les assets globalement »

Problème : 200KB de JS/CSS sur toutes les pages, même inutiles
Bonne pratique : Charger conditionnellement via hook_preprocess_HOOK()
Exemple : Slider JS uniquement sur la homepage

À la fin de l’étape 6, vous devrez avoir réalisé :

  • Thème fonctionnel : Structure complète avec tailstore.info.yml et tailstore.libraries.yml
  • 3 templates Twig personnalisés : Au minimum header, product card, footer
  • Tailwind CSS intégré : Configuration fonctionnelle avec purge activé
  • 1 interaction Alpine.js : Menu mobile, modale, ou panier dynamique
  • Homepage stylisée : Reprenant visuellement le template TailStore

Fonctionnel : Le site affiche correctement tous les contenus
Responsive : Mise en page adaptée mobile/tablette/desktop
Performance : CSS < 100KB, pas de JS inutile chargé
Code propre : Templates commentés, structure logique
Debug désactivé : Pas de {{ dump() }} oublié dans les templates

Après chaque sous-étape, vérifiez :

Sous-étapeRésultat visible
6.1 Création thèmeThème activable dans l’admin, logo affiché
6.2 TwigHeader et footer personnalisés visibles
6.3 AssetsCSS chargé (inspecter le <head>)
6.4 TailwindClasses Tailwind appliquées (ex: bg-blue-500 fonctionne)
6.5 Alpine.jsMenu mobile ou interaction fonctionnelle
  • Olivero (thème par défaut Drupal 10/11) : Système de tokens CSS moderne
  • Claro (admin theme) : Composants UI accessibles
  • Gin (contrib) : Interface admin moderne avec design system
  • Tailwind UI : Composants e-commerce prêts à l’emploi (payant)
  • Flowbite : Composants Tailwind + Alpine.js (gratuit)
  • DaisyUI : Framework de composants basé sur Tailwind
  • Headless UI : Composants accessibles sans style (à combiner avec Tailwind)

Extensions VS Code recommandées :

  • Drupal Syntax Highlighting : Coloration syntaxique Drupal
  • Twig Language 2 : Support Twig avec autocomplétion
  • Tailwind CSS IntelliSense : Autocomplétion classes Tailwind
  • Alpine.js IntelliSense : Support Alpine.js

Vous avez maintenant une vision complète de l’étape 6. Commencez par Créer le thème.