Menus
- Menu principal complet
- Menu footer avec liens
- (Bonus) Méga-menu
This content is not available in your language yet.
Créer un menu dropdown avec des colonnes multiples pour les catégories.
mega_menu avec la structure suivante :Boutique├── Par catégorie│ ├── Hommes│ ├── Femmes│ ├── Accessoires│ └── Chaussures├── Par marque│ ├── Nike│ ├── Adidas│ └── Puma└── Offres ├── Promotions ├── Nouveautés └── Meilleures ventesStructure du menu :
<nolink> pour les éléments parents non cliquablesTemplate menu--mega-menu.html.twig :
{% import _self as menus %}{{ menus.menu_links(items, attributes, 0) }}
{% macro menu_links(items, attributes, menu_level) %} {% import _self as menus %} {% if items %} {% if menu_level == 0 %} <ul{{ attributes.addClass('mega-menu') }}> {% else %} <ul class="mega-menu__dropdown"> {% endif %} {% for item in items %} <li{{ item.attributes.addClass([ 'mega-menu__item', item.below ? 'mega-menu__item--expanded', item.in_active_trail ? 'mega-menu__item--active-trail', ]) }}> {{ link(item.title, item.url, {'class': ['mega-menu__link']}) }}
{% if item.below and menu_level == 0 %} <div class="mega-menu__panel"> {{ menus.menu_links(item.below, attributes, menu_level + 1) }} </div> {% elseif item.below %} {{ menus.menu_links(item.below, attributes, menu_level + 1) }} {% endif %} </li> {% endfor %} </ul> {% endif %}{% endmacro %}CSS :
.mega-menu { display: flex; gap: 2rem;}
.mega-menu__item--expanded { position: relative;}
.mega-menu__panel { display: none; position: absolute; top: 100%; left: 0; background: white; box-shadow: 0 4px 20px rgba(0,0,0,0.15); padding: 1.5rem; min-width: 600px;}
.mega-menu__item--expanded:hover .mega-menu__panel { display: flex; gap: 2rem;}
.mega-menu__dropdown { list-style: none; padding: 0; min-width: 150px;}Créer un bloc promo qui s’affiche différemment selon le contexte.
Créez un type de bloc “Promo Banner” avec :
Créez 3 instances :
/shop*Masquez automatiquement le bloc après la date de fin
Type de bloc :
# Champsfield_promo_text: Text (formatted)field_promo_cta: Linkfield_promo_color: List (text) - Options: primary|Bleu, success|Vert, warning|Orange, danger|Rougefield_promo_end_date: DatePlacement avec visibilité :
“Livraison gratuite”
/shop\n/shop/*“-20% sur votre commande”
“Bienvenue”
<front>Masquage automatique (preprocess) :
// Dans tailstore.themefunction tailstore_preprocess_block(&$variables) { if ($variables['plugin_id'] === 'block_content:YOUR_UUID') { $block = $variables['content']['#block_content']; $end_date = $block->get('field_promo_end_date')->value;
if ($end_date && strtotime($end_date) < time()) { $variables['content'] = []; } }}Permettre aux utilisateurs connectés de mettre des produits en favoris.
/user/favorites)Installation :
composer require drupal/flagdrush en flag -yCréation du flag :
| Paramètre | Valeur |
|---|---|
| Flag type | Content |
| Label | Favoris |
| Machine name | favorites |
| Flag/Unflag | ♡ Ajouter aux favoris / ♥ Retirer des favoris |
| Bundles | ☑ Product |
| Link type | AJAX link |
| Global | ☐ (personnel à chaque utilisateur) |
Vue “Mes favoris” :
Add view :
Favorites/user/favoritesRelationship → Add → “Flags: User’s flaggings”
Template produit :
<div class="product-actions"> {{ content.flag_favorites }}</div>Permissions :
Créer un rôle qui ne peut modifier que les produits d’une certaine catégorie.
Installation :
composer require drupal/permissions_by_termdrush en permissions_by_term -yConfiguration :
Assignation :
Rôle :
Créer un bloc qui affiche le résumé du panier (sans Commerce).
Cette solution sera détaillée dans l’Étape 8 (Développement), mais voici la structure :
// modules/custom/tailstore_cart/tailstore_cart.module
/** * Implements hook_preprocess_block(). */function tailstore_cart_preprocess_block(&$variables) { if ($variables['plugin_id'] === 'cart_summary') { $cart = \Drupal::service('tailstore_cart.cart_manager'); $variables['content']['#items_count'] = $cart->getItemsCount(); $variables['content']['#total'] = $cart->getTotal(); }}{# block--cart-summary.html.twig #}<div class="cart-summary" hx-get="/api/cart/summary" hx-trigger="cart-updated from:body"> <span class="cart-icon">🛒</span> <span class="cart-count">{{ items_count }}</span> <span class="cart-total">{{ total|number_format(2, ',', ' ') }} €</span></div>Menus
Blocs
Permissions
Export
# Exporter toute la configurationdrush cex -y
# Commitergit add config/sync/git commit -m "feat: add navigation, blocks, and permissions"À la fin de cette étape, vous savez :
Passez à l’Étape 6 - Theming pour créer le thème personnalisé TailStore avec Tailwind CSS !