Vue d'ensemble
- Module
websourcebrands, classeWebsourceBrands, espace de nomsWebsource\Brands(PSR-4,vendor/autoload.phpfourni). - Implémente
WidgetInterface. Configuration dans la page Configurer du module (getContent()), avec un contrôleur d'administrationAdminWebsourceBrandsréservé à l'aperçu AJAX. - Aucune table : un seul réglage JSON par boutique,
WSBRANDS_SETTINGS. - Cache fichier JSON dans
var/cache/<env>/websourcebrands/(10 minutes, séparé par boutique et langue), vidé à l'enregistrement et aux hooksactionObjectManufacturer{Add,Update,Delete}After.
Hooks
Hooks d'affichage (greffés selon les emplacements choisis)
| Clé d'emplacement | Libellé | Hook | Page imposée |
|---|---|---|---|
home | Page d'accueil, dans le contenu | displayHome | home |
under_header | Sous l'en-tête (pleine largeur) | displayNavFullWidth | au choix |
page_top | En haut du contenu de la page | displayWrapperTop | au choix |
page_bottom | En bas du contenu de la page | displayWrapperBottom | au choix |
product_footer | Sous la fiche produit | displayFooterProduct | product |
before_footer | Juste au-dessus du pied de page | displayFooterBefore | au choix |
footer | Dans le pied de page | displayFooter | au choix |
after_footer | Tout en bas, sous le pied de page | displayFooterAfter | au choix |
left_column / right_column | Colonnes latérales | displayLeftColumn / displayRightColumn | au choix |
custom | Un autre emplacement (avancé) | tout display* saisi | au choix |
Pages reconnues (Hook\PageDetector) : all, home, category, product, brand, cms, search, cart, contact, notfound. Hook\HookSynchronizer greffe et dégreffe par boutique les hooks nécessaires (Placements::hooksOf()), en plus des hooks fixes.
Hooks fixes
| Hook | Rôle |
|---|---|
actionFrontControllerSetMedia | Charge views/css/front.css et, pour le carrousel et la liste seulement, views/js/front.js, uniquement si le bloc s'affiche sur la page. |
displayHeader | JSON-LD schema.org si l'option est active : nœud Brand (<url>#brand) sur la page d'une marque, ItemList de Brand sur la page « liste des marques ». |
actionObjectManufacturerAddAfter, …UpdateAfter, …DeleteAfter | Vident le cache. |
actionWebsourceBuilderRegisterBlocks | Déclare le bloc « Marques » au Websource Builder. |
actionWebsourceThemeExport / actionWebsourceThemeImport | Section brands (version 1) des paquets .wsxtheme : disposition, design, emplacements, titres par ISO ; marques par clé stable brand:slug. |
Widget Smarty
{widget name='websourcebrands'}
{widget name='websourcebrands' layout='carousel' limit='10' grayscale='0' title='Nos partenaires'}
Options acceptées : toutes les clés de Settings::defaults() et title (qui renseigne title_override et show_title).
| Clé | Type / valeurs | Défaut |
|---|---|---|
layout | grid, carousel, list | grid |
columns | 2 à 8 | 6 |
limit | 0 (toutes) à 60 | 12 |
sort | name, manual, products | name |
selection | all, only, except | all |
brand_ids, manual_order | tableaux d'identifiants | [] |
only_with_products, show_name, show_count, grayscale, autoplay, schema, show_title, inherit_design, borders | booléens | voir défauts (grayscale, autoplay, only_with_products, schema, show_title, inherit_design, borders vrais) |
bg, title_color | couleur hexadécimale | #ffffff, #14282b |
radius | none, small, medium, large | large |
width | box, wide | box |
title | texte (vide = pas de titre) | titre par langue |
Sans option, le widget rend les emplacements du hook courant (renderHook). Dans le widget et le Builder, CSS et JS sont insérés une fois en ligne si l'en-tête ne les a pas chargés.
API PHP
$module = Module::getInstanceByName('websourcebrands');
echo $module->renderWithOptions(['layout' => 'list'], $languageId /* 0 = courante */, $forceAssets /* false */);
Services via $module->services() (Websource\Brands\Services) : dépôt des marques (BrandRepository, une requête agrégée bornée par id_shop), Settings\SettingsStore (load, save, has), Render\BrandViewBuilder, Render\BrandCache, Render\BrandJsonLdBuilder, Domain\BrandSorter, Domain\AlphabetGrouper (repli des accents, écritures non latines, #), Domain\ContrastChecker, Domain\ImageTypePicker, Render\LogoResolver (<picture> WebP/AVIF si disponibles, loading="lazy").
Bloc Websource Builder
Classe Builder\BrandsBlock, enregistrée seulement si Websource\Builder\Block\BlockInterface existe.
| Champ | Valeurs |
|---|---|
| Titre | texte (défaut « Nos marques », vide = aucun titre) |
| Présentation | grid Grille de logos, carousel Carrousel défilant, list Liste alphabétique |
| Nombre de marques | 1 à 60 (défaut 12) |
| Logos en gris (couleur au survol) | interrupteur (défaut activé) |
Contrôleur d'administration
index.php?controller=AdminWebsourceBrands&token=…&ajax=1&action=preview (POST, champs du formulaire wsbr[…]) : renvoie { "html": "<section class=\"wsbr …\">…</section>" } pour l'aperçu en direct. L'enregistrement passe par le formulaire classique de la page Configurer (POST wsbr_save, réglages assainis par Settings::sanitize() : choix énumérés, entiers bornés, couleurs validées, emplacements filtrés).
Réglages
| Clé de configuration | Portée | Contenu |
|---|---|---|
WSBRANDS_SETTINGS | par boutique (enregistrée avec son groupe) | JSON des clés ci-dessus + titles (id de langue => titre) + placements ([{page, position, hook}]). |
Sans contexte de boutique (CLI, AJAX), la boutique par défaut et sa langue par défaut sont utilisées. Mises à niveau : upgrade-1.1.0.php (réglages et hooks par boutique), upgrade-1.2.0.php (displayHeader), upgrade-1.3.0.php (hooks de paquet de thème).
Template et CSS
Template views/templates/hook/brands.tpl, surchargeable dans themes/<theme>/modules/websourcebrands/views/templates/hook/brands.tpl. Variable Smarty $wsbr : uid, layout, classes, style, title, show_title, show_name, show_count, autoplay, schema, brands[] (name, url, logo HTML, products, fold lettre de classement), letters et groups (liste alphabétique).
Classes : .wsbr, .wsbr--grid|--carousel|--list, .wsbr--gray, .wsbr--themed, .wsbr__inner, .wsbr__title, .wsbr__items, .wsbr__item.
| Variable CSS | Rôle |
|---|---|
--wsbr-bg, --wsbr-title, --wsbr-ink, --wsbr-line, --wsbr-accent, --wsbr-tint | Couleurs du bloc (fond, titre, texte, filets, accent, teinte). |
--wsbr-radius, --wsbr-tile-radius, --wsbr-shadow | Arrondis du bloc et des tuiles, ombre. |
--wsbr-cols | Nombre de colonnes sur ordinateur. |
Variables du thème reprises avec repli : --color-brand-600, --color-brand-50, --color-ink, --color-line, --color-surface, --radius-xl, --radius-2xl, --wst-card-shadow, --wst-container. CSS en propriétés logiques (RTL), prefers-reduced-motion respecté (plus d'autoplay ni de transition).
Traductions et tests
Textes sources en français ($this->l(), {l s='…' mod='websourcebrands'}), translations/fr.php et translations/en.php. Tests autonomes : php tests/run.php (tri, regroupement, options, contraste, emplacements, réglages et hooks par boutique, traductions, CSS).