Vue d'ensemble
- Module
websourcecartblock, espace de nomsWebsource\CartBlock\(PSR-4 danssrc/), implémenteWidgetInterface. - Un réglage JSON
WSCB_SETTINGSpar boutique (Settings\SettingsRepository, objetSettings\CartBlockSettings). Aucune table, aucun cache. - Le panier affiché est le panier présenté par PrestaShop ; le module n'écrit rien dans le panier lui-même : les changements de quantité et les suppressions passent par les actions natives du contrôleur
cart.
Hooks greffés
| Hook | Rôle |
|---|---|
displayNav2 ou displayTop | Rendu du bloc, selon le réglage hook (l'ancien hook est débranché au changement). |
actionFrontControllerSetMedia | views/css/front.css (websourcecartblock-css, priorité 200), views/css/push.css seulement si un mode push est utilisé (priorité 210), views/js/front.js (websourcecartblock-js, bas de page, defer). |
actionObjectShopAddAfter | Donne ses hooks à une boutique créée après l'installation. |
actionWebsourceThemeExport, actionWebsourceThemeImport | Participation au paquet de thème de Websource Theme Config. |
Widget
{widget name='websourcecartblock'}
Gabarit module:websourcecartblock/views/templates/hook/block.tpl (surchargeable dans le thème). getWidgetVariables($hookName, $configuration) accepte uid (1 à 12 caractères a-z0-9 ; sinon b1, b2… par instance) et renvoie :
| Variable | Contenu |
|---|---|
wscb.uid | Identifiant de l'instance (identifiants HTML wscb-panel-<uid>). |
wscb.mode_desktop, wscb.mode_mobile, wscb.breakpoint, wscb.push_side, wscb.push_selector | Présentation. |
wscb.show_total, wscb.auto_open | Options. |
wscb.texts | Textes dans la langue courante. |
wscb.shipping | null, ou message, percent, reached (Cart\FreeShippingProgress). |
wscb.refresh_url, wscb.cart_url, wscb.checkout_url | Adresses. |
cart | Panier présenté par PrestaShop (produits, sous-totaux, products_count). |
Contrôleur refresh
GET index.php?fc=module&module=websourcecartblock&controller=refresh&uid=<uid> (adresse fournie par wscb.refresh_url).
Réponse application/json, Cache-Control: no-store :
{ "html": "<div class=\"wscb\" …>…</div>" }
front.js appelle cette adresse après chaque événement updateCart de PrestaShop et après ses propres actions (quantité, suppression), puis recopie le contenu des éléments [data-wscb-sync] et la liste des produits. Après une action, il émet prestashop.emit('updateCart', { reason: { linkAction: 'wscb-update', cart }, resp }).
Balisage
Classes : .wscb (racine, attribut data-refresh-url), .wscb__trigger (bouton, aria-haspopup="dialog", aria-expanded, aria-controls), .wscb__icon, .wscb__count, .wscb__total, .wscb__status (annonce pour lecteurs d'écran), .wscb__layer, .wscb__overlay, .wscb__panel, .wscb__head, .wscb__title, .wscb__close, .wscb__error, .wscb__shipping, .wscb__shipping-text, .wscb__bar, .wscb__list, .wscb__item, .wscb__thumb, .wscb__info, .wscb__name, .wscb__price, .wscb__qty, .wscb__step, .wscb__qty-value, .wscb__remove, .wscb__foot, .wscb__subtotal, .wscb__btn. La classe wscb-lock est posée sur <html> tant que le tiroir est ouvert.
Attributs lus par front.js : data-wscb-open, data-wscb-sync (label, count, total…), data-wscb-status, data-wscb-key (ligne de panier).
Variables CSS propres : --wscb-w (largeur du panneau), --wscb-sbw (largeur de la barre de défilement compensée). Variables du thème lues avec repli : --color-brand-600, --color-line…
Clés de WSCB_SETTINGS
| Clé | Valeurs (défaut en premier) |
|---|---|
hook | displayNav2, displayTop |
mode_desktop | drawer, push, dropdown |
mode_mobile | drawer, push |
breakpoint | 768 |
push_side | right, left |
push_selector | sélecteur CSS de la zone poussée ; vide = main, sinon le contenu direct de <body> |
show_total, auto_open, show_free_shipping | booléens (vrais) |
texts | par langue : title, empty, view_cart, checkout, free_remaining (jeton %amount%), free_reached ; 120 caractères au plus |
Textes intégrés (Settings\DefaultTexts) : fr, en, es, de, it, nl, pt ; anglais pour les autres langues.
Livraison offerte
Cart\FreeShippingProgressProvider lit PS_SHIPPING_FREE_PRICE (devise par défaut), le convertit dans la devise du panier (Tools::convertPrice) et arrondit le reste à la précision de la devise. Les règles par transporteur ou par zone et les bons « livraison gratuite » ne sont pas pris en compte.
Formulaire d'administration
getContent(), soumission submitWscb (Admin\SettingsFormHandler). Champs : hook, mode_desktop, mode_mobile, breakpoint, push_side, push_selector, show_total, auto_open, show_free_shipping, text_<clé>_<id_lang>.
Anomalie connue (1.4.0)
Dans views/js/front.js, la synchronisation parcourt tous les éléments [data-wscb-sync] et remplace leur textContent. Le bouton .wscb__trigger porte lui-même data-wscb-sync="label" (pour son aria-label) : son contenu (icône SVG, .wscb__count, .wscb__total) est donc remplacé par du texte brut après la première mise à jour sans rechargement.
Tests fournis
php modules/websourcecartblock/tests/run.php.