INFRASSTUDIO Infrasstudio est un module externe Dolibarr fournissant une seconde surcouche UX moderne au module Website natif de Dolibarr. L'objectif: permettre à un utilisateur non technique d'éditer le contenu d'un site géré par Dolibarr Website (textes, images, données dynamiques Dolibarr) sans connaître HTML ni la console d'administration Dolibarr. PARTIE VII — Annexes Annexe D — Crédits et licence Équipe Rôle Auteur Conception et développement InfraS — www.infras.fr Contact contact@infras.fr Technologies utilisées Le module InfraSStudio s'appuie sur les technologies open source suivantes : Technologie Rôle Dolibarr ERP & CRM Plateforme hôte (GPL v3+) Module Website Dolibarr Couche de stockage et de rendu des pages CKEditor Éditeur visuel des slots de texte riche (livré avec Dolibarr) FontAwesome Bibliothèque d'icônes (version Free) Inter et JetBrains Mono Typographies du Studio Licence InfraSStudio est distribué sous licence GNU General Public License v3.0 ou ultérieure (GPL-3.0+). Cette licence implique les libertés et obligations suivantes : Vous pouvez l'utiliser librement, dans un cadre commercial ou non. Vous pouvez le modifier pour répondre à vos besoins. Vous pouvez le redistribuer, à condition de conserver la même licence GPL et de mettre à disposition le code source. Aucune garantie n'est fournie : utilisation à vos risques et périls. Le texte complet de la licence est disponible dans le fichier LICENSE à la racine du module. Contribuer Vous avez identifié un bug, une amélioration possible ou souhaitez proposer une nouvelle fonctionnalité ? Plusieurs canaux existent pour contribuer : Signaler un bug : préparez votre rapport en suivant la procédure du Chapitre 26 (capture du Diagnostic, extrait de dolibarr.log , version), puis transmettez-le à l'éditeur. Suggérer une fonctionnalité : décrivez le cas d'usage concret et l'objectif visé. Les idées accompagnées d'un contexte utilisateur clair sont prioritaires. Soumettre du code : le module suit les conventions de code Dolibarr (PSR-2 modifié, tabulations, getDolGlobalString partout, GETPOST partout). Améliorer la documentation : ce wiki est ouvert aux corrections. Signalez les passages obscurs. Support Canal Usage Cette documentation Première étape avant toute question. La majorité des cas y sont couverts. Page Diagnostic Pour les problèmes techniques. Quatre-vingts pour cent des cas y trouvent leur résolution. Courriel InfraS Pour les questions spécifiques à votre installation : contact@infras.fr Fin de la documentation Vous êtes parvenu au terme de la documentation. Que vous soyez rédacteur, intégrateur ou administrateur, vous disposez désormais de l'ensemble des informations nécessaires à l'utilisation et à l'administration du module InfraSStudio. « Le développeur conserve le contrôle du HTML. L'éditeur conserve le contrôle du contenu. Chacun travaille dans son périmètre, sans empiéter sur celui de l'autre. » Annexe C — Historique des versions Les jalons importants du module. Pour le détail complet, consultez l'onglet Changelog dans l'administration du module. Version 1.9.0 — Mai 2026 (actuelle) Robustesse, portabilité et synchronisation. Nouvelle page Diagnostic dans l'administration pour vérifier l'intégration en un coup d'œil. Refactorisation complète de la gestion d'erreur (helpers centralisés, propagation setEventMessages partout). Synchronisation bidirectionnelle de l'onglet Traductions natif Dolibarr avec l'éditeur du module. Preset preset_default.php avec fichier JSON, pour livrer des champs personnalisés produit sans code. Renommage des gabarits exemples ( example-blog , example-landing ) avec alias rétrocompatibles. Portabilité multi-installations améliorée (constante INFRASSTUDIO_DOCROOT_PATTERN , journalisation de la cascade docroot). Version 1.8.x — Avril 2026 Catalogue produit dynamique et workflow brouillon/publication. Système de catalogue produit dynamique : génération automatique des wrappers solution-*.php. Workflow brouillon/publication des slots avec colonne value_draft . Éditeur de traductions produit dédié (champs natifs et champs personnalisés). Nouveau type de slot color (sélecteur de couleur HTML5). Système de blog natif via les pages Dolibarr Website ( type_container='blogpost' ). Refonte de l'éditeur en interface trois colonnes orientée slots uniquement (suppression du système de blocs). Centralisation CSRF AJAX, rescan en mode --lint . Version 1.7.x — Avril 2026 Éditeur unifié et inspecteur. Phase A : nouvel éditeur trois colonnes (arborescence, aperçu, inspecteur). Phase B : inspecteur unifié pour les slots et les blocs, click-to-edit via postMessage. Version 1.6.0 — Avril 2026 Système de design « Elevated CMS ». Refonte complète de l'apparence inspirée de Sanity, Contentful et Linear. Tokens OKLCH avec accents indigo, ochre, plum et forest. Primitives CSS réutilisables (.is-btn, .is-card, .is-grid-table, etc.). Prise en charge des thèmes clair et sombre. Version 1.5.0 — Avril 2026 Constructeur de pages par blocs (déprécié en 1.8.5). Système de blocs visuels (section, titre, texte, image, bouton, etc.). Inspecteur avec onglets Contenu, Style et Avancé. Note : le système de blocs a été retiré en 1.8.5 au profit du modèle slots uniquement, plus simple et plus stable. Version 1.4.0 — Avril 2026 Référencement et sitemap. Panneau SEO avec aperçu Google en direct. Génération automatique du sitemap.xml. Helper infrasstudio_hreflang_tags() . Version 1.3.x — Avril 2026 Création de pages depuis l'interface. Assistant « + Nouvelle page » avec choix d'un gabarit. Catalogue de gabarits (page-free, blog-standard, landing-basic). Workflow brouillon/publication des pages, duplication, suppression. Slots richtext avec CKEditor natif Dolibarr. Version 1.2.x — Avril 2026 Bibliothèque média. Table llx_infrasstudio_media et interface dédiée. Variantes automatiques (thumb, card, wide). Texte alternatif par langue. Suivi de l'utilisation (nombre de slots et de pages). Importation automatique des fichiers ajoutés hors du Studio. Sélecteur de média réutilisable (fenêtre modale). Version 1.1.x — Avril 2026 Système de slots et de shortcodes. Slots avec types text, textarea, richtext, image, url, number, select, bool. Shortcodes : product, category, dict, mysoc, extrafield. Cascade surcharge → canonique → @lang:. Scanner automatique et outil rescan en ligne de commande. Pipeline de consolidation des pages sœurs. Version 1.0.0 — Avril 2026 Première version. Squelette du module (descripteur, pages d'administration, permissions). Édition orientée slots. Édition des fichiers .lang. Premier système de shortcodes. Pour le changelog complet — Consultez htdocs/custom/infrasstudio/docs/changelog.xml ou l'onglet Changelog dans l'administration du module. Chaque version y est documentée avec ses fix, chg et add détaillés. Annexe B — Foire aux questions (FAQ) Annexe B — Foire aux questions Les questions les plus fréquemment posées. Si la vôtre n'y figure pas, consultez le glossaire ou la page Diagnostic. Installation et démarrage Le module fonctionne-t-il sans le module Website ? Non. Le module Website Dolibarr constitue une dépendance obligatoire. Activez-le en premier, puis InfraSStudio. Puis-je l'installer sur Dolibarr 17 ou 25 ? Le module prend en charge Dolibarr 18.0.0 à 24.x.x. Sur des versions hors fenêtre, l'activation est refusée. Vous pouvez la contourner en définissant la constante INFRASSTUDIO_DISABLE_CHECK_VERSION_MIN=1 , mais sans garantie de bon fonctionnement. Combien de sites puis-je gérer simultanément ? Aucune limite logicielle. Dans la configuration, cochez tous les sites Dolibarr Website que vous souhaitez gérer. Le tableau de bord affichera une carte par site. Édition au quotidien Pourquoi mes modifications ne sont-elles pas visibles publiquement ? L'enregistrement automatique conserve les modifications en brouillon, et non en publication. Cliquez sur le bouton Publier les modifications dans la barre d'outils pour les rendre visibles. Voir le Chapitre 12. Comment annuler complètement mes modifications de la journée ? Utilisez le bouton Annuler les modifications dans la barre d'outils. Une confirmation est demandée. Tous les brouillons de la page sont supprimés et l'aperçu revient à la version publique. Puis-je récupérer une ancienne version d'un slot ? L'historique est consultable dans l'inspecteur du slot (section dépliable « Historique »). La restauration automatique d'une version antérieure n'est pas encore disponible. En cas de besoin, demandez à un administrateur de récupérer la valeur depuis la base de données. Comment travailler à plusieurs sur la même page sans conflit ? L'enregistrement automatique consigne les brouillons toutes les demi-secondes. Si deux personnes éditent le même slot simultanément, c'est la dernière saisie qui est conservée. Pour un circuit de relecture propre, mettez en place une convention organisationnelle (voir Chapitre 24). Multilingue Que voit un visiteur si une langue n'est pas traduite ? Il voit la valeur canonique (généralement le français). Aucune page n'est cassée, aucun texte n'est vide. La résolution suit l'ordre : surcharge de langue, valeur canonique, valeur par défaut du slot. Mes traductions disparaissent quand je modifie le français — pourquoi ? Elles ne disparaissent pas. Les traductions sont stockées séparément (surcharges). Si la valeur d'une surcharge est identique au canonique, le mécanisme intelligent du module supprime la surcharge pour éviter une duplication inutile. Saisissez à nouveau la traduction si elle a réellement changé. Puis-je ajouter une langue qui n'existe pas dans Dolibarr ? Le module accepte n'importe quelle locale au format xx_XX . Vous devez l'activer côté site Dolibarr Website (champ « Autres langues ») et créer les fichiers .lang Dolibarr correspondants si vous souhaitez bénéficier des replis via @lang: . Catalogue produit Pourquoi mon nouveau produit ne s'affiche-t-il pas dans le catalogue web ? Vérifiez deux conditions : le produit est en tosell=1 dans Dolibarr et le champ personnalisé infrasstudio_published est coché. Sans ces deux conditions, le produit reste en brouillon et n'apparaît pas publiquement. Comment ajouter un nouvel univers à mon catalogue ? Définissez la constante INFRASSTUDIO_PRODUCT_UNIVERS_MAP avec un JSON qui associe vos catégories Dolibarr à vos univers personnalisés. Voir le Chapitre 23. Puis-je désactiver complètement le catalogue dynamique ? Oui. Ne définissez ni INFRASSTUDIO_WEBSITE_KEY ni INFRASSTUDIO_PUBLIC_DOCROOT . Le trigger et la tâche planifiée se terminent silencieusement. Aucun wrapper n'est généré. Aspects techniques et développement Puis-je créer mes propres types de slot ? Pas directement : les dix types livrés sont câblés dans le module. En revanche, vous pouvez créer vos propres shortcodes en déposant un fichier dans shortcodes/.shortcode.php . Voir le Chapitre 20. Comment migrer un site WordPress vers le module ? Il ne s'agit pas d'un import direct. Vous devrez : créer le site dans Dolibarr Website, reconstruire le HTML des pages avec votre charte, annoter les zones éditables avec des slots, puis copier le contenu depuis WordPress dans le Studio. Le travail est essentiellement manuel mais l'éditeur du Studio rend la saisie rapide. Le module fonctionne-t-il avec nginx ? Oui, à condition que la configuration nginx serve correctement les fichiers PHP du docroot Dolibarr. La majorité du module est indépendante du serveur web. Vérifiez simplement que le lien symbolique medias est bien servi (mode native), ou basculez en mode module. Puis-je versionner mes slots avec Git ? Indirectement. Les fichiers tpl.php avec leurs tokens {{slot:...}} sont versionnables (ils sont sur le disque). Les valeurs des slots sont en base de données. Pour les versionner, exportez la table llx_infrasstudio_slot avec mysqldump. Sécurité et performance Le module ralentit-il mon site public ? De manière marginale. La résolution des slots ajoute quelques requêtes SQL par page (un SELECT global). Sur une instance correctement dimensionnée, le surcoût est imperceptible. Si vous avez beaucoup de shortcodes {{product:...}} dans une boucle, l'impact peut croître. Voir le Chapitre 20 pour les bonnes pratiques. Comment sécuriser l'accès au Studio ? Utilisez les permissions Dolibarr de manière fine. N'attribuez admin qu'aux développeurs. Pour les rédacteurs, donnez uniquement readContent + editContent . Voir le Chapitre 24. Les médias sont-ils protégés contre l'envoi de fichiers malveillants ? Oui. Le module utilise finfo pour détecter le type MIME réel (et non l'extension), une liste blanche des types autorisés, et passe par dol_move_uploaded_file() qui scanne via l'antivirus configuré dans Dolibarr. Annexe A — Glossaire Liste alphabétique des termes techniques utilisés dans cette documentation et dans le module. Brouillon (draft) Modification d'un slot enregistrée mais non publiée. Visible uniquement dans l'aperçu du Studio. Stockée dans la colonne value_draft de la table llx_infrasstudio_slot . Canonique Valeur de référence d'un slot, partagée entre toutes les langues. Stockée avec lang='' . Utilisée comme valeur de repli lorsqu'une langue ne possède pas de surcharge. CKEditor Éditeur visuel inclus nativement dans Dolibarr, utilisé pour les slots de type richtext . Click-to-edit Fonctionnalité qui permet d'éditer un slot en cliquant directement sur le texte correspondant dans l'aperçu. Mise en œuvre via postMessage entre l'iframe et l'éditeur. Constante (Dolibarr) Configuration stockée dans la table llx_const . Lue via getDolGlobalString() , écrite via dolibarr_set_const() . Toutes les configurations du module commencent par INFRASSTUDIO_ . Cron Tâche planifiée Dolibarr. Le module en déclare deux : régénération horaire des wrappers solution et purge quotidienne des slots orphelins. DOL_DATA_ROOT Constante PHP de Dolibarr qui pointe vers la racine des données utilisateur (généralement /var/www/dolibarr/htdocs/documents/ ). Les médias et les fichiers tpl.php sont stockés sous cette racine. Entity Identifiant d'une entité juridique en mode multicompany Dolibarr. Chaque table contient une colonne entity . Le module respecte strictement ce cloisonnement. Extrafield (champ personnalisé) Champ personnalisé Dolibarr ajouté à un objet (produit, tiers, ticket, etc.). Stocké dans llx__extrafields . Utilisé par le module pour enrichir les données du catalogue produit. Hook Mécanisme Dolibarr permettant à un module externe d'intervenir à des points précis du code natif (rendu d'une page, sécurité, etc.). Le module utilise les hooks main , login , websitepage et websitenav . hreflang Attribut HTML qui indique à Google qu'une page est la traduction d'une autre. Émis automatiquement par le helper infrasstudio_hreflang_tags() . ISO2 et locale ISO2 désigne le code langue à deux lettres ( fr , en ). Locale désigne le code complet pays-langue ( fr_FR , en_US ). Le module utilise les locales en interne et les ISO2 dans les URLs visibles par l'utilisateur. Multicompany Mode Dolibarr permettant à plusieurs entités juridiques de cohabiter sur la même installation, avec des données cloisonnées par entity . Open Graph Protocole de balises qui permet à Facebook, LinkedIn ou WhatsApp d'afficher un aperçu enrichi lors du partage d'une URL. Géré par le panneau SEO du module. Orphelin (slot) Slot dont le token {{slot:...}} a disparu du fichier tpl.php mais dont la valeur est encore présente en base. Statut 0. Conservé pendant trente jours puis purgé par tâche planifiée. Override (surcharge de langue) Valeur d'un slot spécifique à une langue, qui surcharge la valeur canonique pour les visiteurs de cette langue. Pages sœurs (sister pages) Modèle multilingue legacy dans lequel chaque langue dispose de son propre fichier tpl.php ( about.php , about-en.php , etc.). Le module prend en charge ce modèle via le helper sister_stub.tpl.php . Permission Droit d'accès Dolibarr attribuable à un utilisateur ou à un groupe. Le module en définit sept : paramMenu, readContent, editContent, editTranslations, editMedias, publish, admin. Rescan Action de réexaminer tous les fichiers tpl.php d'un site afin de synchroniser la table des slots. Effectué manuellement via l'interface ou en ligne de commande avec rescan_slots.php . Shortcode Token {{namespace:sélecteur.champ}} qui inscrit une donnée Dolibarr en direct dans le HTML. Résolu au moment du rendu par un fournisseur PHP. À distinguer d'un slot. Sitemap Fichier sitemap.xml qui liste toutes les pages publiées d'un site. Lu par Google Search Console. Généré par le module via l'interface ou en ligne de commande. Slot Emplacement éditable nommé dans une page, déclaré par un token {{slot:...|type=...}} dans le HTML. Élément central du module. Studio L'interface principale d'édition du module, accessible via Outils → InfraSStudio. Composée de trois colonnes : arborescence, aperçu et inspecteur. Token Élément textuel délimité par {{ et }} dans le HTML. Les slots et les shortcodes sont des tokens. tpl.php (gabarit) Fichier PHP qui contient le HTML d'une page Dolibarr Website. Stocké dans DOL_DATA_ROOT//website//page.tpl.php . Trigger Événement Dolibarr déclenché lors d'opérations métier (création de produit, modification, etc.). Le module écoute les triggers PRODUCT_* et CATEGORY_*. Univers Concept éditorial du catalogue produit : un univers regroupe plusieurs catégories Dolibarr en une thématique (Supply Chain, Health, Legal, etc.). Cartographiable via constante. Variante (média) Version redimensionnée d'une image générée automatiquement (thumb 200 × 200, card 640 × 480, wide 1600 × 1200) afin d'optimiser le poids selon l'usage. Virtualhost Configuration Apache qui associe un nom de domaine à un docroot. Configuré côté administration système, en dehors du module. Wrapper (Apache) Petit fichier PHP placé dans le docroot d'un site, qui sert de point d'entrée pour une URL et inclut le bon fichier tpl.php . Généré automatiquement par Dolibarr Website. Le catalogue dynamique génère également des wrappers solution-.php . WYSIWYG Acronyme de « What You See Is What You Get ». Désigne un éditeur visuel qui affiche le résultat formaté en direct (gras, italique, listes, etc.) plutôt qu'un code source brut. PARTIE VI — Référence CHAPITRE 32 — Référence des scripts en ligne de commande Tous les scripts en ligne de commande livrés avec le module. Chemin : htdocs/custom/infrasstudio/scripts/ . rescan_slots.php Rescanne les fichiers tpl.php d'un site et synchronise la table des slots. php rescan_slots.php [--entity=N] [--purge-orphans] [--dry-run] [--lint] Option Effet --entity=N Force l'entity Dolibarr. --purge-orphans Supprime immédiatement les slots orphelins (sans attendre 30 jours). --dry-run Affiche les changements sans les appliquer. --lint Vérifie la syntaxe des slots. Code de sortie : 0 sans anomalie, 1 avec avertissement, 2 avec erreur. rebuild_solution_wrappers.php Reconstruit manuellement les wrappers solution-*.php du catalogue produit. php rebuild_solution_wrappers.php [entity] # Exemple php rebuild_solution_wrappers.php monsite /var/www/monsite 2 generate_sitemap.php Génère le fichier sitemap.xml d'un site. php generate_sitemap.php [entity] Idéal pour une planification quotidienne via cron : # crontab -e 0 3 * * * php /var/www/dolibarr/htdocs/custom/infrasstudio/scripts/generate_sitemap.php monsite 2 preset_default.php Chargeur générique de presets JSON. Crée des champs personnalisés produit en série. php preset_default.php # Exemple avec le preset livré php preset_default.php htdocs/custom/infrasstudio/presets/keaticweb.json Format JSON attendu : voir la documentation des presets. preset_keatic.php Wrapper de compatibilité — équivalent à preset_default.php presets/keaticweb.json . consolidate_sister_pages.php Consolide une famille de pages sœurs (modèle B legacy) en une page canonique et plusieurs stubs (modèle A moderne). php consolidate_sister_pages.php \ [--entity=N] \ [--base-slug=] \ [--dry-run] \ [--extractor=/path/to/extractor.php] convert_tpl_to_slots.php Transforme les echo $langs->trans('Key') d'un fichier tpl.php en tokens {{slot:...|default=@lang:Key}} . php convert_tpl_to_slots.php [--group=xxx] [--prefix=yyy] [--dry-run] [--hook-engine] Option Effet --group=xxx Attribut group par défaut. --prefix=yyy Préfixe des noms de slot. --dry-run Aperçu des modifications sans application. --hook-engine Ajoute également l'inclusion du moteur du module. Bonnes pratiques en ligne de commande Toujours utiliser --dry-run avant une migration importante. Lancer en tant qu'utilisateur Apache ( sudo -u www-data php script.php ) pour éviter les problèmes de permissions sur les fichiers générés. En multicompany, toujours préciser --entity=N . Capturer la sortie dans un journal : php script.php 2>&1 | tee /tmp/script.log . Fin de la Partie VI — Vous disposez désormais d'un mémo complet : constantes, shortcodes, hooks, tables SQL, scripts en ligne de commande. Tout est rassemblé en un seul endroit pour une consultation rapide. CHAPITRE 31 — Référence SQL : tables et colonnes llx_infrasstudio_slot Stockage des valeurs de slot. Une ligne par combinaison (fk_website_page, slot_name, lang, entity) . Colonne Type Description rowid INT PK Identifiant auto-incrémenté fk_website_page INT Référence vers llx_website_page slot_name VARCHAR(64) Identifiant du slot slot_type VARCHAR(16) text, textarea, richtext, image, url, etc. lang VARCHAR(8) Vide = canonique, sinon locale (fr_FR, en_US, etc.) value LONGTEXT Valeur publique value_draft LONGTEXT Brouillon en attente label , default_value , group_name , help , options VARCHAR/TEXT Métadonnées (sur la ligne canonique uniquement) maxlength INT Limite de caractères status INT 1 = actif, 0 = orphelin tms , fk_user_* DATETIME, INT Audit standard Dolibarr entity INT Multicompany Index unique : uk_infrasstudio_slot_uniq (fk_website_page, slot_name, lang, entity) . llx_infrasstudio_media Colonne Type Description rowid INT PK Identifiant auto-incrémenté ref VARCHAR(64) Identifiant unique par entity label VARCHAR(255) Nom affiché kind VARCHAR(16) image, video, document filepath VARCHAR(255) Chemin relatif à DOL_DATA_ROOT filesize , mime , width , height INT/VARCHAR Métadonnées physiques alt VARCHAR(255) Texte alternatif canonique tags VARCHAR(255) CSV de tags fk_website INT Site associé variants_json TEXT Cartographie des variantes générées status INT 1 = actif, 0 = corbeille entity INT Multicompany llx_infrasstudio_media_alt Surcharges du texte alternatif par langue. Colonnes Type rowid PK, fk_media , lang , alt , entity , tms Standards Index unique : (fk_media, lang, entity) . llx_infrasstudio_revision Historique en mode ajout uniquement des modifications. Colonnes : rowid , object_type (slot ou media), fk_object , action , payload (JSON), fk_user , date_creation , entity . llx_infrasstudio_product_translation Surcharges par langue des champs personnalisés produit traduisibles. Colonne Type rowid PK fk_product INT lang VARCHAR(8) field VARCHAR(64) — slug du champ personnalisé value MEDIUMTEXT tms , entity Standards Index unique : (fk_product, lang, field, entity) . Tables Dolibarr utilisées sans modification llx_website — sites llx_website_page — pages (titre SEO, meta description, status, gabarit) llx_product — produits (label et description FR canoniques, prix, tosell) llx_product_lang — traductions natives label et description llx_product_extrafields — champs personnalisés canoniques (FR) llx_categorie , llx_categorie_product — catégories llx_const — constantes du module llx_extrafields — définitions des champs personnalisés llx_cronjob — tâches planifiées llx_ecm_files — fichiers attachés aux produits (mode du sélecteur à deux onglets) CHAPITRE 30 — Référence des hooks et triggers Hooks Dolibarr utilisés par le module Hook Méthode appelée Rôle main checkSecureAccess Sécurité de l'accès aux médias via document.php?modulepart=infrasstudio . login divers Initialisations à la connexion. websitepage completeHtmlOutput Résolution des slots et shortcodes au moment du rendu public. Cœur du module. websitenav divers Personnalisation des menus du module Website. Implémentation : htdocs/custom/infrasstudio/class/actions_infrasstudio.class.php . Triggers Dolibarr écoutés Trigger InterfaceInfrasstudiotrigger dans core/triggers/interface_99_modinfrasstudio_Infrasstudiotrigger.class.php . Événement Réaction PRODUCT_CREATE Régénération des wrappers solution-*.php PRODUCT_MODIFY idem PRODUCT_DELETE idem PRODUCT_PRICE_MODIFY idem CATEGORY_LINK idem (uniquement si $object->element === 'product' ) CATEGORY_UNLINK idem Triggers Dolibarr émis par le module Trigger émis Quand PRODUCT_MODIFY Modification du libellé ou de la description en français depuis le Studio (via Product::update() ). PRODUCT_SET_MULTILANGS Modification des traductions natives produit depuis le Studio. Tâches planifiées déclarées Tâche Fréquence Rôle StudioSolutionWrapper::rebuildAllConfigured Toutes les heures Filet de sécurité pour la régénération des wrappers solution. Purge des slots orphelins Quotidien Suppression des slots orphelins de plus de 30 jours. CHAPITRE 29 — Référence des shortcodes Tous les shortcodes livrés par le module, avec leurs sélecteurs et leurs champs disponibles. Namespace product Sélecteurs : ref= ou id= ou ref=$current (marqueur). Champ Source label llx_product et llx_product_lang selon la langue description idem note si PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION est activée ref llx_product.ref price , price_ttc , cost_price Prix formatés selon la langue tosell , tobuy Statuts commercialisable et achetable (0 ou 1) ef_ Tout champ personnalisé {{product:ref=supplyflow.label}} {{product:ref=$current.ef_tagline}} {{product:id=42.price}} Namespace category Sélecteurs : id= ou ref= . Champs : label , description , color , ref . {{category:id=5.label}} {{category:ref=blog-marketing.label}} Namespace dict Sélecteurs : .= . Table de dictionnaire Exemple c_country {{dict:c_country.code=FR.label}} c_currencies {{dict:c_currencies.code_iso=EUR.label}} c_civility {{dict:c_civility.code=MR.label}} Namespace mysoc Sélecteur : aucun (singleton). Champs : name , address , zip , town , country_code , phone , fax , email , url , capital , tva_intra , idprof1 à idprof6 , logo , logo_small , logo_squarred . {{mysoc.name}} — {{mysoc.address}}, {{mysoc.zip}} {{mysoc.town}} SIRET {{mysoc.idprof2}} — TVA {{mysoc.tva_intra}} Namespace extrafield Sélecteurs : table=
|ref= ou table=
|id= avec field= . {{extrafield:table=product|ref=supplyflow|field=tagline}} {{extrafield:table=societe|id=42|field=segment}} {{extrafield:table=product|ref=$current|field=tagline}} Namespace media Sélecteur : ref= . Champ Retour url URL du fichier original thumb URL de la variante 200 × 200 card URL de la variante 640 × 480 wide URL de la variante 1600 × 1200 alt Texte alternatif (résolu selon la langue) label Libellé affiché width , height Dimensions en pixels Étendre avec un namespace personnalisé Déposez un fichier dans htdocs/custom/infrasstudio/shortcodes/.shortcode.php qui exporte une fonction infrasstudio_shortcode__resolve($args, $context) . function infrasstudio_shortcode_myorg_resolve($args, $context) { global $db; $id = isset($args['id']) ? (int) $args['id'] : 0; $field = isset($args['_field']) ? $args['_field'] : 'name'; // ... logique de résolution return $value; } CHAPITRE 28 — Référence des constantes Toutes les constantes Dolibarr utilisées par le module, classées par catégorie d'usage. Format : nom, type, valeur par défaut, description. Sites gérés Constante Type Défaut Description INFRASSTUDIO_MANAGED_SITES CSV vide Identifiants des sites Website gérés (par exemple 1,2,5 ). INFRASSTUDIO_SITE__MEDIA_MODE chaîne native Mode média par site : native ou module . INFRASSTUDIO_SITE__BLOG_INDEX_PAGE entier 0 Identifiant de la page d'index du blog (active l'assistant « + Nouvel article »). INFRASSTUDIO_SITE__DOCROOT chemin vide Surcharge du docroot Apache de ce site. INFRASSTUDIO_SITE__LAST_IMPORT timestamp 0 Géré automatiquement. Horodatage du dernier rescan automatique des médias. Portabilité du système de fichiers Constante Type Défaut Description INFRASSTUDIO_DOCROOT_PATTERN modèle vide Modèle partagé avec marqueur {ref} . Exemple : /srv/sites/{ref} . INFRASSTUDIO_TEMPLATE_EXTRA_DIR chemin vide Dossier supplémentaire pour les gabarits. Catalogue produit Constante Type Défaut Description INFRASSTUDIO_WEBSITE_KEY chaîne vide Référence du site cible des wrappers. INFRASSTUDIO_PUBLIC_DOCROOT chemin vide Docroot Apache absolu où écrire les wrappers. INFRASSTUDIO_PRODUCT_UNIVERS_MAP JSON vide Surcharge de la cartographie catégorie vers univers. INFRASSTUDIO_TRANSLATABLE_PRODUCT_FIELDS CSV vide Slugs de champs personnalisés à ajouter au registre traduisible. INFRASSTUDIO_TRANSLATABLE_PRODUCT_FIELDS_JSON JSON vide Surcharge complète du registre. INFRASSTUDIO_SITE__WRAPPER_PREFIX chaîne solution- Préfixe des wrappers générés. INFRASSTUDIO_SITE__WRAPPER_TEMPLATE_PAGEURL chaîne solution-detail Slug Dolibarr du gabarit. Apparence du Studio Constante Valeurs Défaut INFRASSTUDIO_UI_THEME light , dark light INFRASSTUDIO_UI_ACCENT indigo , ochre , plum , forest indigo Multilingue Constante Type Description INFRASSTUDIO_LANG_ISO chaîne Langue active. Définie dynamiquement par les gabarits. INFRASSTUDIO_LANG_COOKIE chaîne Nom du cookie de persistance de la langue. INFRASSTUDIO_LANG_MAP_JSON JSON Surcharge de la cartographie ISO2 vers locale. INFRASSTUDIO_BLOG_FALLBACK_IMAGE URL Image par défaut pour les articles sans image principale. Compatibilité et débogage Constante Description INFRASSTUDIO_DOL_VERSION Géré automatiquement. Version de Dolibarr lors de l'activation. INFRASSTUDIO_MAIN_VERSION Géré automatiquement. Version du module. INFRASSTUDIO_DISABLE_CHECK_VERSION_MIN Régler sur 1 pour contourner la vérification de version Dolibarr minimale. INFRASSTUDIOBKP_* Sauvegarde automatique des constantes lors d'une désactivation. Préfixe accolé au nom d'origine. PARTIE V — Administration et maintenance CHAPITRE 27 — Mise à jour du module Les mises à jour du module s'effectuent sans interruption visible côté visiteurs. Ce chapitre présente la procédure standard et les précautions à observer. Avant la mise à jour — liste de contrôle Sur une instance de production, ne sautez jamais ces étapes : Sauvegarde complète de la base Dolibarr (mysqldump). Sauvegarde du dossier htdocs/custom/infrasstudio/ existant. Sauvegarde des données : DOL_DATA_ROOT//website/ et medias/ . Lecture du changelog de la nouvelle version pour repérer d'éventuelles modifications majeures. Test de la mise à jour sur une instance de pré-production lorsque c'est possible. Procédure standard Étape 1 — Désactiver le module Configuration → Modules → InfraSStudio → cliquer sur Désactiver . Effet de la désactivation — Les constantes du module sont sauvegardées sous le préfixe INFRASSTUDIOBKP_ . Les tables et leurs données restent intactes. L'entrée Outils → InfraS disparaît. Étape 2 — Remplacer les fichiers Trois méthodes selon votre environnement : Via l'interface Dolibarr Configuration → Modules → bouton « Déployer / installer un module » . Sélectionner la nouvelle archive module_infrasstudio-X.Y.Z.zip . Confirmer le remplacement. Via SSH ou FTP cd /var/www/dolibarr/htdocs/custom/ mv infrasstudio infrasstudio.old.20260504 unzip /tmp/module_infrasstudio-1.9.0.zip chown -R www-data:www-data infrasstudio/ Via Git cd /var/www/dolibarr/htdocs/custom/infrasstudio git fetch --tags git checkout v1.9.0 Étape 3 — Réactiver le module Configuration → Modules → InfraSStudio → cliquer sur Activer . Le module exécute alors : la restauration des constantes INFRASSTUDIOBKP_ vers INFRASSTUDIO_ , l'application des migrations SQL nécessaires (fichiers sql/update_X.Y.Z_*.sql ), le réenregistrement des hooks et triggers, la mise à jour de la constante INFRASSTUDIO_MAIN_VERSION . Étape 4 — Vérifier avec la page Diagnostic Outils → InfraSStudio → Diagnostic . L'ensemble des contrôles doit être au vert. La section Schéma SQL confirme en particulier que toutes les tables sont à jour. Étape 5 — Test fonctionnel Reproduisez trois actions courantes : Ouvrir une page existante dans l'éditeur — l'aperçu doit se charger. Modifier un slot — l'enregistrement automatique doit fonctionner (indicateur « Enregistré »). Publier les modifications — vérifier que la version publique reflète bien la modification. Lire le changelog avant chaque mise à jour Le changelog est accessible : Dans le module : htdocs/custom/infrasstudio/docs/changelog.xml . Dans l'administration : Outils → InfraSStudio → onglet Changelog. Lire les types de changement Type Signification fix Correction d'une anomalie. chg Modification d'un comportement existant. add Nouvelle fonctionnalité ou option. Numérotation X.Y.Z Composant Cas de modification X (majeur) La version Dolibarr minimale prise en charge change. Y (mineur) Une nouvelle fonctionnalité ou option utilisateur est ajoutée. Z (correctif) Corrections et modifications internes uniquement. Fréquence des mises à jour Recommandations : Correctif (Z) : à appliquer rapidement, surtout si l'anomalie corrigée vous concerne. Mineur (Y) : à appliquer dans les une à deux semaines, après lecture du changelog. Majeur (X) : à tester en pré-production, à planifier dans une fenêtre de maintenance, à communiquer à votre équipe. Retour en arrière Si une mise à jour pose problème : Désactivez le module. Restaurez le dossier infrasstudio.old./ sauvegardé à l'étape 2. Si une migration SQL a été appliquée, restaurez la base depuis le dump précédent. Réactivez le module. Avertissement — Restauration SQL — Une migration ajoute parfois des colonnes ou des tables. Si vous restaurez le dump pré-migration sans restaurer également les fichiers, le module détectera des structures manquantes et s'interrompra. Synchronisez toujours fichiers et base de données ensemble. Récapitulatif Vous savez désormais : Préparer une mise à jour avec une liste de contrôle (sauvegarde base, fichiers, données). Suivre la procédure en cinq étapes (désactiver, remplacer, réactiver, diagnostic, test). Lire le changelog et comprendre la numérotation X.Y.Z. Appliquer la fréquence appropriée selon le type de version. Revenir en arrière en cas d'incident. Fin de la Partie V — Vous savez gérer le module en tant qu'administrateur : permissions, configuration avancée, résolution des incidents, mises à jour. Le module est désormais entre des mains compétentes. La Partie VI propose la référence pure du module : tableaux exhaustifs des constantes, des shortcodes, des hooks, des tables SQL et des scripts en ligne de commande. À garder à portée pour une consultation rapide. CHAPITRE 26 — Diagnostic et résolution des incidents Lorsqu'un comportement inattendu apparaît, ce chapitre vous guide dans la résolution. Le réflexe à adopter est simple : commencer par la page Diagnostic, lire les journaux, et n'envisager une action plus radicale qu'en dernier recours. Toujours commencer par la page Diagnostic Outils → InfraSStudio → onglet Diagnostic . Le contrôle visuel (vert, orange, rouge) couvre : Versions de Dolibarr et de PHP, présence des extensions PHP requises. État du module et de sa dépendance Website. Présence des cinq tables SQL du module. Permissions d'écriture sur DOL_DATA_ROOT . Hooks chargés, présence du trigger, déclaration des tâches planifiées. Pour chaque site géré : résolution du docroot, mode média, dossier de données. À retenir — 80 % des incidents signalés sont en réalité une ligne rouge ou orange du Diagnostic ignorée. Demandez systématiquement à toute personne qui rapporte un dysfonctionnement de joindre d'abord cette capture. Lire les journaux Dolibarr Le module utilise dol_syslog() pour tracer les opérations sensibles, avec le préfixe infrasstudio . Emplacement htdocs/documents/dolibarr.log Filtrer les entrées du module # Toutes les entrées du module grep "infrasstudio" htdocs/documents/dolibarr.log # Uniquement les erreurs grep "infrasstudio.*LOG_ERR" htdocs/documents/dolibarr.log # Suivi en temps réel pendant qu'un utilisateur reproduit le problème tail -f htdocs/documents/dolibarr.log | grep infrasstudio Conseil — Activer le niveau DEBUG — Pour traquer un incident subtil, augmentez temporairement le niveau de journalisation Dolibarr (Configuration → Sécurité → Système) à LOG_DEBUG . Pensez à le rabaisser une fois le diagnostic terminé. Incidents fréquents et solutions Le menu InfraS n'apparaît pas dans Outils Cause probable L'utilisateur ne possède pas la permission paramMenu . Solution Onglet Permissions de l'utilisateur, cocher paramMenu dans la section InfraSStudio. Les modifications ne sont pas visibles publiquement Cause probable Modifications restées en brouillon sans être publiées. Solution Cliquer sur « Publier les modifications » dans la barre d'outils. Voir le Chapitre 12. L'aperçu affiche une erreur 404 Cause probable La page possède un type_container other , menu ou setup , et le filtre du noyau la bloque. Solution Le module corrige automatiquement ce comportement depuis la version 1.8.7. Vérifiez que vous êtes en version 1.8.7 ou supérieure. Erreur réseau dans l'éditeur (erreur AJAX) Cause probable Session Dolibarr expirée, ou avertissement PHP émis avant les en-têtes HTTP. Solution Recharger la page Studio (F5). Si le problème persiste, consultez dolibarr.log pour identifier l'erreur PHP réelle. Les images téléversées ne s'affichent pas publiquement Cause probable Lien symbolique medias manquant ou cassé en mode native. Solution Recréer le lien symbolique avec ln -sfn ... , ou basculer le site en mode média module . Les wrappers solution-*.php ne se génèrent pas Cause probable INFRASSTUDIO_WEBSITE_KEY ou INFRASSTUDIO_PUBLIC_DOCROOT non configurées. Solution Configurer ces deux constantes dans Outils → InfraSStudio → Configuration → Wrappers. Les slots ne se mettent pas à jour après modification du tpl.php Cause probable Le scanner n'a pas été lancé. Solution Outils → InfraSStudio → Contenu → bouton « Rescanner ». Ou en ligne de commande : php scripts/rescan_slots.php . Réinitialiser le module Si le module se trouve dans un état incohérent (utilisation impossible, erreurs SQL persistantes), vous pouvez le réinitialiser : Configuration → Modules → InfraSStudio → cliquer sur Désactiver . Le module sauvegarde toutes ses constantes sous le préfixe INFRASSTUDIOBKP_ . Cliquer à nouveau sur Activer . Le module restaure ses constantes, recrée les tables manquantes et réenregistre les hooks. Aucune perte de données — Les valeurs de slot, les médias et les traductions sont conservés dans leurs tables respectives. La désactivation puis réactivation ne touche qu'au descripteur et aux hooks. Demander de l'aide Si rien ne fonctionne, préparez ces trois informations avant toute demande d'aide : Capture d'écran de la page Diagnostic complète. Les vingt dernières lignes de dolibarr.log filtrées sur infrasstudio . La version exacte du module et de Dolibarr (visibles en haut de la page Diagnostic). Avec ces trois éléments, n'importe quel développeur connaissant le module peut établir un diagnostic en quelques minutes. Récapitulatif Vous savez désormais : Lancer la page Diagnostic comme premier réflexe. Lire et filtrer les journaux Dolibarr. Identifier les sept incidents fréquents et leurs solutions. Réinitialiser le module proprement (désactivation et réactivation). Préparer un rapport d'incident efficace en trois étapes. CHAPITRE 25 — Configuration avancée (constantes) Le module expose une vingtaine de constantes Dolibarr qui permettent d'ajuster son comportement. Ce chapitre les classe par catégorie d'usage avec les valeurs typiques. Sites gérés Constante Description INFRASSTUDIO_MANAGED_SITES CSV des identifiants de sites gérés. Exemple : 1,2,5 . INFRASSTUDIO_SITE__MEDIA_MODE Mode média par site. native (par défaut) ou module . INFRASSTUDIO_SITE__BLOG_INDEX_PAGE Identifiant de la page d'index du blog (active l'assistant « + Nouvel article »). INFRASSTUDIO_SITE__DOCROOT Surcharge du docroot Apache pour ce site spécifique. Portabilité du système de fichiers Pour les hébergements aux configurations non standards : Constante Description INFRASSTUDIO_DOCROOT_PATTERN Modèle de chemin partagé utilisant le marqueur {ref} . Exemple : /srv/sites/{ref} . INFRASSTUDIO_TEMPLATE_EXTRA_DIR Dossier supplémentaire à scanner pour les gabarits de page. Note — Cascade de résolution — Pour le docroot d'un site, l'ordre de recherche est : INFRASSTUDIO_SITE__DOCROOT , puis INFRASSTUDIO_DOCROOT_PATTERN , puis le repli sur /var/www/ . Catalogue produit Constante Description INFRASSTUDIO_WEBSITE_KEY Référence du site cible des wrappers solution. INFRASSTUDIO_PUBLIC_DOCROOT Docroot Apache absolu où écrire les wrappers. INFRASSTUDIO_PRODUCT_UNIVERS_MAP Surcharge JSON de la cartographie catégorie vers univers. INFRASSTUDIO_TRANSLATABLE_PRODUCT_FIELDS CSV de slugs de champs personnalisés à déclarer comme traduisibles, en complément du registre par défaut. INFRASSTUDIO_TRANSLATABLE_PRODUCT_FIELDS_JSON Surcharge JSON complète du registre. INFRASSTUDIO_SITE__WRAPPER_PREFIX Préfixe des wrappers (par défaut solution- ). INFRASSTUDIO_SITE__WRAPPER_TEMPLATE_PAGEURL Slug du gabarit (par défaut solution-detail ). Apparence du Studio Constante Valeurs Par défaut INFRASSTUDIO_UI_THEME light , dark light INFRASSTUDIO_UI_ACCENT indigo , ochre , plum , forest indigo Multilingue côté gabarits Constante Description INFRASSTUDIO_LANG_ISO Force la langue active. Définie dynamiquement par les gabarits. INFRASSTUDIO_LANG_COOKIE Nom du cookie de persistance de la langue (par défaut infras_lang ). INFRASSTUDIO_LANG_MAP_JSON Surcharge de la cartographie ISO2 vers locale (exemple : {"en":"en_GB"} ). INFRASSTUDIO_BLOG_FALLBACK_IMAGE Image par défaut affichée lorsqu'un article ne possède pas d'image principale. Compatibilité et débogage Constante Description INFRASSTUDIO_DOL_VERSION Version de Dolibarr lors de l'activation du module. Géré automatiquement. INFRASSTUDIO_MAIN_VERSION Version du module. Géré automatiquement. INFRASSTUDIO_DISABLE_CHECK_VERSION_MIN À régler sur 1 pour contourner la vérification de version Dolibarr minimale (usage avancé). Définir une constante Méthode A — Via l'administration du module La majorité des constantes sont accessibles dans Outils → InfraSStudio → Configuration, dans la section dépliable « Réglages avancés ». Le formulaire valide les saisies et affiche des avertissements non bloquants en cas d'incohérence. Méthode B — Via SQL INSERT INTO llx_const (name, value, type, visible, entity) VALUES ('INFRASSTUDIO_DOCROOT_PATTERN', '/srv/sites/{ref}', 'chaine', 0, 2); Méthode C — Via PHP en ligne de commande php -r " require 'htdocs/master.inc.php'; \$conf->entity = 2; dolibarr_set_const(\$db, 'INFRASSTUDIO_DOCROOT_PATTERN', '/srv/sites/{ref}', 'chaine', 0, '', 2); " Vérifier la configuration Après chaque modification de constante, lancez la page Diagnostic du module. Elle valide en direct l'existence des chemins, la cohérence des modèles, etc. Récapitulatif Vous savez désormais : Identifier les vingt constantes du module classées par usage. Comprendre la cascade de résolution du docroot. Configurer le catalogue produit (référence du site, docroot, préfixe, gabarit). Personnaliser l'apparence (thème, couleur d'accent). Définir une constante via l'administration, SQL ou ligne de commande. Valider une configuration via la page Diagnostic. CHAPITRE 24 — Permissions et rôles utilisateur Le module expose sept permissions distinctes, attribuables finement aux utilisateurs Dolibarr. Ce chapitre vous indique les attributions à privilégier en fonction des rôles, dans l'esprit du principe de moindre privilège. Les sept permissions du module Permission Ce qu'elle autorise paramMenu Voir l'entrée InfraS dans le menu Outils. Sans cette permission, le module est invisible pour l'utilisateur. readContent Consulter le contenu (pages, slots, médias) en lecture seule. Aucune modification possible. editContent Modifier les valeurs des slots (textes, images, couleurs, etc.) en brouillon. editTranslations Saisir et modifier les traductions (slots et fiches produit). editMedias Téléverser, modifier et supprimer des médias dans la bibliothèque. publish Publier les brouillons en attente, mettre en ligne ou retirer des pages. admin Configurer le module (sites gérés, constantes), supprimer des pages, accéder au Diagnostic. Note — Un utilisateur portant le drapeau Dolibarr « Super-administrateur » contourne toutes les permissions du module. Ce comportement est volontaire pour rester cohérent avec la philosophie de Dolibarr. Pour tester finement les permissions, utilisez un compte non administrateur. Les rôles types Plutôt que d'attribuer les permissions une à une à chaque utilisateur, il est préférable de définir des profils que vous applique ensuite aux comptes. Lecteur Pour une personne qui consulte le site sans le modifier (commercial, support, juriste relisant la conformité). paramMenu Oui readContent Oui Toutes les autres Non Rédacteur Pour une personne qui modifie les contenus mais ne publie pas seule (mise en place d'un circuit de relecture). paramMenu Oui readContent Oui editContent Oui editMedias Oui publish Non (pas de publication directe) Traducteur Pour une personne qui n'effectue que des traductions (souvent un prestataire externe). paramMenu Oui readContent Oui editTranslations Oui Toutes les autres Non Rédacteur autonome Pour une personne qui rédige et publie seule (équipe restreinte, indépendant, etc.). paramMenu Oui readContent Oui editContent Oui editMedias Oui editTranslations Oui publish Oui Administrateur du module Pour le développeur de l'agence ou le responsable technique du site. Toutes les permissions Oui Attribuer les permissions à un utilisateur Rendez-vous dans Accueil → Utilisateurs et Groupes → Liste des utilisateurs. Sélectionnez l'utilisateur cible. Cliquez sur l'onglet Permissions . Faites défiler jusqu'à la section InfraSStudio . Cochez les permissions à attribuer. Enregistrez. Conseil — Utilisez les groupes — Si vous administrez plusieurs rédacteurs, créez un groupe Dolibarr (par exemple « InfraS Rédacteurs ») et attribuez-lui les permissions. Les utilisateurs ajoutés au groupe en héritent automatiquement. Mettre en place un circuit de relecture Voici comment exploiter les permissions pour un circuit de relecture propre : Acteur Permissions Tâche Rédacteur readContent + editContent + editMedias Modifie les slots et prépare les brouillons. Relecteur readContent Consulte les brouillons dans l'aperçu, valide ou demande des modifications. Publicateur readContent + publish Publie les brouillons après validation du relecteur. Récapitulatif Vous savez désormais : Identifier les sept permissions du module. Définir cinq rôles types (lecteur, rédacteur, traducteur, rédacteur autonome, administrateur). Attribuer les permissions à un utilisateur ou à un groupe Dolibarr. Mettre en place un circuit de relecture à plusieurs. PARTIE IV — Pour le développeur intégrateur CHAPITRE 23 — Le catalogue produit dynamique en profondeur Le catalogue produit dynamique transforme votre table llx_product en pages web générées automatiquement. Ce chapitre détaille l'ensemble du fonctionnement côté développeur : architecture, classes, configuration et points d'extension. Architecture en couches Couche Rôle StudioProductCatalog Lit les produits Dolibarr (filtres, tris, multilingue) et expose un format normalisé. StudioSolutionWrapper Génère et supprime les wrappers Apache solution-.php en fonction des produits publiés. Le gabarit solution-detail (page.tpl.php) Le gabarit unique qui affiche un produit. Une seule page Dolibarr Website pour N produits. Trigger PRODUCT et CATEGORY Régénère automatiquement les wrappers à chaque modification de produit ou de catégorie. Tâche planifiée horaire Filet de sécurité : relance la génération si un trigger a été manqué. Le modèle de données produit Chaque produit Dolibarr utilisé dans le catalogue exploite plusieurs tables : Table Données llx_product Champs natifs : ref, label, description, prix, tosell. llx_product_lang Traductions natives (label, description par langue). llx_product_extrafields Champs personnalisés canoniques : tagline, hero_image, badge, cta_label, cta_url, deployment, compatibility, support, languages, features (JSON), pricing_tiers (JSON), infrasstudio_published. llx_infrasstudio_product_translation Surcharges par langue des champs personnalisés traduisibles. llx_categorie_product Liens entre produits et catégories (utilisés pour la cartographie d'univers). Provisionner les champs personnalisés Les onze champs personnalisés nécessaires ne sont pas livrés en standard avec Dolibarr. Pour les créer en une commande, utilisez le script de provisionnement générique : php htdocs/custom/infrasstudio/scripts/preset_default.php \ htdocs/custom/infrasstudio/presets/keaticweb.json Le fichier JSON livre les définitions par défaut (voir Chapitre 28 pour le format). Vous pouvez créer votre propre preset si vous avez besoin d'autres champs personnalisés. Utiliser StudioProductCatalog La classe expose plusieurs méthodes pour interroger les produits : dol_include_once('/infrasstudio/class/studioproductcatalog.class.php'); $catalog = new StudioProductCatalog($db); // Tous les produits publiés, dans la langue courante $products = $catalog->fetchPublishedProducts(array(), $iso2); // Filtres $products = $catalog->fetchPublishedProducts(array( 'univers' => 'supply-chain', 'type' => 'saas', ), $iso2); // Un produit par référence $product = $catalog->fetchProductBySlug('supplyflow-pro', $iso2); // Univers utilisés (pour le filtre du catalogue) $univers = $catalog->fetchUsedUnivers(); Format normalisé d'un produit array( 'id' => 5, 'ref' => 'supplyflow-pro', 'label' => 'SupplyFlow Pro', // résolu selon la langue 'description' => '

Description...

', 'price' => 290.00, 'badge' => 'Nouveau', 'hero_image' => '/medias/...', 'cta_label' => 'Demander une démo', 'cta_url' => '/contact', 'tagline' => 'Optimisez votre supply chain...', 'deployment' => 'Cloud SaaS', 'compatibility'=> 'SAP, Oracle, Sage', 'support' => '24/7', 'languages' => 'fr,en,de', 'features' => array('Prévision IA', 'Multi-entrepôts'), 'pricing_tiers'=> array(...), 'univers' => 'supply-chain', 'type' => 'saas', ) Cartographie catégorie vers univers Les produits sont rattachés à des catégories Dolibarr. Le module associe chaque catégorie à un univers (concept éditorial : Supply Chain, Health, Legal, etc.). Cartographie par défaut // Les six univers livrés par défaut 'supply-chain' => array(...catégories supply chain), 'health' => array(...catégories santé), 'legal' => array(...catégories juridique), 'digital-humanities' => array(...catégories sciences humaines), 'transversal' => array(...catégories outils transversaux), 'fsm' => array(...catégories field service) Surcharge par JSON Pour personnaliser, définissez la constante : // Via dolibarr_set_const ou via la page de configuration admin $conf->global->INFRASSTUDIO_PRODUCT_UNIVERS_MAP = json_encode(array( 'mon-univers' => array(12, 13, 14), // identifiants de catégories 'autre' => array(15, 16), )); StudioSolutionWrapper Cette classe gère la génération des wrappers Apache à partir des produits publiés. Génération manuelle dol_include_once('/infrasstudio/class/studiosolutionwrapper.class.php'); require_once DOL_DOCUMENT_ROOT . '/website/class/website.class.php'; $website = new Website($db); $website->fetch(0, 'monsite'); $wrapper = new StudioSolutionWrapper($db); $stats = $wrapper->rebuildAll($website, '/var/www/monsite'); print_r($stats); // array('created' => 3, 'updated' => 2, 'deleted' => 1, 'skipped' => 5) Anatomie d'un wrapper généré entity > 1 ? '/' . $conf->entity : '') . '/website/monsite/page42.tpl.php'; } if ($res === false) { http_response_code(500); print 'Failed to make include'; } Sécurité anti-collision — Le module ne touche qu'aux wrappers qu'il a lui-même créés (présence du marqueur « StudioSolutionWrapper » dans l'en-tête du fichier). Les pages Dolibarr standards portant un slug commençant par solution- sont préservées. Configuration du générateur de wrappers Constante Rôle INFRASSTUDIO_WEBSITE_KEY Référence du site cible. INFRASSTUDIO_PUBLIC_DOCROOT Docroot Apache absolu (par exemple /var/www/monsite ). INFRASSTUDIO_SITE__WRAPPER_PREFIX Préfixe des wrappers (par défaut solution- ). Exemples : produit- , service- . INFRASSTUDIO_SITE__WRAPPER_TEMPLATE_PAGEURL Slug du gabarit solution-detail (par défaut solution-detail ). Le gabarit solution-detail Il s'agit d'une page Dolibarr Website classique (avec son slug et son tpl.php), mais utilisée par tous les wrappers. Elle reçoit la variable globale $solution_ref qui identifie le produit à afficher. Squelette type fetchProductBySlug($solution_ref, $iso2); if (!$product) { http_response_code(404); print '

Produit introuvable

'; exit; } ob_start(); try { ?> <?php echo dol_escape_htmltag($product['label']); ?>

...
getMessage(); } include dol_buildpath('/infrasstudio/core/tpl/website_output.tpl.php', 0); Mélanger slots et données produit — Vous pouvez combiner les deux : les zones éditoriales (par exemple un titre marketing au-dessus de la grille) en slots, et les zones produit (label, prix, fonctionnalités) lues via StudioProductCatalog . Les deux cohabitent sans conflit. Le trigger PRODUCT et CATEGORY Le module installe un trigger qui écoute : PRODUCT_CREATE PRODUCT_MODIFY PRODUCT_DELETE PRODUCT_PRICE_MODIFY CATEGORY_LINK (uniquement si l'objet lié est un produit) CATEGORY_UNLINK À chaque événement, le trigger appelle StudioSolutionWrapper::rebuildAll() sur le site configuré. Note — Si INFRASSTUDIO_WEBSITE_KEY ou INFRASSTUDIO_PUBLIC_DOCROOT ne sont pas configurées, le trigger se termine silencieusement. Ni bruit, ni erreur. Cette discrétion convient aux instances Dolibarr qui n'utilisent pas le catalogue dynamique. La tâche planifiée horaire (filet de sécurité) Une tâche planifiée s'exécute toutes les heures et appelle StudioSolutionWrapper::rebuildAllConfigured() . Elle lit les constantes et relance la régénération. Cette tâche apporte les bénéfices suivants : Rattrapage si un trigger a été manqué (import en masse, modification SQL directe, etc.). Synchronisation après une migration de serveur. Garantie de cohérence sans intervention manuelle. Reconstruction manuelle en ligne de commande php htdocs/custom/infrasstudio/scripts/rebuild_solution_wrappers.php \ [entity] # Exemple php htdocs/custom/infrasstudio/scripts/rebuild_solution_wrappers.php \ monsite /var/www/monsite 2 Récapitulatif Vous savez désormais : Comprendre l'architecture du catalogue (StudioProductCatalog, StudioSolutionWrapper, gabarit, trigger, tâche planifiée). Provisionner les champs personnalisés produit avec le preset générique. Interroger les produits via StudioProductCatalog . Cartographier les catégories Dolibarr vers vos univers via INFRASSTUDIO_PRODUCT_UNIVERS_MAP . Comprendre comment StudioSolutionWrapper::rebuildAll() génère les wrappers Apache. Configurer le préfixe et le slug du gabarit par site. Écrire le gabarit solution-detail qui sert tous les produits. Comprendre le rôle du trigger automatique et de la tâche planifiée de sécurité. Lancer une reconstruction manuelle en ligne de commande. Fin de la Partie IV — Vous maîtrisez désormais l'intégration côté développeur : préparer un site, annoter avec des slots, comprendre la grammaire, brancher des données Dolibarr, gérer le multilingue, créer vos gabarits et exploiter le catalogue dynamique. Vous êtes en mesure de livrer un site clé en main. La Partie V aborde l'administration et la maintenance. Si vous êtes administrateur Dolibarr, c'est votre prochaine destination. CHAPITRE 22 — Créer ses propres gabarits de page Lorsque votre client clique sur « + Nouvelle page » dans le Studio, il choisit un gabarit de départ. Ce chapitre vous explique comment créer vos propres gabarits adaptés à la charte de votre site. À quoi sert un gabarit Un gabarit est un squelette de page qui comporte : Du HTML structuré (sections, classes CSS, balises sémantiques). Des slots pré-déclarés pour les zones éditables. Des valeurs par défaut, pour disposer d'une page complète dès la création. Des métadonnées (titre par défaut, slug, type de conteneur). Lorsqu'un client crée une page depuis un gabarit, le module : Crée une entrée dans la table llx_website_page . Génère un fichier page.tpl.php à partir du squelette. Crée le wrapper Apache .php . Lance un rescan des slots pour les détecter immédiatement. Structure d'un gabarit Un gabarit est un dossier dans htdocs/custom/infrasstudio/templates/ : templates/mon-gabarit/ ├── meta.php # Métadonnées du gabarit └── skeleton.tpl.php # Le squelette HTML avec slots Le fichier meta.php Il retourne un tableau de configuration : 'mon-gabarit', // identifiant unique 'label' => 'Mon Gabarit', // affiché dans l'assistant 'category' => 'page', // page | landing | blog 'description' => "Description courte affichée sous le titre.", 'icon' => 'fa-file-lines', // icône FontAwesome 'type_container' => 'page', // type Dolibarr Website 'default_slug' => 'nouvelle-page', // slug suggéré ); Champ Description code Identifiant unique. Doit correspondre au nom du dossier. label Texte affiché dans la grille de sélection de l'assistant. category Permet le regroupement visuel (page, landing, blog). icon Classe FontAwesome de l'icône de la tuile. type_container Valeur écrite dans llx_website_page.type_container . Valeurs standards : page , blogpost , other , menu . default_slug Slug suggéré dans le formulaire. Le client peut le modifier. Le fichier skeleton.tpl.php Il s'agit du squelette HTML, identique à un fichier tpl.php standard, à la différence qu'il contient des marqueurs qui seront remplacés au moment de la création. Marqueurs disponibles Marqueur Remplacé par @@PAGEID@@ L'identifiant Dolibarr de la nouvelle page (par exemple 42). @@PAGEURL@@ Le slug URL final (par exemple about-keatic ). @@ISO2@@ Le code ISO2 de la langue principale ( fr , en ). Exemple complet — gabarit page-libre meta.php 'page-libre', 'label' => 'Page libre', 'category' => 'page', 'description' => 'Une page simple avec un titre et un grand champ de texte riche.', 'icon' => 'fa-file-lines', 'type_container' => 'page', 'default_slug' => 'nouvelle-page', ); skeleton.tpl.php {{slot:page_title|type=text|default=Nouvelle page|label=Titre SEO|group=seo}}

{{slot:page_h1|type=text|default=Titre principal|label=H1|group=hero}}

{{slot:page_body|type=richtext|default=

Contenu de la page.

|label=Contenu}}
getMessage(); } include dol_buildpath('/infrasstudio/core/tpl/website_output.tpl.php', 0); // END PHP ?> Le bloc final — N'oubliez pas la ligne include dol_buildpath('/infrasstudio/core/tpl/website_output.tpl.php', 0); . C'est elle qui déclenche la résolution des slots et shortcodes au moment du rendu. Localiser vos gabarits hors du module Si vous souhaitez livrer des gabarits avec votre projet client sans modifier le module, définissez la constante : // htdocs/conf/conf.php ou via dolibarr_set_const $conf->global->INFRASSTUDIO_TEMPLATE_EXTRA_DIR = '/var/www/monsite/templates'; Le module scanne ce répertoire en complément de htdocs/custom/infrasstudio/templates/ . Gabarits livrés par défaut Code Description page-free Page libre avec titre et un grand champ texte riche. Pour les pages ponctuelles. blog-standard Article de blog générique avec hero, introduction, corps et appel à l'action. example-blog Article de blog au design moderne (hero CSS, accroche en italique, image secondaire, articles liés). Adaptable à votre charte. example-landing Page de destination produit complète (environ 70 slots). Hero, problème, solution, fonctionnalités, contact, FAQ. Conseil — Inspirez-vous de example-landing pour comprendre comment structurer un gabarit complexe avec environ 70 slots organisés en sections. Bonnes pratiques pour vos gabarits Préfixez tous les slots du gabarit par un identifiant commun (par exemple landing_ ) pour éviter les collisions entre gabarits. Regroupez les slots avec group= par section logique (hero, fonctionnalités, contact, etc.). Donnez des valeurs par défaut représentatives. Le rédacteur dispose ainsi d'un exemple à modifier plutôt que d'une page vide intimidante. Incluez les slots SEO ( page_title , page_meta_description ) dans tout gabarit de type page. Incluez les balises Open Graph dans l'en-tête HTML pour le partage social. Incluez le helper hreflang si le site est multilingue. Testez le gabarit en créant une page réelle depuis l'assistant et vérifiez le rendu public. Récapitulatif Vous savez désormais : Comprendre l'utilité d'un gabarit (squelette, slots, valeurs par défaut). Créer un dossier templates// avec meta.php et skeleton.tpl.php . Renseigner les métadonnées (code, label, category, icon, type_container, default_slug). Utiliser les marqueurs @@PAGEID@@ , @@PAGEURL@@ et @@ISO2@@ . Localiser vos gabarits en dehors du module via INFRASSTUDIO_TEMPLATE_EXTRA_DIR . Suivre les bonnes pratiques (préfixe, regroupement, valeurs par défaut, SEO, multilingue). Le dernier chapitre de la Partie IV détaille le catalogue produit dynamique en profondeur. CHAPITRE 21 — Gérer le multilingue (pages sœurs) Dolibarr Website propose deux modèles multilingues différents. Identifier le modèle que vous utilisez est une étape préalable à toute écriture de code. Ce chapitre vous présente les deux options et la manière dont le module s'y intègre. Les deux modèles multilingues Modèle Caractéristique A. Slot par langue (recommandé) Un seul fichier tpl.php sert toutes les langues. Les slots disposent de surcharges par langue. B. Pages sœurs (legacy) Un fichier tpl.php par langue ( about.php , about-en.php , about-de.php ). Modèle hérité des sites Dolibarr Website classiques. Recommandé — Adoptez le modèle A pour tout nouveau site. Le modèle B reste pris en charge pour la migration progressive de sites existants. Le module fournit un outil de consolidation B vers A. Modèle A — Slot par langue (le standard moderne) Fonctionnement Une seule page Dolibarr Website existe par concept (par exemple about ). Le fichier tpl.php est unique. Les slots possèdent leur valeur canonique (FR par défaut) et des surcharges par langue stockées dans llx_infrasstudio_slot .

{{slot:about_title|type=text|default=À propos de nous|label=Titre About}}

{{slot:about_lead|type=textarea|default=Notre histoire en quelques mots.|label=Accroche}}

Récupérer la langue du visiteur dans le gabarit Le module résout les slots automatiquement selon la langue détectée. Pour vos propres traitements PHP (afficher la date dans la bonne langue, choisir une image différente par langue), récupérez la langue via : Cascade de détection La fonction infrasstudio_current_lang() détecte la langue dans cet ordre : Constante INFRASSTUDIO_LANG_ISO définie par le site (souvent dans lang.inc.php ). Paramètre URL ?lang=xx . Suffixe sur le slug ( about-en.php donne en). Cookie de persistance ( INFRASSTUDIO_LANG_COOKIE ). Valeur de $langs->defaultlang . En-tête HTTP Accept-Language du visiteur. Modèle B — Pages sœurs (legacy) Il s'agit du modèle Dolibarr Website classique : pour chaque page, vous créez un fichier tpl.php par langue. about.php # FR (canonique) about-en.php # EN about-de.php # DE about-es.php # ES ... Si vous reprenez un site existant qui suit ce modèle, deux options s'offrent à vous : Conserver le modèle avec des stubs du module. Migrer vers le modèle A grâce à l'outil de consolidation en ligne de commande. Conserver le modèle B avec des stubs Le module fournit un helper sister_stub.tpl.php qui réduit chaque page sœur à trois lignes et permet de partager le HTML avec la canonique. Procédure La page canonique reste un tpl.php classique : // page5.tpl.php — canonique FR ...

{{slot:about_title|type=text|default=À propos|...}}

... Chaque page sœur devient un stub : \ [--entity=N] \ [--base-slug=about] \ [--dry-run] \ [--extractor=/path/to/extractor.php] Ce que fait le script Détecte les groupes de pages sœurs parmi les codes ISO2 pris en charge (en, de, es, it, pt, nl, pl). Pour chaque groupe : Conserve la page tpl FR comme canonique. Extrait les valeurs traduites depuis chaque page sœur (par expression régulière ou via un extracteur personnalisé). Insère les surcharges dans llx_infrasstudio_slot . Réécrit la canonique avec des slots {{slot:...}} . Remplace chaque page sœur par un stub de trois lignes. Sauvegarde de chaque tpl original avec l'extension .bak . Conseil — Lancez d'abord avec --dry-run pour visualiser ce que le script va faire sans rien écrire. Lancez en mode réel uniquement après vérification. hreflang : déclarer les alternates au navigateur Pour que Google sache que vos pages sont des traductions les unes des autres, vous devez émettre des balises dans l'en-tête HTML. Le module fournit un helper qui les génère automatiquement : ... ... Sortie type : Compatibilité avec les deux modèles — Pour le modèle A, le helper émet une seule URL canonique avec les langues différenciées par ?lang= . Pour le modèle B, il émet une URL par page sœur. Sélecteur de langue côté gabarit Pour permettre au visiteur de changer de langue, vous devez exposer un sélecteur. Le helper infrasstudio_translated_url($iso2) génère l'URL équivalente de la page courante dans une autre langue : Charger les fichiers de langue du site Si votre site utilise des fichiers .lang Dolibarr (par exemple pour les libellés de menu), chargez-les en début de tpl : loadLangs(array('website_main', 'website_blog')); ?> Et utilisez les clés via $langs->trans('Key') ou via le slot avec default=@lang:Key . Récapitulatif Vous savez désormais : Distinguer le modèle A (slot par langue, recommandé) du modèle B (pages sœurs, legacy). Récupérer la langue du visiteur via infrasstudio_current_lang() . Convertir un site existant utilisant le modèle B en utilisant le helper sister_stub.tpl.php . Migrer en bloc B vers A grâce à l'outil consolidate_sister_pages.php . Émettre les balises hreflang automatiquement avec infrasstudio_hreflang_tags . Construire un sélecteur de langue avec infrasstudio_translated_url . CHAPITRE 20 — Insérer des données Dolibarr (shortcodes) Les slots stockent du contenu éditable. Les shortcodes , eux, affichent des données Dolibarr lues en direct (produits, catégories, informations société, médias). Ils sont résolus au moment du rendu, à chaque consultation de page. Distinction entre slot et shortcode Slot Shortcode Stocke du contenu éditable par le client. Affiche des données Dolibarr lues en direct. Persistance dans llx_infrasstudio_slot . Aucune persistance — résolu à chaque requête. Exemple : {{slot:hero_title|type=text}} Exemple : {{product:ref=supplyflow.label}} Syntaxe générale {{:.}} namespace : la source de données ( product , category , dict , mysoc , extrafield , media ). sélecteur : la manière d'identifier l'élément (le plus souvent ref=xxx ou id=N ). champ : la donnée à extraire de l'élément. Namespace product Lit un produit dans la table llx_product .

{{product:ref=supplyflow-pro.label}}

{{product:ref=supplyflow-pro.description}}

{{product:ref=supplyflow-pro.price}} € {{product:ref=supplyflow-pro.ef_tagline}} ... Champs disponibles Champ Source label , description , note Champs natifs (traduits selon la langue du visiteur via llx_product_lang ) price , price_ttc , cost_price Prix HT, TTC, coût (formaté selon la langue) ref , tosell Référence, statut commercialisable ef_ Tout champ personnalisé ( ef_tagline , ef_hero_image , etc.) Le marqueur $current Pour un même gabarit utilisé par plusieurs produits (par exemple solution-detail servi par les wrappers solution-.php ), utilisez ref=$current :

{{product:ref=$current.label}}

{{product:ref=$current.ef_tagline}}

Le module résout $current via la variable globale $infrasstudio_current_product_ref , posée par le wrapper. Namespace category Lit une catégorie dans la table llx_categorie .

{{category:id=5.label}}

{{category:id=5.description}}

Namespace dict Lit une entrée d'un dictionnaire Dolibarr ( c_country , c_currencies , etc.). {{dict:c_country.code=FR.label}} {{dict:c_currencies.code_iso=EUR.label}} Namespace mysoc Lit les informations de la société courante ( $mysoc ).
© {{mysoc.name}} — {{mysoc.address}}, {{mysoc.zip}} {{mysoc.town}} Tél : {{mysoc.phone}} — Courriel : {{mysoc.email}} SIRET {{mysoc.idprof2}} — TVA {{mysoc.tva_intra}}
Champs disponibles name , address , zip , town , country_code , phone , fax , email , url , capital , tva_intra , idprof1 à idprof6 , logo , logo_small , logo_squarred . Namespace extrafield Lit un champ personnalisé d'un objet Dolibarr quelconque. {{extrafield:table=product|ref=supplyflow.field=tagline}} {{extrafield:table=societe|id=42|field=segment}} {{extrafield:table=product|ref=$current|field=tagline}} Plus générique que {{product:ref=X.ef_tagline}} mais plus verbeux. À utiliser lorsque le namespace dédié n'existe pas (par exemple pour societe ou contact ). Namespace media Lit un média de la bibliothèque du module ( llx_infrasstudio_media ). {{media:ref=hero-1.alt}} Champs disponibles Champ Description url URL du fichier original thumb Variante 200 × 200 card Variante 640 × 480 wide Variante 1600 × 1200 alt Texte alternatif (résolu selon la langue) label , width , height Métadonnées Combiner shortcodes et slots Vous pouvez intégrer un shortcode dans la valeur par défaut d'un slot, ou dans le contenu d'un slot de type texte riche :

{{slot:greeting|type=text|default=Bienvenue chez {{mysoc.name}}}}

{{slot:long_intro|type=richtext|default=Notre équipe à {{mysoc.town}} vous accompagne.}}
Cas d'usage — Une page de remerciements après commande qui dit « Merci, votre commande sera livrée à... ». Le HTML reste statique côté gabarit, mais le rendu est personnalisé pour chaque visiteur. Étendre avec un namespace personnalisé Pour ajouter un namespace propre à votre projet, déposez un fichier dans htdocs/custom/infrasstudio/shortcodes/ : // shortcodes/myorg.shortcode.php function infrasstudio_shortcode_myorg_resolve($args, $context) { global $db; $id = isset($args['id']) ? (int) $args['id'] : 0; $field = isset($args['_field']) ? $args['_field'] : 'name'; if ($id <= 0) { return ''; } $sql = "SELECT name, sector FROM ".MAIN_DB_PREFIX."myorg WHERE rowid = ".$id; $resql = $db->query($sql); if (!$resql) { return ''; } $obj = $db->fetch_object($resql); $db->free($resql); return isset($obj->$field) ? (string) $obj->$field : ''; } Utilisable dans n'importe quel gabarit :

{{myorg:id=12.name}}

Secteur : {{myorg:id=12.sector}}

Pièges et performance Shortcode dans une boucle — Si vous résolvez cent fois le même shortcode dans une page, vous effectuez cent requêtes SQL. Mettez vos données en cache dans une variable locale avant la boucle, ou utilisez les fonctions natives Dolibarr ( Product::fetch ) en PHP. Shortcode introuvable — Si {{product:ref=inexistant.label}} ne résout rien, le module retourne une chaîne vide silencieusement. Aucune erreur n'est affichée. Testez en local avant la livraison. Shortcodes dans les attributs — Les shortcodes fonctionnent dans tous les contextes HTML, attributs compris : , , etc. Récapitulatif Vous savez désormais : Distinguer slots (contenu éditable) et shortcodes (données Dolibarr). Utiliser les six namespaces livrés (product, category, dict, mysoc, extrafield, media). Utiliser $current dans les gabarits partagés entre plusieurs produits. Combiner shortcodes et slots. Ajouter votre propre namespace via un fichier dans shortcodes/ . Anticiper les pièges (boucles, valeurs absentes). CHAPITRE 19 — La grammaire des slots en détail Référence exhaustive de tous les types de slot et de leurs attributs. Gardez ce chapitre à portée de main lors de l'annotation d'un template. Format général {{slot:|type=|default=|label=|group=
|help=|maxlength=|options=}} Tous les attributs, à l'exception de name et type , sont facultatifs. L'ordre est libre. Le séparateur est le caractère pipe. Règles syntaxiques Règle Détail Identifiant [a-z0-9_]+ , 64 caractères maximum. Pas de tirets, pas de majuscules. Unicité Unique par page. Deux slots avec le même nom sur la même page produisent un avertissement au scan. Pas d'espaces Aucun espace de part et d'autre du signe = . Aucun espace dans les noms d'attributs. Échappement Le pipe à l'intérieur d'une valeur n'est pas pris en charge. Évitez-le dans les valeurs default . Une seule ligne Un token de slot tient sur une seule ligne. Aucun saut de ligne ne doit y être présent. Les dix types de slot Type text — Texte court Champ d'une seule ligne, sans mise en forme.

{{slot:hero_title|type=text|default=Bienvenue|label=Titre principal|maxlength=80}}

Interface : champ de saisie simple. Idéal pour : titres, libellés, boutons d'appel à l'action, copyright. Compteur de caractères affiché si maxlength est défini. Type textarea — Texte long brut Multi-lignes, sans mise en forme HTML.

{{slot:hero_lead|type=textarea|default=Une accroche.|label=Accroche|maxlength=300}}

Interface : zone de texte multi-lignes. Les retours à la ligne sont automatiquement convertis en balises
au rendu. Idéal pour : accroches, paragraphes simples. Type richtext — Texte riche WYSIWYG Mise en forme complète via CKEditor.
{{slot:post_body|type=richtext|default=

Contenu de l'article.

|label=Corps de l'article}}
Interface : éditeur CKEditor (Format, gras, italique, listes, liens, couleurs, alignement, etc.). Idéal pour : corps d'articles, descriptions longues, conditions générales. La valeur stockée contient du HTML (

, , etc.). Type image — Média image ... Interface : champ texte, bouton de sélection dans la bibliothèque, bouton de suppression et vignette d'aperçu. Stocke soit une URL absolue, soit un shortcode {{media:ref=X.url}} . Non traduisible par défaut : la même image est servie dans toutes les langues. Type url — Lien ... Interface : champ texte avec validation URL légère. Idéal pour : URL de bouton, liens vers les réseaux sociaux, URL de partage. Type icon — Icône FontAwesome {{slot:feature_1_icon|type=icon|default=fa-solid fa-rocket|label=Icône feature 1}} Interface : champ classe, sélecteur de couleur, vingt icônes proposées en accès rapide, aperçu en direct. Stockage en JSON : {"class":"fa-solid fa-star","color":"#fbbf24"} . Rendu : . Sécurisé : liste blanche sur la classe (a-zA-Z0-9_-) et expression régulière hexadécimale sur la couleur. Type color — Couleur

Interface : sélecteur de couleur HTML5, champ hexadécimal, bouton de retour à la valeur par défaut. Format strict : #RRGGBB ou #RRGGBBAA (avec transparence). Non traduisible. Type number — Nombre {{slot:stats_clients|type=number|default=42|label=Nombre de clients}} Type bool — Booléen Nouveau Interface : case à cocher. Valeur : 0 ou 1. Type select — Liste déroulante
Interface : menu déroulant. Les valeurs disponibles sont définies dans options (CSV obligatoire). Valeurs par défaut spéciales default=@lang:KEY — Résolution via les fichiers de langue Lorsque votre site utilise déjà des fichiers .lang Dolibarr (cas typique pour les sites multilingues existants), vous pouvez réutiliser les clés au lieu de les dupliquer dans les slots :

{{slot:hero_title|type=text|default=@lang:HeroTitle|label=Titre du hero}}

Au moment du rendu, le module résout via $langs->trans('HeroTitle') selon la langue du visiteur. Les fichiers .lang du site présents dans DOL_DATA_ROOT//website//langs/ sont chargés automatiquement. Cas d'usage — Migration progressive d'un site existant : vous conservez vos fichiers .lang en l'état, vous ajoutez les slots, et le client peut soit éditer dans le Studio (surcharge), soit conserver la traduction du .lang (canonique). Récapitulatif des types et de leur traduisibilité Type Interface Traduisible text Champ de saisie Oui textarea Zone de texte Oui richtext CKEditor Oui image Sélecteur de média Non url Champ de saisie Non icon Classe et sélecteur de couleur Non color Sélecteur de couleur Non number Champ numérique Oui (rare) bool Case à cocher Non select Menu déroulant Non Pièges fréquents Slots dans des attributs JSON intégrés — Si vous avez du JSON intégré dans une balise (par exemple data-config="{...}" ), n'y placez pas de slot. Les doubles accolades sont aussi un délimiteur Mustache et risquent de casser les bibliothèques JavaScript qui parseraient ce JSON. Identifiant trop long — La limite est de 64 caractères. Au-delà, le scanner rejette silencieusement, ce que met en évidence l'option --lint . Espaces autour des = — Le scanner rejette type = text . Utilisez toujours type=text . Caractère pipe dans une valeur — default=A|B casse l'analyseur. Utilisez une autre séparation, ou laissez default vide et saisissez la valeur via le Studio. Récapitulatif Vous savez désormais : La syntaxe complète d'un token de slot. Les dix types disponibles et leurs interfaces respectives. La résolution @lang:KEY pour réutiliser les fichiers .lang Dolibarr. Quels types sont traduisibles ou non. Les pièges syntaxiques fréquents. Le chapitre suivant aborde les shortcodes, qui injectent des données Dolibarr dans le HTML. CHAPITRE 18 — Annoter un template avec des slots Le slot est l'unité de base du module. Ce chapitre vous montre comment transformer un HTML statique en HTML annoté, prêt à être édité par le client. Il s'agit de l'opération la plus fréquente dans votre travail d'intégrateur. Le principe en deux phrases Vous écrivez votre HTML normalement, comme vous le feriez sans le module. Aux endroits que vous voulez rendre éditables, vous remplacez le contenu en dur par un token {{slot:...}} . C'est tout. Le module se charge du reste : détection automatique, persistance, rendu, interface d'édition. Premier exemple complet Avant — page non éditable

Bienvenue chez Keatic

Votre partenaire numérique de confiance depuis 2010.

Nous contacter
Après — page éditable via le Studio

{{slot:hero_title|type=text|default=Bienvenue chez Keatic|label=Titre du hero|group=hero}}

{{slot:hero_lead|type=textarea|default=Votre partenaire numérique de confiance depuis 2010.|label=Accroche|group=hero}}

{{slot:hero_cta_label|type=text|default=Nous contacter|label=Libellé du bouton|group=hero}}
Résultat — Le client voit dans le Studio un panneau « Hero » comportant quatre champs (titre, accroche, URL du bouton, libellé du bouton). Aucun HTML à modifier de son côté. Anatomie d'un token de slot {{slot:|type=|attribut1=valeur1|attribut2=valeur2}} Élément Obligatoire Description {{slot: Oui Préfixe fixe qui déclare un slot. Identifiant Oui Unique par page. Caractères acceptés : minuscules, chiffres, tiret bas. 64 caractères maximum. type= Oui text, textarea, richtext, image, url, number, select, bool, icon, color. default= Recommandé Valeur de repli si le slot n'est pas encore édité. label= Recommandé Libellé affiché à l'éditeur dans le Studio. group= Facultatif Regroupe les slots dans une section de l'interface. help= Facultatif Aide affichée sous le champ. maxlength= Facultatif Limite de caractères pour text et textarea. options= Si type=select Liste CSV des valeurs possibles. Conseil — La grammaire complète est détaillée au Chapitre 19. Où placer un slot Un slot peut être placé à de nombreux endroits dans votre HTML. Dans le contenu d'une balise (cas le plus fréquent)

{{slot:title|type=text|default=Bienvenue}}

Dans un attribut HTML ... ...
Dans une chaîne de classes CSS À ne pas faire — Ne placez pas un slot dans un commentaire HTML, dans un bloc