Vue d'ensemble
- Module
websourcepagestyles, ongletfront_office_features, espace de nomsWebsource\PageStyles\(PSR-4 danssrc/,vendor/embarqué :scssphp/scssphp1.13). - Aucun gabarit côté boutique, aucun widget : le module ne fait qu'enregistrer des feuilles de style sur le contrôleur courant.
- Un seul écran d'administration :
getContent()(Admin\ConfigurationPage, gabaritviews/templates/admin/configure.tpl).
Hooks greffés
| Hook | Rôle |
|---|---|
actionFrontControllerSetMedia | Résout la clé de page (Page\PageCatalog::resolve($php_self, $estModule)) puis enregistre les feuilles de la page (Asset\PageAssetRegistrar::register()). Toute exception est journalisée (PrestaShopLogger, gravité 2) sans interrompre la page. |
actionWebsourceThemeExport | Section pagestyles du paquet de thème (hub Websource Theme Config). |
actionWebsourceThemeImport | Import de cette section. |
Le module n'expose aucun hook personnalisé.
Feuilles de style enregistrées
Identifiant (registerStylesheet) | Fichier | Priorité |
|---|---|---|
wsx-page-<page> | themes/<thème>/assets/css/pages/<page>.css (repli : même identifiant que celui déclaré par le thème dans config/theme.yml, donc aucun doublon). Les contrôleurs de modules utilisent pages/module-pages.css. | 60 |
wsps-all | modules/websourcepagestyles/views/cache/s<id_shop>-all-<empreinte>.css | 700 |
wsps-<page> | modules/websourcepagestyles/views/cache/s<id_shop>-<page>-<empreinte>.css | 710 |
Avec WSPS_INLINE_CRITICAL = 1, toute feuille ci-dessus de moins de 6 144 octets (Setting\Settings::INLINE_THRESHOLD_BYTES) est enregistrée avec 'inline' => true : PrestaShop l'écrit dans une balise <style> du <head> (constaté sur la boutique de test : le <link> du fichier compilé disparaît).
Clés de page
Clé = php_self du contrôleur ; order est ramené à checkout (PageCatalog::ALIASES). Clés spéciales : all (toutes les pages), module-pages (tout ModuleFrontController).
index, category, product, cart, checkout, order-confirmation, authentication, registration, password, my-account, history, order-detail, order-follow, order-slip, order-return, discount, guest-tracking, addresses, address, identity, cms, contact, search, best-sales, new-products, prices-drop, manufacturer, supplier, sitemap, stores, pagenotfound.
Variables et mixins SCSS
Injectés en tête de chaque source, sur une seule ligne (les numéros de ligne des erreurs restent exacts) — Scss\ThemeVariables.
| Variable SCSS | Valeur compilée |
|---|---|
$brand, $brand-600 | var(--color-brand-600) |
$brand-50, $brand-500, $brand-700 | var(--color-brand-50), var(--color-brand-500), var(--color-brand-700) |
$ink, $line, $page, $surface, $footer | var(--color-ink), var(--color-line), var(--color-page), var(--color-surface), var(--color-footer) |
$accent | var(--color-accent-wst) |
$radius, $radius-2xl, $card-shadow | var(--radius-xl), var(--radius-2xl), var(--wst-card-shadow) |
$brand-hex, $accent-hex, $ink-hex, $line-hex | Valeurs hexadécimales lues dans les réglages de Websource Theme Config pour la boutique courante (Scss\ThemeColorsReader) ; replis #0f766e, #f0556b, #14282b, #d9e6e4. |
$bp-sm, $bp-md, $bp-lg, $bp-xl | 640px, 768px, 1024px, 1280px |
Mixins : @mixin rtl { html[dir=rtl] & { @content } } et @mixin ltr { html:not([dir=rtl]) & { @content } }.
Exemple (source, puis sortie constatée sur la boutique de test) :
#main h1 {
color: $brand;
&::after { content: ''; display: block; width: 3rem; height: .25rem; margin-top: .5rem; border-radius: 999px; background: $accent; }
}
@include rtl { #main h1::after { margin-inline-start: auto; } }
#main h1{color:var(--color-brand-600)}#main h1::after{content:"";display:block;width:3rem;height:0.25rem;margin-top:0.5rem;border-radius:999px;background:var(--color-accent-wst)}html[dir=rtl] #main h1::after{margin-inline-start:auto}
Aucun chemin d'import n'est configuré : un @import ne peut lire aucun fichier du serveur.
Compilation et cache
Style\StyleCompiler::saveSource(int $idShop, string $pageKey, string $source, bool $enabled)enregistre et compile ;compile(Style)recompile ;needsCompilation(Style)compare l'empreinte (source + valeurs-hex+ version de scssphp).- Sortie minifiée écrite de façon atomique par
Style\CompiledFileStoragedansviews/cache/(.htaccessinterdisant l'exécution de PHP).purge()vide le dossier à la désinstallation. - En cas d'erreur,
statuspasse àerror,error_messagereçoit le message de scssphp et le dernier fichier valide reste servi. - Côté boutique, si l'empreinte a changé (couleur du thème modifiée, source modifiée en base), la recompilation a lieu une fois à la première visite.
Table {prefix}wsps_style
Une ligne par boutique et par page.
| Colonne | Contenu |
|---|---|
id_wsps_style | Clé primaire. |
id_shop, page_key | Boutique et clé de page. |
source | SCSS saisi (jamais lu par la boutique publique). |
source_hash, attempt_hash, compiled_hash | Empreintes de la source, de la dernière tentative et de la dernière compilation réussie. |
compiled_file, compiled_size | Nom et poids du fichier compilé. |
status | empty, ok ou error. |
error_message | Dernier message d'erreur. |
enabled | 1 = publié. |
date_upd | Dernière compilation. |
Configuration
| Clé | Valeur |
|---|---|
WSPS_INLINE_CRITICAL | 0 (défaut) ou 1, par boutique. |
Paramètres de l'écran de configuration
Formulaires POST vers AdminModules&configure=websourcepagestyles (jeton du back-office) :
| Paramètre | Effet |
|---|---|
wsps_edit=<page> (GET) | Ouvre l'éditeur de la page. |
wsps_save + wsps_page, wsps_source, wsps_enabled | Enregistre et compile. |
wsps_delete + wsps_page | Supprime le SCSS de la page. |
wsps_recompile (+ wsps_page facultatif) | Recompile une page ou toutes. |
wsps_save_settings + wsps_inline | Enregistre le réglage d'inline. |
wsps_copy_from + wsps_source_shop | Multiboutique : copie le SCSS d'une autre boutique. |
Format d'export (section pagestyles, version 1)
hookActionWebsourceThemeExport() renvoie ['key' => 'pagestyles', 'version' => 1, 'label' => 'CSS / SCSS par page', 'data' => …]. Les données sont produites par ThemePackage\ThemePackage::export() ; seules les pages ayant une source sont exportées, triées par clé. Le CSS compilé n'est jamais exporté.
{
"pages": [
{ "page": "category", "enabled": true, "source": "#main h1 { color: $brand; }" }
]
}
À l'import (ThemePackage::sanitize()), une page est ignorée (comptée dans skip, avec un message) si sa clé est inconnue, si la source dépasse 200 000 octets ou si elle contient une balise (style, script, iframe, object, embed, link, meta), javascript:, expression() ou -moz-binding. Mode replace : les pages absentes du paquet sont vidées ; mode merge : elles sont conservées. Rien n'est écrit quand dry_run est vrai. Une source non compilable est enregistrée et signalée dans messages.
Tests fournis
php modules/websourcepagestyles/tests/compile_example.php, tests/compat_test.php, tests/themepackage_test.php.