Vue d'ensemble
- Thème Smarty classique (
themes/WebsourcePrestashopTheme), déclaré dansconfig/theme.yml(name: WebsourcePrestashopTheme,display_name: Websource Prestashop Theme,version: 0.1.0, compatibilitéfrom: 1.7.0.0,to: ~). - CSS écrit en Tailwind v4 et compilé en CSS statique : un socle commun
assets/css/theme.csschargé partout par PrestaShop, puis un fichier par type de page dansassets/css/pages/*.css. Aucune compilation dans le navigateur, aucune dépendance à un CDN. - JavaScript sans jQuery pour le thème lui-même (
assets/js/theme.js) ;assets/js/vendor-theme.jsconserve les greffons hérités du thème Classic dont dépendent PrestaShop et certains modules natifs. - Les réglages (couleurs, variantes d'en-tête et de pied de page, badges, données structurées…) ne sont pas dans le thème : ils sont fournis par le module Websource Theme Config au moyen de variables Smarty et de variables CSS décrites plus bas. Le thème fonctionne sans ce module avec des valeurs de repli.
- Sources :
assets/src/*.css(jetons, socle, en-tête, formulaires, badges, dispositions de fiche produit, variantes, compatibilité Bootstrap), cartographie page → gabarits dansscripts/pages.config.mjs.
Compilation du CSS
cd themes/WebsourcePrestashopTheme
npm install
npm run build
Le script scripts/build-css.mjs produit assets/css/theme.css et assets/css/pages/<page>.css à partir de scripts/pages.config.mjs : pour chaque page, il suit les {include}/{extends} des gabarits racines, ajoute les gabarits des modules surchargés (modules/<nom>) utilisés par la page et conserve une liste blanche de classes ajoutées dynamiquement (baseSafelist, pageSafelist). Un tableau des tailles s'affiche en fin de compilation.
Les classes CSS n'existent que si elles ont été vues à la compilation : une nouvelle classe utilitaire ajoutée dans un gabarit n'a d'effet qu'après npm run build.
Gabarits
Mises en page (templates/layouts/)
| Fichier | Nom affiché | Usage par défaut (theme_settings) |
|---|---|---|
layout-full-width.tpl | Pleine largeur | default_layout : accueil, produit, panier, tunnel, compte, CMS… |
layout-left-column.tpl | Colonne gauche | category, best-sales, new-products, prices-drop, contact |
layout-right-column.tpl | Colonne droite | sur demande |
layout-both-columns.tpl | Trois colonnes | sur demande (gabarit de base des autres) |
layout-content-only.tpl | — | contenu seul (fenêtres, impression) |
layout-error.tpl | — | pages d'erreur (assets/css/error.css, assets/js/error.js) |
Structure commune : <html lang="{$language.locale}" dir="rtl"> si $language.is_rtl, lien d'évitement #content, <header id="header">, <section id="wrapper"> avec #left-column, #content-wrapper > #content, #right-column, <footer id="footer">, barre mobile _partials/tabbar.tpl, scripts du bas.
Blocs Smarty surchargeables dans un thème enfant : head, hook_after_body_opening_tag, product_activation, header, notifications, breadcrumb, left_column, content_wrapper, content, right_column, footer, javascript_bottom, hook_before_body_closing_tag. Dans _partials/header.tpl : header_banner, header_nav, header_top. Dans _partials/footer.tpl : hook_footer_before, hook_footer, copyright_link, hook_footer_after. Dans catalog/product.tpl : page_header_container, product_cover_thumbnails, product_prices, product_description_short, product_variants, product_pack, product_discounts, product_add_to_cart, product_buy, product_customization, product_additional_info, product_refresh, product_tabs, product_description, product_details, product_attachments, product_accessories, product_footer, product_images_modal, hook_display_reassurance, head_microdata_special.
Classes du <body>
Le <body> porte {$page.body_classes} puis la chaîne $wsx_body_classes (fournie par Websource Theme Config). Valeur de repli si le module est absent :
wsx-mn-bottom wsx-mh-icons_right wsx-dh-classic wsx-ft-dark wsx-sw-md wsx-sa-center wsx-ha-main
| Préfixe | Rôle | Valeurs connues du CSS |
|---|---|---|
wsx-dh-* | Variante d'en-tête sur ordinateur | classic, centered, compact, large, split, band, dark, sticky |
wsx-mh-* | Variante d'en-tête sur mobile | icons, icons_right, centered, stacked |
wsx-mn-* | Menu mobile : barre du bas ou bouton en haut | bottom, top |
wsx-ft-* | Variante de pied de page | dark, light, brand, accent, centered, contrast, minimal, twotone |
wsx-sw-* | Largeur de la barre de recherche | sm, md, lg, full |
wsx-sa-* | Alignement de la barre de recherche | left, center, right |
wsx-ha-* | Position de la recherche dans l'en-tête | main (seule valeur stylée à ce jour) |
wsx-ci-* | Intensité des couleurs | sober, balanced, vivid |
wsx-co-h-* / wsx-co-f-* | En-tête / pied de page du tunnel de commande (sur #header / #footer, page checkout seulement) | valeur de $wsx_checkout_header / $wsx_checkout_footer (full, épuré, masqué) |
Partials notables (templates/_partials/)
| Fichier | Rôle |
|---|---|
head.tpl | title, description, canonical, hreflang + x-default, Open Graph, prev/next, inclusion des microdonnées. |
header.tpl | Grille d'en-tête : bandeau (displayBanner), barre utilitaire (displayNav1, displayWebsourceTopbarRight), actions (displayNav2), burger data-wsmm-open, loupe aria-controls="wsx-search", logo (<h1> sur l'accueil seulement), compte, panier avec compteur data-wsx-cart-count, zone de recherche #wsx-search (displayTop), menu (displayNavFullWidth). |
footer.tpl | Bloc collé au pied (displayFooterBefore), colonne « informations de la boutique » ($wsx_footer_info), displayFooter, barre du bas : copyright (displayWebsourceCopyright ou © {année} {$shop.name}), lien Cookies (data-ws-cookie-settings), displayFooterAfter, sélecteurs (displayWebsourceFooterLocale). |
tabbar.tpl | Barre de navigation mobile : Accueil, Menu (data-wsmm-open), Compte / Connexion, Panier (compteur), Nouveautés, Contact. Masquée dans le tunnel si l'en-tête du tunnel n'est pas full. |
microdata/head-jsonld.tpl | JSON-LD global (organisation / site, fil d'Ariane, listes de produits). |
microdata/product-jsonld.tpl | JSON-LD Product / Offer, enrichi de shippingDetails et hasMerchantReturnPolicy depuis $wsx_ld_commerce. |
microdata/product-list-jsonld.tpl | ItemList des listes de produits. |
pagination.tpl, pagination-seo.tpl | Pagination visible et balises prev/next. |
helpers.tpl, form-fields.tpl, form-errors.tpl, password-policy-template.tpl | Aides de formulaires natives mises en forme. |
Modules surchargés (modules/)
Le thème redessine les gabarits des modules natifs suivants (sans modifier leur code) : blockreassurance, blockwishlist, contactform, ps_advertising, ps_banner, ps_bestsellers, ps_brandlist, ps_categoryproducts, ps_categorytree, ps_contactinfo, ps_crossselling, ps_currencyselector, ps_customeraccountlinks, ps_customersignin, ps_emailalerts, ps_emailsubscription, ps_facetedsearch, ps_featuredproducts, ps_imageslider, ps_languageselector, ps_legalcompliance, ps_linklist, ps_mainmenu, ps_newproducts, ps_productinfo, ps_rssfeed, ps_sharebuttons, ps_shoppingcart, ps_socialfollow, ps_specials, ps_supplierlist, ps_viewedproduct.
Hooks
Hooks d'affichage appelés par les gabarits
Natifs PrestaShop : displayAfterBodyOpeningTag, displayBeforeBodyClosingTag, displayBanner, displayNav1, displayNav2, displayTop, displayNavFullWidth, displayWrapperTop, displayWrapperBottom, displayContentWrapperTop, displayContentWrapperBottom, displayLeftColumn, displayRightColumn, displayLeftColumnProduct, displayRightColumnProduct, displayFooterBefore, displayFooter, displayFooterAfter, displayAfterTitleTag, displayNotFound, displaySearch, displayReassurance, displayProductPriceBlock (13 appels, types before_price, after_price, unit_price, weight, old_price…), displayProductActions, displayProductAdditionalInfo, displayAfterProductThumbs, displayFooterProduct, displayProductListReviews, displayShoppingCart, displayShoppingCartFooter, displayCrossSellingShoppingCart, displayCartExtraProductActions, displayExpressCheckout, displayCheckoutSummaryTop, displayCheckoutSubtotalDetails, displayPersonalInformationTop, displayPaymentTop, displayPaymentByBinaries, displayCustomerLoginFormAfter, displayCustomerAccount, displayAdditionalCustomerAddressFields, displayCMSPrintButton, displayCMSDisputeInformation, actionProductOutOfStock.
Hooks propres au thème (créés par les modules Websource)
| Hook | Emplacement | Module qui s'y greffe habituellement |
|---|---|---|
displayWebsourceTopbarRight | Barre utilitaire de l'en-tête, à droite | Websource Link Lists, Websource Locale |
displayWebsourceFooterLocale | Barre du bas du pied de page, à droite | Websource Locale |
displayWebsourceCopyright | Barre du bas du pied de page, à gauche (remplace le © par défaut) | Websource Theme Config / Link Lists |
displayWebsourceReviews | Colonne « informations » du pied de page | Websource Google Reviews |
displayWebsourceSocialLogin | Formulaires de connexion et de création de compte | Websource Social Login |
displayWebsourceProductJsonLd | Dans le JSON-LD produit (nœuds supplémentaires) | modules d'avis |
Aucun modules_to_hook n'est déclaré dans theme.yml (PrestaShop remplacerait sinon la liste complète des modules de chaque hook) : chaque module Websource se greffe lui-même à l'installation. Le bouton Rétablir les accroches de Websource Theme Config refait ce greffage.
Variables Smarty lues par le thème
Toutes sont facultatives ; sans elles le thème applique un repli.
| Variable | Fournie par | Contenu |
|---|---|---|
$wsx_body_classes | Websource Theme Config | Chaîne de classes wsx-* posées sur <body> (voir plus haut). |
$wsx_footer_info | Websource Theme Config | Tableau : logo, logo_light_url, logo_dark_url, bg_light, name, description, social[] (url, label, color, ink, svg). Crée la colonne « À propos » du pied de page. |
$wsx_checkout_header, $wsx_checkout_footer | Websource Theme Config | Variante d'en-tête / pied dans le tunnel (full ou autre) ; tabbar masquée si l'en-tête n'est pas full. |
$wsx_subcat | Websource Theme Config | mode (image_name, image, image_tooltip, hidden, slider), autoplay, delay : affichage des sous-catégories en haut d'une catégorie. |
$wsx_ld_commerce | Websource Theme Config | shipping (node, currency, cost, free_from) et return_policy pour le JSON-LD produit. |
$wsx_share_networks | Websource Theme Config | Réseaux des boutons de partage de la fiche produit. |
$wsx_product_layout | Websource Builder (hook displayHeader) | zones : disposition de la fiche produit (Classique, Galerie XL, Vitrine, Minimal, Achat toujours visible, Magazine). |
Variables natives utilisées sans modification : $page, $shop, $urls, $language, $customer, $cart, $product, $category, $listing, $breadcrumb, $javascript.
Variables CSS
Déclarées dans assets/src/tokens.css (bloc @theme, non inlinées) et surchargées à l'exécution par Websource Theme Config dans un :root{…}. Un module tiers peut donc s'y référer avec une valeur de repli.
| Variable | Repli | Rôle |
|---|---|---|
--color-brand, --color-brand-50 … --color-brand-900 | #0f766e (600) | Couleur de marque et sa gamme. |
--color-brand-fill, --color-brand-on, --color-brand-text | Fond des boutons, texte sur ce fond, texte de la couleur de marque. | |
--color-secondary, --color-secondary-50 … -900, -fill, -on, -text | #0b3a5c | Couleur secondaire. |
--color-accent, --color-accent-50 … -900, -fill, -on, -text | #f5b83d | Couleur d'accent (badges, mises en avant). |
--color-accent-wst | #f0556b | Accent historique (promotions). |
--color-ink, --color-line, --color-page, --color-surface, --color-white | Texte, filets, fond de page, fond des cartes. | |
--color-footer, --color-footer-ink, --color-footer-muted, --color-footer-deep, --color-footer-line, --color-footer-hover | Palette du pied de page. | |
--font-sans, --font-head | police système | Police du texte et des titres. |
--container-page | 80rem | Largeur maximale (.wsx-container). |
--radius-xl, --radius-2xl | 1rem, 1.5rem | Arrondis des cartes et boutons. |
--wst-card-shadow | none | Ombre des cartes. |
--wsx-tabbar-h | Hauteur de la barre mobile (réserve l'espace en bas de page). | |
--wsx-hdr-pt, --wsx-hdr-pb, --wsx-hdr-min | Hauteurs de l'en-tête (réglables dans Theme Config). | |
--wsx-sw | Largeur de la barre de recherche. | |
--wsx-bd-default-bg, --wsx-bd-default-fg, --wsx-bd-default-bd, --wsx-bdc-bg, --wsx-bdc-fg, --wsx-bdc-bd | Badges produit : fond, texte, bordure (par défaut et par type). | |
--wsx-brand, --wsx-brand-ink | Posées en ligne sur chaque icône de réseau social du pied de page. | |
--wsx-zx, --wsx-zy | Point de zoom de la visionneuse. |
Autres règles de style : propriétés logiques uniquement (margin-inline, inset-inline-start, text-align:start), inversion automatique sous [dir=rtl], classe wsx-flip pour les icônes directionnelles, montants isolés (unicode-bidi:isolate), prefers-reduced-motion respecté.
Feuilles de style et scripts déclarés (theme.yml)
Clé php_self | Fichier | Identifiant |
|---|---|---|
| (toutes) | assets/css/theme.css | chargé par PrestaShop |
index | assets/css/pages/index.css | wsx-page-index |
category | pages/category.css | wsx-page-category |
product | pages/product.css | wsx-page-product |
cart | pages/cart.css | wsx-page-cart |
checkout, order | pages/checkout.css | wsx-page-checkout |
order-confirmation | pages/order-confirmation.css | wsx-page-order-confirmation |
authentication, registration, password, my-account, identity | un fichier chacun | wsx-page-<clé> |
history, order-detail, order-follow, order-slip, order-return, discount, guest-tracking | pages/history.css | wsx-page-history |
addresses, address | pages/addresses.css | wsx-page-addresses |
cms, contact, search | un fichier chacun | wsx-page-<clé> |
best-sales, new-products, prices-drop | pages/best-sales.css | wsx-page-best-sales |
manufacturer, supplier | pages/manufacturer.css | wsx-page-manufacturer |
sitemap, stores | pages/sitemap.css | wsx-page-sitemap |
pagenotfound | pages/pagenotfound.css | wsx-page-pagenotfound |
Les pages de modules (module-*) ne sont pas listées : leur CSS est servi par Websource Page Styles. Priorité des feuilles de page : 60.
Scripts (position bottom) : wsx-vendor (vendor-theme.js, 150), wsx-theme (theme.js, 200), wsx-categorytree (210), wsx-subcategories (220), wsx-product (230). theme.js se protège contre un double chargement (window.__wsxThemeJs).
Comportements JavaScript (theme.js)
Tout se déclenche par attributs data-*, sans initialisation à écrire :
| Attribut / sélecteur | Comportement |
|---|---|
[data-wsx-slider] avec [data-wsx-dir], [data-wsx-to], [data-wsx-pause] | Carrousel scroll-snap (flèches, points, pause, autoplay coupé si prefers-reduced-motion). Utilisé par ps_imageslider et les sous-catégories en mode slider. |
[data-wsx-gallery], .js-thumb, .js-qv-product-cover, [data-wsx-prev], [data-wsx-next], [data-wsx-open] | Galerie de la fiche produit : vignettes, image de couverture, flèches, ouverture de la visionneuse. |
.wsx-lightbox, [data-wsx-stage], [data-wsx-close], [data-wsx-lprev], [data-wsx-lnext], [data-wsx-zoom], [data-wsx-count] | Visionneuse plein écran avec zoom au pointeur. |
[data-wsx-cart-count] | Compteurs du panier (en-tête et barre mobile) mis à jour sur l'événement updateCart de PrestaShop. |
[data-wsx-dd], .wsx-dd__list, [role=option], [data-wsx-sort-link] | Liste déroulante accessible (tri des listes de produits). |
[data-wsmm-open] | Ouvre le menu « push » de Websource Mega Menu (le thème ne fait que poser l'attribut). |
.wsx-loupe[aria-controls="wsx-search"] | Déplie la zone de recherche sur mobile. |
[data-ws-cookie-settings] | Lien Cookies du pied de page, intercepté par un module de consentement s'il est présent. |
categorytree.js (arbre des catégories pliable), subcategories.js (carrousel des sous-catégories) et product.js (déclinaisons, quantité, rafraîchissement de la fiche) complètent le socle.
Réglages appliqués à l'activation (global_settings)
PS_QUICK_VIEW: false(aperçu rapide désactivé).modules.to_enable:websourcethemeconfig,websourcepagestyles,websourcebuilder,websourcemegamenu,websourcecartblock,websourceaccountblock,websourcelinklists,websourcefacetedsearch,websourcereassurance,websourcenewproducts,websourcesearchbar,websourceslider,websourcebrands,websourcestoreinfo,websourcenewsletter,websourcegooglereviews,websourcesociallogin,websourcebandeau(ignorés s'ils ne sont pas installés).modules.to_disable:ps_mainmenu,ps_shoppingcart,ps_customersignin,ps_linklist,ps_facetedsearch,ps_customeraccountlinks,ps_searchbar,ps_imageslider,ps_newproducts,ps_featuredproducts,ps_bestsellers,ps_specials,ps_brandlist,blockreassurance,ps_contactinfo,ps_emailsubscription,ps_banner,ps_customtext.image_types:cart_default125×125,small_default98×98,medium_default452×452,home_default250×250,large_default800×800,category_default1400×280,stores_default170×115.
Ces listes ne s'appliquent qu'à la boutique active au moment de l'activation (multiboutique : activer boutique par boutique).
Traductions
Toutes les chaînes passent par {l s='…' d='Shop.Theme.*'}, Shop.Forms.*, Shop.Notifications.* (domaines du thème Classic) : les traductions existantes de PrestaShop sont réutilisées. Deux chaînes propres au thème sont à traduire dans International > Traductions > Traductions du thème, domaine Shop.Theme.Global : « Nouveautés » (barre mobile) et « Pause » (carrousel).
Thème enfant
Créez un thème enfant depuis Apparence > Thème et logo > Personnalisation avancée ou à la main (themes/<enfant>/config/theme.yml avec parent: WebsourcePrestashopTheme). Un gabarit placé au même chemin dans l'enfant remplace celui du parent ; les blocs Smarty listés plus haut permettent de ne surcharger qu'une zone ({extends file='parent:catalog/product.tpl'}). Pour du CSS seul, préférez le module Websource Page Styles, qui évite la création d'un thème enfant.
Export / import complet (.wsxtheme)
Le thème lui-même ne contient aucune donnée de boutique. L'export complet d'une configuration (réglages, mises en page, menus, contenus, catalogue de démonstration) est assuré par Websource Theme Config 1.11+ (schéma wsxtheme/1, fichiers .wsxtheme.json / .wsxtheme.zip) : voir la référence développeur de ce module.