Vue d'ensemble
- Module
websourcereassurance, classeWebsourceReassurance, espace de nomsWebsource\Reassurance(PSR-4 danssrc/, autoloader Composer embarqué dansvendor/). - Implémente
PrestaShop\PrestaShop\Core\Module\WidgetInterface(renderWidget,getWidgetVariables). - Un seul écran d'administration : contrôleur
AdminWebsourceReassurance(onglet « Réassurance » sousAdminParentThemes, c'est-à-dire Apparence en PrestaShop 8).getContent()redirige vers ce contrôleur. - Rendu mis en cache fichier dans
var/cache/<env>/websourcereassurance/(clé : groupe + boutique + langue + surcharges, durée 3600 s) ; vidé à chaque enregistrement, duplication, suppression, et à la désinstallation.
Hooks
Hooks d'affichage greffés
| Hook | Emplacement dans l'éditeur | Page imposée |
|---|---|---|
displayHome | Page d'accueil | home |
displayReassurance | Fiche produit, sous le bouton d'achat | product |
displayShoppingCartFooter | Panier | cart |
displayPaymentTop | Tunnel de commande, au-dessus du paiement | checkout |
displayNavFullWidth | Sous l'en-tête, en haut des pages | au choix |
displayFooterBefore | Juste au-dessus du pied de page | au choix |
displayFooter | Dans le pied de page | au choix |
tout display* | Emplacement avancé (volet « Pour les utilisateurs avancés ») | au choix |
Les hooks sont greffés et dégreffés par boutique par Hook\HookSynchronizer selon les emplacements réellement utilisés (syncAll() à l'installation, sync($shopId) après chaque modification). Un hook libre inconnu de PrestaShop est créé à la volée. Les méthodes hookDisplayXxx manquantes sont servies par __call().
Le type de page est détecté par Placement\PageDetector à partir de php_self du contrôleur : home, category, product, brand (manufacturer), cms, search, login (authentication, password), account (my-account, identity, addresses, history, order-detail…), cart, checkout (order), contact, notfound (pagenotfound).
Hooks techniques greffés
| Hook | Rôle |
|---|---|
actionFrontControllerSetMedia | Ajoute views/css/front.css à la page seulement si au moins un groupe doit s'y afficher. En dehors de ce cas (widget, Builder), la balise <link> est insérée une fois avec le premier rendu. |
actionWebsourceBuilderRegisterBlocks | Déclare le bloc « Réassurance » au Websource Builder (voir plus bas). |
actionWebsourceThemeExport / actionWebsourceThemeImport | Participation aux paquets .wsxtheme de Websource Theme Config, section reassurance, version 1 (groupes, éléments, icônes en adresse absolue, liens CMS en cms:slug). Import avec analyse à blanc (dry_run), remplacement exact ou fusion par identifiant. |
actionObjectShopAddAfter | Greffe les hooks pour une boutique créée après l'installation. |
actionShopDataDuplication | Copie groupes et images vers une boutique créée « à partir d'une autre ». |
actionObjectShopDeleteAfter | Nettoie les données de la boutique supprimée. |
Widget Smarty
{widget name='websourcereassurance' group='demo-b-confiance'}
{widget name='websourcereassurance' group='3'}
| Paramètre | Rôle |
|---|---|
group | Identifiant texte du groupe (identifier, dérivé du nom, affiché dans le volet avancé de l'éditeur) ou identifiant numérique. Sans group, le widget rend les groupes rattachés au hook courant. |
Seuls les groupes actifs (active = 1) de la boutique courante sont rendus ; un groupe inconnu ou vide rend une chaîne vide. getWidgetVariables() renvoie un tableau vide : le rendu passe par le template du module.
API PHP
// Rendu d'un groupe actif par identifiant numérique (chaîne vide si inconnu ou module inactif).
echo WebsourceReassurance::renderGroupById(3);
// Avec surcharges : layout box|wide|list, columns 1 à 6, langue.
$module = Module::getInstanceByName('websourcereassurance');
echo $module->renderGroup(3, ['layout' => 'list', 'columns' => 1], (int) $languageId);
Services accessibles via $module->services() (Websource\Reassurance\Services) : groups() (Repository\GroupRepository), items(), images(), views() (Render\GroupViewProvider), cache(), sanitizer(), synchronizer($module), dispatcher(), uploadGuard(), advisor() (contraste WCAG), catalog() (emplacements).
Bloc Websource Builder
Classe Builder\ReassuranceBlock, enregistrée seulement si l'interface Websource\Builder\Block\BlockInterface existe.
| Champ | Valeurs |
|---|---|
| Groupe à afficher | Liste des groupes de la boutique. |
| Disposition | Comme dans le groupe (vide), box Cartes séparées, wide Bandeau horizontal pleine largeur, list Liste verticale. |
| Colonnes (0 = comme dans le groupe) | 0 à 6. |
Quand un bloc Réassurance est présent sur la page d'accueil du Builder, le module ne regreffe pas displayHome (évite le doublon) ; l'éditeur l'indique.
Contrôleur d'administration (AJAX)
Toutes les actions passent par index.php?controller=AdminWebsourceReassurance&token=…&ajax=1&action=<action> en POST, réponse JSON. Elles exigent un contexte de boutique explicite (sauf keepData) ; sinon réponse d'erreur 400 « Choisissez d'abord une boutique précise ».
| Action | Paramètres | Réponse |
|---|---|---|
create | name, preset (starter ou empty) | { id, url } |
draft | id, payload (JSON du groupe), lang | état du brouillon + aperçu HTML + conseils de contraste |
save | id, payload, lang | groupe publié, aperçu, feedback |
toggle | id, active (0/1) | { active } |
enableDefaults | id | emplacements accueil + produit + panier ajoutés |
delete | id | { ok } |
duplicate | id | { id, url } |
upload | fichier(s) files[] (multipart) | images créées (id, url) ou message d'erreur |
deleteImage | id | { ok } ou erreur si l'image est utilisée |
keepData | keep (0/1) | { ok } — réglage global |
Exemple de requête :
POST /admin-xxx/index.php?controller=AdminWebsourceReassurance&token=…&ajax=1&action=toggle
id=3&active=1
Réponse : {"active":true}.
Le payload est nettoyé côté serveur par Group\GroupSanitizer, Design\DesignSanitizer (couleurs par expression régulière stricte, valeurs énumérées) et Url\UrlSanitizer.
Données
Tables (préfixe _DB_PREFIX_)
| Table | Contenu |
|---|---|
websourcereassurance_group | id_group, id_shop, identifier (unique par boutique), name, active, titles (JSON par langue), settings (JSON : disposition, colonnes, design), placements (JSON), draft (JSON du brouillon), date_add, date_upd. |
websourcereassurance_item | Blocs d'un groupe : id_item, id_group, position, icon_type (library ou image), icon_value, titles, texts, urls (JSON par langue), url (héritage 1.0). |
websourcereassurance_image | Images envoyées : id_image, id_shop, filename (nom aléatoire), original_name, mime, width, height, size, date_add. |
Les fichiers envoyés sont dans modules/websourcereassurance/uploads/ (protégé par .htaccess, aucune exécution).
Configuration
| Clé | Rôle |
|---|---|
WEBSOURCEREASSURANCE_KEEP_DATA | Globale (toutes boutiques). 1 = conserver tables et images à la désinstallation. |
Mises à jour
upgrade/upgrade-1.1.0.php (colonne urls, réglage global, rebranchement de toutes les boutiques), upgrade-1.2.0.php (forme square → rounded), upgrade-1.3.0.php (hooks d'export/import de thème).
Template et CSS
Template : views/templates/hook/group.tpl, surchargeable dans themes/<theme>/modules/websourcereassurance/views/templates/hook/group.tpl. Variable Smarty assignée : $wsr_view avec les clés identifier, classes, style (attribut style contenant les variables --wsr-*), title, items[] (icon HTML, title, text, url).
Feuille de style : views/css/front.css (mobile d'abord, propriétés logiques, prefers-reduced-motion). Conteneur .wsr, variantes de disposition box, wide, list.
| Variable CSS | Rôle |
|---|---|
--wsr-bg, --wsr-text, --wsr-title | Fond, texte, titres (surcharges de couleur du groupe). |
--wsr-border, --wsr-border-w, --wsr-border-style, --wsr-radius, --wsr-shadow | Bordure, arrondi et ombre du bloc. |
--wsr-icon-color, --wsr-icon-bg, --wsr-icon-bc, --wsr-icon-bw, --wsr-icon-size | Icône : couleur, fond, bordure (couleur, épaisseur), taille. |
--wsr-c, --wsr-c-sm, --wsr-c-md, --wsr-c-lg | Nombre de colonnes (base, téléphone, tablette, ordinateur). |
Valeurs « thème » reprises avec repli neutre : --color-brand-600, --color-brand-50, --color-ink, --color-line, --color-surface, --radius-xl, --wst-card-shadow.
Sécurité
Requêtes préparées/échappées ; SVG reconstruits par liste blanche (ni <script>, ni attributs on*, ni javascript:, ni foreignObject, ni référence externe) ; type réel du fichier vérifié ; 1 Mo maximum (200 Ko pour un SVG, 4000 px maximum) ; noms de fichiers aléatoires ; uploads/.htaccess.
Tests
php tests/run.php (sans PrestaShop) : nettoyage SVG, contrôle des images, couleurs et contraste, CSS, liens par langue, traductions, cohérence multiboutique, paquet de thème (tests/themepackage_test.php).