Aller au contenu

Exercices Étape 7

À la fin de ces exercices, vous aurez :

  • 📦 Installé et configuré tous les modules essentiels pour un site e-commerce professionnel
  • 🔗 Configuré des URLs automatiques SEO-friendly pour tous les contenus
  • 📊 Optimisé le référencement avec les métadonnées sociales
  • 📝 Créé des formulaires fonctionnels avec protection anti-spam
  • 🚀 Mis en place les outils pour un site maintenable et performant

Durée estimée : 20 minutes

Installer et activer tous les modules contributifs nécessaires.

Préparer l’environnement TailStore avec tous les modules.

  1. Installer les modules avec Composer

    Fenêtre de terminal
    ddev composer require \
    drupal/pathauto \
    drupal/token \
    drupal/metatag \
    drupal/webform \
    drupal/redirect \
    drupal/simple_sitemap \
    drupal/admin_toolbar \
    drupal/gin \
    drupal/honeypot
  2. Activer les modules

    Fenêtre de terminal
    ddev drush en \
    pathauto token \
    metatag metatag_open_graph metatag_twitter_cards \
    webform webform_ui \
    redirect simple_sitemap \
    admin_toolbar admin_toolbar_tools \
    honeypot -y
  3. Configurer Gin comme thème admin

    Fenêtre de terminal
    ddev drush theme:enable gin -y
    ddev drush config-set system.theme admin gin -y
  4. Vérifier l’installation

    Fenêtre de terminal
    ddev drush pm:list --status=enabled --format=table
  • Tous les modules installés sans erreur (vérifier dans composer.json)
  • Modules activés (vérifier avec drush pm:list --status=enabled)
  • Gin visible et fonctionnel dans l’administration
  • Admin Toolbar avec menus déroulants opérationnels
  • Aucune erreur dans les logs (drush ws pour watchdog)
  • Configuration exportée (ddev drush cex -y)
  • Fichiers committés (composer.json, composer.lock, config/)

💡 Commit après installation :

Fenêtre de terminal
git add composer.json composer.lock config/
git commit -m "feat(modules): install contrib modules (pathauto, metatag, webform, admin_toolbar, gin, honeypot)"

💡 Déploiement sur autre environnement :

Fenêtre de terminal
# Sur staging/production
composer install
drush cim -y
drush cr

Durée estimée : 25 minutes

Configurer les URLs automatiques pour tous les contenus.

Créer des modèles d’URL propres pour chaque type.

  1. Accéder à Pathauto

    /admin/config/search/path/patterns

  2. Créer le modèle Produits

    • Type : Contenu → Produit
    • Libellé : Produits
    • Modèle : boutique/[node:field_category:entity:name]/[node:title]
  3. Créer le modèle Articles

    • Type : Contenu → Article Blog
    • Libellé : Articles Blog
    • Modèle : blog/[node:created:custom:Y-m]/[node:title]
  4. Créer le modèle Catégories

    • Type : Terme de taxonomie → Catégorie
    • Libellé : Catégories
    • Modèle : categories/[term:name]
  5. Créer le modèle Marques

    • Type : Terme de taxonomie → Marque
    • Libellé : Marques
    • Modèle : marques/[term:name]
  6. Configurer les paramètres généraux

    /admin/config/search/path/settings

    Séparateur: "-"
    Casse: Minuscules
    Longueur max: 100
  7. Générer les alias existants

    Fenêtre de terminal
    ddev drush pathauto:aliases-generate all

Créez un produit “Pantalon Cargo” dans la catégorie “Pantalons”.

URL attendue : /boutique/pantalons/pantalon-cargo

Créez un article de blog “Tendances mode hiver 2026” publié le 14 janvier 2026.

URL attendue : /blog/2026-01/tendances-mode-hiver-2026

  • Modèle Produits créé et fonctionnel
  • Modèle Articles créé avec date dans l’URL
  • Modèle Catégories créé
  • Modèle Marques créé
  • URLs générées correctement (vérifier 3-5 contenus)
  • Translittération fonctionnelle (é → e, à → a, etc.)
  • Séparateur - appliqué
  • Longueur max respectée (< 100 caractères)
  • Alias existants régénérés
  • Configuration exportée
Fenêtre de terminal
# Lister les alias générés
ddev drush sqlq "SELECT alias, path FROM path_alias LIMIT 10"
# Vérifier un alias spécifique
ddev drush path:alias /node/42
# Compter les alias par type
ddev drush sqlq "SELECT COUNT(*) FROM path_alias WHERE path LIKE '/node/%'"

Durée estimée : 30 minutes

Optimiser les métadonnées pour le référencement.

Configurer Metatag pour les produits et le partage social.

  1. Configuration globale

    /admin/config/search/metatag

    Modifier Global :

    Titre: "[current-page:title] | TailStore"
    Description: "TailStore - Votre boutique de mode en ligne"
  2. Configuration Produit

    Ajouter un modèle pour Contenu: Produit :

    Basique :

    Titre: "[node:title] - [node:field_price:value]€ | TailStore"
    Description: "[node:field_description:summary]"

    Open Graph :

    og:type: "product"
    og:title: "[node:title]"
    og:description: "[node:field_description:summary]"
    og:image: "[node:field_images:entity:url]"
    og:site_name: "TailStore"

    Twitter Cards :

    twitter:card: "summary_large_image"
    twitter:title: "[node:title]"
    twitter:description: "[node:field_description:summary]"
    twitter:image: "[node:field_images:entity:url]"
  3. Configuration Article Blog

    Ajouter un modèle pour Contenu: Article Blog :

    og:type: "article"
    article:published_time: "[node:created:html_datetime]"
    article:author: "[node:author:display-name]"
  4. Créer un style d’image Open Graph

    /admin/config/media/image-styles/add

    • Nom : opengraph
    • Effet : Scale and crop (1200×630)
  1. Visitez un produit
  2. Affichez le code source
  3. Vérifiez les balises <meta property="og:..."
  • Métadonnées globales configurées
  • Open Graph pour les produits avec tous les champs
  • Twitter Cards configurées
  • Style d’image OG créé (1200×630px)
  • Test avec Facebook Debugger
  • Test avec Twitter Card Validator
  • Balises présentes dans le code source HTML
  • Images correctement affichées dans les validateurs
  • Configuration exportée
  1. Visitez une page produit
  2. Clic droitAfficher le code source
  3. Cherchez <meta property="og: (Ctrl+F)

Attendu :

<meta property="og:type" content="product" />
<meta property="og:title" content="T-Shirt Blanc - 29.99€ | TailStore" />
<meta property="og:description" content="T-shirt en coton bio..." />
<meta property="og:image" content="https://tailstore.ddev.site/sites/default/files/2026-01/tshirt.jpg" />
<meta property="og:site_name" content="TailStore" />
<meta property="og:url" content="https://tailstore.ddev.site/boutique/t-shirts/t-shirt-blanc" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="T-Shirt Blanc - 29.99€ | TailStore" />
<meta name="twitter:description" content="T-shirt en coton bio..." />
<meta name="twitter:image" content="https://tailstore.ddev.site/sites/default/files/2026-01/tshirt.jpg" />

Facebook :

  1. Allez sur Facebook Debugger
  2. Entrez l’URL de votre produit
  3. Cliquez Déboguer
  4. Vérifiez l’aperçu

Twitter :

  1. Allez sur Card Validator
  2. Entrez l’URL
  3. Vérifiez la Card Preview

Durée estimée : 35 minutes

Créer un formulaire de contact complet avec notifications.

Créer le formulaire de contact TailStore avec emails automatiques.

  1. Créer le webform

    /admin/structure/webform/add

    • Titre : Formulaire de contact
    • ID : contact
  2. Ajouter les éléments

    OrdreTypeCléLibelléRequis
    1Fieldsetpersonal_infoVos informations-
    2TextnameNom complet
    3EmailemailEmail
    4TelphoneTéléphone
    5Fieldsetmessage_infoVotre message-
    6SelectsubjectSujet
    7TextareamessageMessage

    Options du sujet :

    general|Question générale
    order|Suivi de commande
    return|Retour produit
    partnership|Partenariat
    other|Autre
  3. Configurer l’email admin

    /admin/structure/webform/manage/contact/handlers

    Ajouter un Email handler :

    Titre: Notification équipe
    Destinataire: contact@tailstore.com
    Sujet: "[TailStore] [webform_submission:values:subject] - [webform_submission:values:name]"
    Corps: |
    Un nouveau message a été reçu sur TailStore.
    === Expéditeur ===
    Nom: [webform_submission:values:name]
    Email: [webform_submission:values:email]
    Téléphone: [webform_submission:values:phone]
    === Message ===
    Sujet: [webform_submission:values:subject]
    [webform_submission:values:message]
    ---
    Répondre directement à cet email pour contacter le client.
    Répondre à: [webform_submission:values:email]
  4. Configurer l’email confirmation

    Ajouter un second Email handler :

    Titre: Confirmation client
    Destinataire: [webform_submission:values:email]
    Sujet: "Votre message a bien été reçu - TailStore"
    Corps: |
    Bonjour [webform_submission:values:name],
    Nous avons bien reçu votre message concernant "[webform_submission:values:subject]".
    Notre équipe vous répondra dans les 48 heures ouvrées.
    Cordialement,
    L'équipe TailStore
    ---
    Ceci est un message automatique, merci de ne pas y répondre.
  5. Configurer le message de confirmation

    /admin/structure/webform/manage/contact/settings/confirmation

    Type: Page
    Titre: Merci pour votre message !
    Message: |
    Votre message a été envoyé avec succès.
    Nous vous répondrons dans les plus brefs délais.
  6. Ajouter le formulaire à une page

    Créez une page “Contact” et intégrez le bloc Webform.

  • Formulaire créé avec tous les champs obligatoires
  • Email admin configuré avec bon format
  • Email confirmation client configuré
  • Message de confirmation affiché après soumission
  • Formulaire accessible sur /form/contact
  • Formulaire intégré dans une page ou un bloc
  • Test d’envoi fonctionnel (vérifier réception email)
  • Soumission enregistrée dans Résultats
  • Champs requis validés (erreur si vide)
  • Format email validé automatiquement
  • Configuration exportée
  1. Accéder au formulaire

    /form/contact

  2. Test validation

    • Soumettez le formulaire vide → Erreurs affichées ?
    • Email invalide : test → Erreur format ?
  3. Test soumission valide

    Remplissez tous les champs et soumettez

  4. Vérifier l’email admin

    Fenêtre de terminal
    # Voir les emails capturés par DDEV (mailpit)
    ddev launch -m

    Ou accédez à : https://tailstore.ddev.site:8026

  5. Vérifier la soumission

    /admin/structure/webform/manage/contact/results/submissions

Ajoutez des classes CSS TailStore :

# Sur chaque champ
wrapper_attributes:
class: 'mb-4'
attributes:
class: 'w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500'
# Sur le bouton submit
attributes:
class: 'btn btn-primary w-full md:w-auto'

Durée estimée : 30 minutes

Créer un formulaire multi-étapes pour les demandes de devis.

Créer un formulaire plus complexe avec wizard et champs conditionnels.

  1. Créer le webform

    • Titre : Demande de devis
    • ID : quote_request
  2. Page 1 : Informations

    wizard_page_1:
    type: wizard_page
    title: "Vos informations"
    name:
    type: textfield
    title: "Nom complet"
    required: true
    email:
    type: email
    title: "Email"
    required: true
    company:
    type: textfield
    title: "Entreprise"
    phone:
    type: tel
    title: "Téléphone"
    required: true
  3. Page 2 : Produits

    wizard_page_2:
    type: wizard_page
    title: "Produits souhaités"
    products:
    type: checkboxes
    title: "Catégories de produits"
    options:
    clothing: "Vêtements"
    shoes: "Chaussures"
    accessories: "Accessoires"
    quantity:
    type: select
    title: "Quantité estimée"
    options:
    10_50: "10 à 50 pièces"
    50_100: "50 à 100 pièces"
    100_500: "100 à 500 pièces"
    500_plus: "Plus de 500 pièces"
    details:
    type: textarea
    title: "Description des besoins"
  4. Page 3 : Budget et délai

    wizard_page_3:
    type: wizard_page
    title: "Budget et planning"
    budget:
    type: radios
    title: "Budget estimé"
    options:
    small: "Moins de 1 000€"
    medium: "1 000€ - 5 000€"
    large: "5 000€ - 20 000€"
    enterprise: "Plus de 20 000€"
    deadline:
    type: date
    title: "Date souhaitée de livraison"
    urgency:
    type: radios
    title: "Niveau d'urgence"
    options:
    low: "Faible - Plusieurs mois"
    medium: "Moyen - 1 à 2 mois"
    high: "Élevé - Moins d'un mois"
  5. Configurer la progression

    • Afficher la barre de progression
    • Permettre le retour arrière
  6. Configurer les emails

    Créer des emails personnalisés avec toutes les infos.

  • Wizard à 3 étapes créé
  • Navigation avant/arrière fonctionnelle
  • Barre de progression affichée
  • Tous les champs fonctionnels et bien labelés
  • Email récapitulatif complet avec toutes les infos
  • Test du parcours complet sans erreur
  • Données correctement enregistrées dans les résultats
  • Email reçu avec mise en forme lisible
  • Configuration exportée

Exemple de configuration email :

Titre: Demande de devis
Destinataire: devis@tailstore.com
Sujet: "[TailStore] Nouvelle demande de devis - [webform_submission:values:company]"
Corps: |
=== NOUVELLE DEMANDE DE DEVIS ===
Date: [webform_submission:created:custom:d/m/Y à H:i]
--- Informations client ---
Nom: [webform_submission:values:name]
Email: [webform_submission:values:email]
Téléphone: [webform_submission:values:phone]
Entreprise: [webform_submission:values:company]
--- Produits demandés ---
Catégories: [webform_submission:values:products]
Quantité: [webform_submission:values:quantity]
Détails: [webform_submission:values:details]
--- Budget et planning ---
Budget estimé: [webform_submission:values:budget]
Date souhaitée: [webform_submission:values:deadline:custom:d/m/Y]
Urgence: [webform_submission:values:urgency]
---
Voir la soumission complète :
[webform_submission:url]
  1. Étape 1 : Remplir les infos personnelles → Suivant
  2. Étape 2 : Sélectionner produits et quantités → Suivant
  3. Étape 3 : Budget et délai → Envoyer
  4. Vérifier : Page de confirmation + email reçu

Durée estimée : 15 minutes

Générer un sitemap pour les moteurs de recherche.

Configurer Simple Sitemap pour indexer tous les contenus.

  1. Configuration du sitemap

    /admin/config/search/simplesitemap

  2. Activer les types de contenu

    Pour chaque entité, configurer :

    TypeIndexerPriorité
    Produit0.8
    Article Blog0.6
    Page0.5
    Catégorie0.7
    Marque0.6
  3. Générer le sitemap

    Fenêtre de terminal
    ddev drush simple-sitemap:generate
  4. Vérifier

    Accédez à /sitemap.xml

  5. Soumettre à Google

    Dans Google Search Console, soumettez l’URL du sitemap.

  • Tous les types configurés dans Simple Sitemap
  • Priorités définies selon l’importance
  • Sitemap accessible à /sitemap.xml
  • URLs propres (Pathauto) dans le sitemap
  • Contenu test présent dans le sitemap
  • Fichier XML valide (pas d’erreur de syntaxe)
  • Sitemaps soumis à Google Search Console (optionnel)
  • Configuration exportée
Fenêtre de terminal
# Générer le sitemap
ddev drush simple-sitemap:generate
# Voir le contenu
curl https://tailstore.ddev.site/sitemap.xml
# Ou dans le navigateur

Exemple de sortie attendue :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://tailstore.ddev.site/</loc>
<priority>1.0</priority>
</url>
<url>
<loc>https://tailstore.ddev.site/boutique/t-shirts/t-shirt-blanc</loc>
<priority>0.8</priority>
</url>
<url>
<loc>https://tailstore.ddev.site/blog/2026-01/tendances-mode-hiver</loc>
<priority>0.6</priority>
</url>
</urlset>

Exclure certains contenus :

# Configuration → Simple Sitemap → Entités
# Pour chaque type, définir :
Inclure: Oui/Non
Priorité: 0.1 - 1.0
Changefreq: daily, weekly, monthly, yearly

Multi-sitemap (pour gros sites) : Simple Sitemap génère automatiquement plusieurs sitemaps si > 50 000 URLs


Durée estimée : 15 minutes

Protéger les formulaires contre le spam.

Configurer Honeypot et limiter les soumissions.

  1. Vérifier Honeypot

    /admin/config/content/honeypot

    Protéger tous les formulaires: Oui
    Délai minimum: 5 secondes
  2. Limiter les soumissions Webform

    Pour chaque formulaire :

    /admin/structure/webform/manage/[id]/settings/submissions

    Limite par utilisateur: 3 par jour
    Limite totale: 50 par jour
    Message: "Vous avez atteint la limite..."
  3. Tester

    Essayez de soumettre trop rapidement (< 5 secondes).

  • Honeypot activé sur tous les formulaires
  • Délai minimum configuré (5 secondes)
  • Limites de soumission définies par formulaire
  • Message d’erreur clair pour l’utilisateur
  • Test : soumission trop rapide bloquée
  • Test : limite de soumissions respectée
  • Configuration exportée
  1. Accéder au formulaire : /form/contact

  2. Ouvrir les outils développeur (F12)

  3. Inspecter le formulaire

    Chercher un champ caché (probablement <input name="url" type="text" style="display:none">)

  4. Tester la soumission rapide

    Remplir et soumettre en < 5 secondes → Refus attendu

  5. Tester après délai

    Attendre > 5 secondes puis soumettre → Succès attendu

Fenêtre de terminal
# Simuler plusieurs soumissions
ddev drush webform:test contact --num=4
# La 4ème devrait être refusée si limite = 3

Ou testez manuellement en soumettant le formulaire 4 fois.

Surveiller les tentatives de spam :

Fenêtre de terminal
# Voir les soumissions récentes
ddev drush sqlq "SELECT * FROM webform_submission ORDER BY created DESC LIMIT 10"
# Logs Honeypot
# Rapports → Journaux récents → Filtrer "honeypot"

Ajuster les paramètres si nécessaire :

  • Augmenter le délai minimum (10-15 secondes)
  • Réduire les limites de soumission
  • Ajouter CAPTCHA en cas de spam persistant

Modules installés

✅ 9 modules contributifs ✅ Configuration complète ✅ Tests validés

URLs propres

✅ Pathauto configuré ✅ Modèles pour tous types ✅ Translittération active

SEO optimisé

✅ Metatag complet ✅ Open Graph + Twitter ✅ Sitemap XML généré

Formulaires

✅ Contact fonctionnel ✅ Devis multi-étapes ✅ Anti-spam actif

  • Tous les modules installés via Composer
  • Modules activés via Drush
  • Gin theme admin activé
  • Admin Toolbar opérationnel
  • Pathauto : modèles créés pour tous les types
  • Token installé et fonctionnel
  • Redirect installé pour les anciennes URLs
  • Alias générés pour contenus existants
  • Metatag : configuration globale
  • Metatag : configuration par type de contenu
  • Open Graph configuré (Facebook, LinkedIn)
  • Twitter Cards configuré
  • Images OG au bon format (1200×630)
  • Testé avec validateurs sociaux
  • Simple Sitemap généré (/sitemap.xml)
  • Webform installé et activé
  • Formulaire contact créé et testé
  • Formulaire devis (wizard) créé
  • Emails admin configurés
  • Emails confirmation client configurés
  • Honeypot activé
  • Limites de soumission définies
  • Honeypot sur tous les formulaires
  • Délai anti-spam configuré (5+ secondes)
  • Limites de soumission par utilisateur
  • Messages d’erreur clairs
  • Configuration exportée (drush cex -y)
  • composer.json et composer.lock à jour
  • Fichiers de config dans config/sync/
  • Tout committé dans Git
Fenêtre de terminal
# Exporter toute la configuration
ddev drush cex -y
# Vérifier les fichiers exportés
ls -la config/sync/ | grep -E "(pathauto|metatag|webform)"
# Commit
git add composer.json composer.lock config/
git commit -m "feat(step7): configure contrib modules (pathauto, metatag, webform, sitemap, security)
- URLs automatiques avec Pathauto pour tous les types de contenu
- SEO optimisé avec Metatag, Open Graph, Twitter Cards
- Formulaires contact et devis avec Webform
- Sitemap XML pour moteurs de recherche
- Sécurité anti-spam avec Honeypot
- Interface admin améliorée avec Gin et Admin Toolbar"
git push origin main
  • URLs lisibles : /boutique/t-shirts/t-shirt-blanc au lieu de /node/42
  • Partage social optimisé : Beaux aperçus sur Facebook, Twitter, LinkedIn
  • Indexation améliorée : Sitemap XML pour Google
  • Redirections : Pas de liens cassés
  • Formulaires professionnels : Contact, devis, newsletter
  • Interface admin moderne : Gin + Admin Toolbar = gain de productivité
  • Performance : Configuration optimisée
  • Maintenabilité : Configuration versionnée
  • Sécurité : Protection anti-spam
  • Scalabilité : Modules éprouvés par la communauté

Les modules sont configurés ! Dans l’Étape 8, nous développerons nos propres modules custom pour les fonctionnalités spécifiques à TailStore.