Vue d'ensemble
- Module
websourcebuilder, espace de nomsWebsource\Builder\(PSR-4 danssrc/). Contrôleur d'administrationAdminWebsourceBuilder(onglet Apparence > Websource Builder) ;getContent()y redirige. - Un contenu = une ligne de
websourcebuilder_content: un nom, une langue (0 = toutes), une liste d'emplacements et deux arbres de blocs JSON (brouillon et version en ligne). Aucun cache : la version en ligne est lue à chaque requête pour la boutique et la langue du contexte. - Rendu serveur par
Render\PageRenderer; chaque bloc est une classeBlock\BlockInterface. Toute donnée saisie passe parBlock\BlockSanitizer(80 blocs, 40 éléments par liste, 30 000 caractères par texte au maximum) ; les couleurs parBlock\ColorValue; les styles avancés parBlock\Appearance::sanitize().
Hooks greffés
| Hook | Rôle |
|---|---|
actionFrontControllerSetMedia | Enregistre views/css/blocks/_base.css et la feuille de chaque type de bloc réellement présent sur la page (websourcebuilder-<type>, priorité 60). Rien n'est chargé sur une page sans contenu. |
displayHeader | Fiche produit : assigne $wsx_product_layout. Page CMS : remplace ou complète $cms.content par le contenu publié à l'emplacement cms_page. |
displayWrapperTop, displayContentWrapperTop, displayContentWrapperBottom, displayWrapperBottom, displayHome, displayProductAdditionalInfo, displayFooterProduct, displayCustomerLoginFormAfter, displayCustomerAccountFormTop, displayCustomerAccountForm, displayMyAccountBlock | Rendu des contenus publiés dont un emplacement correspond au hook et à la page courante. |
| Tout autre hook d'affichage | Emplacement « avancé » (position = custom, hook libre) : greffé à la demande par ensureHookRegistered() et servi par __call(). |
actionWebsourceThemeExport, actionWebsourceThemeImport | Sections du paquet de thème (voir plus bas). |
Hook exposé : actionWebsourceBuilderRegisterBlocks
Permet à un module d'ajouter des blocs à la palette. Le hook est exécuté sans paramètre ; chaque module renvoie un tableau d'objets BlockInterface (les autres valeurs sont ignorées).
public function hookActionWebsourceBuilderRegisterBlocks(): array
{
return [new MonBloc()];
}
namespace Websource\Builder\Block;
interface BlockInterface
{
public function getType(): string; // identifiant unique, lettres minuscules
public function getLabel(): string;
public function getDescription(): string;
public function getCategory(): string; // famille de la palette
public function getIcon(): string;
public function getFields(): array; // objets Field (texte, liste, image, couleur…)
public function getDefaults(): array;
public function render(array $data, \Websource\Builder\Render\RenderContext $context): string;
}
Block\AbstractBlock fournit l'enveloppe commune (apparence, style avancé). RenderContext donne la langue, l'objet Link, la devise, la boutique et indique si le rendu est un aperçu d'éditeur.
Blocs fournis
hero, features, cards, split, cta, faq, testimonials, stats, announcement, columns (1 à 6 colonnes, largeurs de 1 à 6 parts, un seul niveau d'imbrication), heading, text, button, spacer, pagecontent, image, video, products, html. Feuilles de style : views/css/blocks/<type>.css.
Widgets des modules Websource reconnus dans l'accueil (WebsourceBuilder::HOME_WIDGET_MODULES, type de bloc → module) : websource_newproducts → websourcenewproducts, websourcebrands → websourcebrands, websource_newsletter → websourcenewsletter, websource_reassurance → websourcereassurance, websource_slider → websourceslider, store_info → websourcestoreinfo, websourceblog → websourceblog. Quand un de ces widgets figure dans le contenu en ligne de l'accueil, syncHomeWidgets(int $shopId) retire le module du hook displayHome de la boutique et le rétablit quand le widget disparaît (état mémorisé dans WSB_HOME_UNHOOKED).
Emplacements (Placement\PlacementCatalog)
Un emplacement : {"page": "home", "position": "top", "cms_id": 0, "hook": ""}.
Pages : all, home, category, product, cms, login, registration, password, account, orders, cart, contact, notfound.
| Position | Hook | Pages |
|---|---|---|
top | displayWrapperTop | toutes |
before_content | displayContentWrapperTop | toutes |
after_content | displayContentWrapperBottom | toutes |
bottom | displayWrapperBottom | toutes |
cms_page | displayHeader (réécriture de $cms.content) | cms ; clé cms_native = hidden, above ou below pour le texte natif |
home | displayHome | home, all |
product_info | displayProductAdditionalInfo | product |
product_footer | displayFooterProduct | product |
after_login_form | displayCustomerLoginFormAfter | login |
registration_top | displayCustomerAccountFormTop | registration |
registration_bottom | displayCustomerAccountForm | registration |
account_block | displayMyAccountBlock | account |
custom | valeur de hook | selon page |
Jetons (Render\TokenResolver)
| Jeton | Rendu |
|---|---|
{price:60} | 60 dans la devise par défaut, converti et formaté dans la devise du visiteur. |
{link:home}, {link:contact} | Accueil, page de contact (langue et boutique du visiteur). |
{link:cms:ID}, {link:category:ID}, {link:product:ID} | Page de contenu, catégorie, produit. |
Variables Smarty
| Variable | Contenu |
|---|---|
$wsx_product_layout | Disposition de la fiche produit pour le thème (Product\ProductLayouts::forTheme()) ; sans configuration, disposition classic. Le paramètre d'URL wsb_design active le mode aperçu. |
$cms.content | Réécrit sur une page CMS quand un contenu publié occupe l'emplacement cms_page. |
Variables CSS posées sur l'aperçu par l'écran En-tête et pied de page : --wsx-hdr-min, --wsx-hdr-pt, --wsx-hdr-pb (enregistrées par Websource Theme Config).
Contrôleur AdminWebsourceBuilder
Écrans (paramètres GET) : &home=1 (live builder de l'accueil, écran par défaut), &list=1 (tableau de bord), &edit=<id> (éditeur), &layout=<page>[&cms=<id>] (emplacements d'une page), &design=1 (en-tête et pied de page), &product=1 (fiche produit) ; &standalone=1 ouvre les deux derniers sans le cadre du back-office.
Actions AJAX (ajax=1&action=<nom>, jeton du back-office, réponses JSON) :
| Action | Paramètres | Effet |
|---|---|---|
create | template, name, id_lang, placement (JSON) | Crée un contenu ; renvoie url de l'éditeur. |
sync | id, payload (JSON : nom, emplacements, blocs) | Sauvegarde automatique du brouillon. |
publish | id | Copie le brouillon en version en ligne et active le contenu. |
toggle | id, active | Affiche ou masque un contenu. |
delete | id | Supprime un contenu. |
translate | id, id_lang | Crée la copie liée dans une autre langue. |
copyToShop | id, id_shop | Multiboutique : copie vers une autre boutique. |
openHome | — | Ouvre ou crée le contenu de l'accueil ; synchronise les widgets. |
openCms | id_cms, id_lang | Ouvre ou crée le contenu d'une page CMS (texte natif importé dans un bloc pagecontent). |
reorder | hook, order (JSON, identifiants de modules) | Réordonne les modules d'un emplacement (hooks autorisés : zones communes et zones de page). |
saveDesign | choices (JSON) | Enregistre les variantes d'en-tête et de pied de page dans Websource Theme Config. |
saveProductLayout | config (JSON) | Enregistre WSB_PRODUCT_LAYOUT et vide le cache Smarty. |
previewLayouts | block (JSON) | Miniatures des layouts d'un bloc (rendu serveur). |
listSections, saveSection (block, name), deleteSection (id) | Bibliothèque « Mes sections ». | |
importBlocks | json (2 Mo au plus) | Décode, assainit et renvoie les blocs importés, avec le nombre de blocs ignorés. |
upload | fichier image (jpg, jpeg, png, webp, gif, avif ; 5 Mo au plus) | Enregistre l'image dans uploads/ sous un nom aléatoire. |
Emplacements gérés par reorder : displayBanner, displayNav1, displayNav2, displayTop, displayNavFullWidth, displayWrapperTop, displayContentWrapperTop, displayContentWrapperBottom, displayWrapperBottom, displayFooterBefore, displayFooter, displayFooterAfter ; et selon la page displayHome, displayLeftColumn, displayProductAdditionalInfo, displayReassurance, displayFooterProduct, displayShoppingCart, displayShoppingCartFooter, displayCustomerLoginFormAfter, displayCustomerAccountFormTop, displayCustomerAccountForm, displayMyAccountBlock, displayCustomerAccount.
Fiche produit (Product\ProductLayouts)
- Dispositions (liste blanche) : Classique (
classic, par défaut), Galerie XL, Vitrine, Minimal, Achat toujours visible, Magazine. - Zones :
top,media,info,below. - Blocs (une occurrence chacun) :
flags,gallery,title,price,short_description,buy,reassurance,details,related. - Mode des détails :
tabs,accordion,stacked.
Tables
{prefix}websourcebuilder_content
| Colonne | Contenu |
|---|---|
id_content, id_shop | Identifiant, boutique. |
id_lang | Langue, 0 = toutes les langues. |
id_source | Contenu d'origine d'une traduction (groupe de traduction). |
name, active | Nom interne, 1 = affiché. |
placements | JSON, liste d'emplacements. |
blocks_draft, blocks_live | JSON, brouillon et version en ligne. |
date_add, date_upd | Dates. |
{prefix}websourcebuilder_section : id_section, id_shop, name, type, block (JSON), date_add ; 100 sections au plus par boutique.
Configuration
| Clé | Contenu |
|---|---|
WSB_PRODUCT_LAYOUT | JSON de la disposition de la fiche produit, par boutique. |
WSB_HOME_UNHOOKED | JSON, modules retirés de displayHome parce que leur widget est dans l'accueil. |
Les variantes d'en-tête et de pied de page ne sont pas stockées ici mais dans WSTC_SETTINGS (Websource Theme Config).
Export / import de thème
Sections fournies au hub Websource Theme Config : builder (contenus : textes par langue indexés par code ISO, brouillon et version en ligne, emplacements, groupes de traduction ; 200 contenus au plus), builder_library (sections enregistrées), product_layout (disposition de la fiche produit), hook_layout (ordre des modules dans les emplacements du builder).
Export JSON d'une page ou d'une section depuis l'éditeur : fichier .json relu par l'action importBlocks (identifiants régénérés, blocs inconnus écartés).
Méthodes publiques utiles
WebsourceBuilder::createRegistry(): BlockRegistry, createRenderer(): PageRenderer, baseHooks(): array, ensureHookRegistered(string $hookName, int $shopId = 0), ensureHooksForShop(array $hooks, int $shopId), syncHomeWidgets(int $shopId), blockTypes($blocks) (types présents, colonnes comprises), jsStrings(): array.
Traductions
Interface, blocs, modèles et emplacements : translations/fr.php, translations/en.php. Les libellés des blocs passent par I18n\Translator et n'apparaissent pas dans l'écran « Traductions » de PrestaShop.
Test fourni
php modules/websourcebuilder/tests/compat_test.php.