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

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 :

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 :

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. »

PARTIE VII — Annexes

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.

Version 1.8.x — Avril 2026

Catalogue produit dynamique et workflow brouillon/publication.

Version 1.7.x — Avril 2026

Éditeur unifié et inspecteur.

Version 1.6.0 — Avril 2026

Système de design « Elevated CMS ».

Version 1.5.0 — Avril 2026

Constructeur de pages par blocs (déprécié en 1.8.5).

Version 1.4.0 — Avril 2026

Référencement et sitemap.

Version 1.3.x — Avril 2026

Création de pages depuis l'interface.

Version 1.2.x — Avril 2026

Bibliothèque média.

Version 1.1.x — Avril 2026

Système de slots et de shortcodes.

Version 1.0.0 — Avril 2026

Première version.

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.

PARTIE VII — Annexes

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/<nom>.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.

PARTIE VII — Annexes

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_<objet>_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 <meta property="og:..."> 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/<entity>/website/<ref>/page<N>.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-<ref>.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


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 <website_ref_or_id> [--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 <websitekey-or-id> <public-docroot> [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 <website_ref> [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 <chemin-vers-preset.json>

# 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 <site_ref> \
    [--entity=N] \
    [--base-slug=<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 <tpl_path> [--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

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.

PARTIE VI — Référence

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

PARTIE VI — Référence

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.

PARTIE VI — Référence

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=<ref> ou id=<rowid> 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_<slug>

Tout champ personnalisé

{{product:ref=supplyflow.label}}
{{product:ref=$current.ef_tagline}}
{{product:id=42.price}}

Namespace category

Sélecteurs : id=<rowid> ou ref=<ref>.

Champs : label, description, color, ref.

{{category:id=5.label}}
{{category:ref=blog-marketing.label}}

Namespace dict

Sélecteurs : <table>.<col>=<valeur>.

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=<table>|ref=<ref> ou table=<table>|id=<id> avec field=<name>.

{{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=<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/<nom>.shortcode.php qui exporte une fonction infrasstudio_shortcode_<nom>_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;
}
PARTIE VI — Référence

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_<id>_MEDIA_MODE

chaîne

native

Mode média par site :

native

ou

module

.

INFRASSTUDIO_SITE_<id>_BLOG_INDEX_PAGE

entier

0

Identifiant de la page d'index du blog (active l'assistant « + Nouvel article »).

INFRASSTUDIO_SITE_<id>_DOCROOT

chemin

vide

Surcharge du docroot Apache de ce site.

INFRASSTUDIO_SITE_<id>_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_<id>_WRAPPER_PREFIX

chaîne

solution-

Préfixe des wrappers générés.

INFRASSTUDIO_SITE_<id>_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

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 :

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

  1. Configuration → Modules → bouton « Déployer / installer un module ».
  2. Sélectionner la nouvelle archive module_infrasstudio-X.Y.Z.zip.
  3. 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
  1. Configuration → Modules → InfraSStudio → cliquer sur Activer.
  2. 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 :

  1. Ouvrir une page existante dans l'éditeur — l'aperçu doit se charger.
  2. Modifier un slot — l'enregistrement automatique doit fonctionner (indicateur « Enregistré »).
  3. 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 :

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 :

Retour en arrière

Si une mise à jour pose problème :

  1. Désactivez le module.
  2. Restaurez le dossier infrasstudio.old.<date>/ sauvegardé à l'étape 2.
  3. Si une migration SQL a été appliquée, restaurez la base depuis le dump précédent.
  4. 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 :

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.

PARTIE V — Administration et maintenance

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 :

À 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 <ref-site>

.

Réinitialiser le module

Si le module se trouve dans un état incohérent (utilisation impossible, erreurs SQL persistantes), vous pouvez le réinitialiser :

  1. Configuration → Modules → InfraSStudio → cliquer sur Désactiver.
  2. Le module sauvegarde toutes ses constantes sous le préfixe INFRASSTUDIOBKP_.
  3. Cliquer à nouveau sur Activer.
  4. 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 :

  1. Capture d'écran de la page Diagnostic complète.
  2. Les vingt dernières lignes de dolibarr.log filtrées sur infrasstudio.
  3. 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 :

PARTIE V — Administration et maintenance

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_<id>_MEDIA_MODE

Mode média par site.

native

(par défaut) ou

module

.

INFRASSTUDIO_SITE_<id>_BLOG_INDEX_PAGE

Identifiant de la page d'index du blog (active l'assistant « + Nouvel article »).

INFRASSTUDIO_SITE_<id>_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_<id>_DOCROOT, puis INFRASSTUDIO_DOCROOT_PATTERN, puis le repli sur /var/www/<ref>.

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_<id>_WRAPPER_PREFIX

Préfixe des wrappers (par défaut

solution-

).

INFRASSTUDIO_SITE_<id>_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 :

PARTIE V — Administration et maintenance

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

  1. Rendez-vous dans Accueil → Utilisateurs et Groupes → Liste des utilisateurs.
  2. Sélectionnez l'utilisateur cible.
  3. Cliquez sur l'onglet Permissions.
  4. Faites défiler jusqu'à la section InfraSStudio.
  5. Cochez les permissions à attribuer.
  6. 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 :

PARTIE IV — Pour le développeur intégrateur


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-<ref>.php

en fonction des produits publiés.

Le gabarit solution-detail (page<X>.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'  => '<p>Description...</p>',
    '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é
<?php
// /var/www/monsite/solution-supplyflow-pro.php
// Generated by StudioSolutionWrapper — do not edit manually.
$solution_ref = 'supplyflow-pro';
$infrasstudio_current_product_ref = 'supplyflow-pro';
global $dolibarr_main_data_root, $conf;
if (empty($dolibarr_main_data_root)) {
    $res = include './page42.tpl.php';   // page solution-detail
} else {
    $res = include $dolibarr_main_data_root
        . ($conf->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_<id>_WRAPPER_PREFIX

Préfixe des wrappers (par défaut

solution-

). Exemples :

produit-

,

service-

.

INFRASSTUDIO_SITE_<id>_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
<?php
// page42.tpl.php (slug='solution-detail', type_container='page')
require_once __DIR__ . '/master.inc.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/website.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/website.inc.php';

dol_include_once('/infrasstudio/class/studioproductcatalog.class.php');
$catalog = new StudioProductCatalog($db);
$iso2 = infrasstudio_current_lang();
$product = $catalog->fetchProductBySlug($solution_ref, $iso2);
if (!$product) {
    http_response_code(404);
    print '<h1>Produit introuvable</h1>';
    exit;
}

ob_start();
try {
?>
<html lang="<?php echo $iso2; ?>">
<head>
    <title><?php echo dol_escape_htmltag($product['label']); ?></title>
</head>
<body>
    <section class="hero">
        <h1><?php echo dol_escape_htmltag($product['label']); ?></h1>
        <p><?php echo dol_escape_htmltag($product['tagline']); ?></p>
        <img src="<?php echo $product['hero_image']; ?>" alt="...">
    </section>
    <section class="features">
        <ul>
        <?php foreach ($product['features'] as $feature): ?>
            <li><?php echo dol_escape_htmltag($feature); ?></li>
        <?php endforeach; ?>
        </ul>
    </section>
</body>
</html>
<?php
} catch (Exception $e) { print $e->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 :

À 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 :

Reconstruction manuelle en ligne de commande

php htdocs/custom/infrasstudio/scripts/rebuild_solution_wrappers.php \
    <ref-site-ou-id> <docroot-public> [entity]

# Exemple
php htdocs/custom/infrasstudio/scripts/rebuild_solution_wrappers.php \
    monsite /var/www/monsite 2

Récapitulatif

Vous savez désormais :

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.

PARTIE IV — Pour le développeur intégrateur

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 :

Lorsqu'un client crée une page depuis un gabarit, le module :

  1. Crée une entrée dans la table llx_website_page.
  2. Génère un fichier page<N>.tpl.php à partir du squelette.
  3. Crée le wrapper Apache <slug>.php.
  4. 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 :

<?php
return array(
    'code'           => '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
<?php
return array(
    'code'           => '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
<?php // BEGIN PHP
$websitekey = basename(__DIR__);
if (! defined('USEDOLIBARRSERVER') && ! defined('USEDOLIBARREDITOR')) {
    require_once __DIR__ . '/master.inc.php';
}
require_once DOL_DOCUMENT_ROOT . '/core/lib/website.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/website.inc.php';
ob_start();
try {
// END PHP ?>
<html lang="@@ISO2@@">
<head>
    <title>{{slot:page_title|type=text|default=Nouvelle page|label=Titre SEO|group=seo}}</title>
    <meta name="description" content="{{slot:page_meta_description|type=text|default=|label=Meta description|group=seo}}" />
    <link rel="canonical" href="<?php echo $website->virtualhost; ?>/@@PAGEURL@@.php" />
</head>
<body>
    <?php includeContainer('header'); ?>
    <main class="container">
        <h1>{{slot:page_h1|type=text|default=Titre principal|label=H1|group=hero}}</h1>
        <div class="content">
            {{slot:page_body|type=richtext|default=<p>Contenu de la page.</p>|label=Contenu}}
        </div>
    </main>
    <?php includeContainer('footer'); ?>
</body>
</html>
<?php // BEGIN PHP
} catch (Exception $e) { print $e->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

Récapitulatif

Vous savez désormais :

Le dernier chapitre de la Partie IV détaille le catalogue produit dynamique en profondeur.

PARTIE IV — Pour le développeur intégrateur

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.

<!-- about.tpl.php — UN SEUL fichier pour FR/EN/DE/ES/IT/PT/NL/PL -->
<h1>{{slot:about_title|type=text|default=À propos de nous|label=Titre About}}</h1>
<p>{{slot:about_lead|type=textarea|default=Notre histoire en quelques mots.|label=Accroche}}</p>
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 :

<?php
// helpers fournis par le module
$iso2 = infrasstudio_current_lang();         // 'fr', 'en', 'de', ...
$locale = infrasstudio_current_locale();     // 'fr_FR', 'en_US', 'de_DE', ...
?>
Cascade de détection

La fonction infrasstudio_current_lang() détecte la langue dans cet ordre :

  1. Constante INFRASSTUDIO_LANG_ISO définie par le site (souvent dans lang.inc.php).
  2. Paramètre URL ?lang=xx.
  3. Suffixe sur le slug (about-en.php donne en).
  4. Cookie de persistance (INFRASSTUDIO_LANG_COOKIE).
  5. Valeur de $langs->defaultlang.
  6. 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 :

  1. Conserver le modèle avec des stubs du module.
  2. 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
<?php // bootstrap dolibarr ... ?>
<html>...<h1>{{slot:about_title|type=text|default=À propos|...}}</h1>...</html>

Chaque page sœur devient un stub :

<?php
// page42.tpl.php — sister EN
$_infrasstudio_sister_canonical = 'page5.tpl.php';
$_infrasstudio_sister_lang      = 'en';
include dol_buildpath('/infrasstudio/core/tpl/sister_stub.tpl.php', 0);

Le stub force $_GET['lang'] = 'en' puis délègue le rendu à la canonique. Les surcharges EN sont automatiquement utilisées pour résoudre les slots.

Migrer du modèle B vers A en ligne de commande

Un script consolide une famille de pages sœurs en une page canonique et plusieurs stubs :

php htdocs/custom/infrasstudio/scripts/consolidate_sister_pages.php <ref-site> \
    [--entity=N] \
    [--base-slug=about] \
    [--dry-run] \
    [--extractor=/path/to/extractor.php]
Ce que fait le script
  1. Détecte les groupes de pages sœurs parmi les codes ISO2 pris en charge (en, de, es, it, pt, nl, pl).
  2. 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.
  3. 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 <link rel="alternate" hreflang="..."> dans l'en-tête HTML.

Le module fournit un helper qui les génère automatiquement :

<head>
    ...
    <?php echo infrasstudio_hreflang_tags($website, $WEBSITE_PAGE); ?>
    ...
</head>

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 :

<nav class="lang-switcher">
    <?php foreach (array('fr', 'en', 'de', 'es') as $iso): ?>
        <a href="<?php echo infrasstudio_translated_url($iso); ?>">
            <?php echo strtoupper($iso); ?>
        </a>
    <?php endforeach; ?>
</nav>

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 :

<?php
require_once __DIR__ . '/lang.inc.php';
$langs->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 :

PARTIE IV — Pour le développeur intégrateur

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>:<sélecteur>.<champ>}}

Namespace product

Lit un produit dans la table llx_product.

<h2>{{product:ref=supplyflow-pro.label}}</h2>
<p>{{product:ref=supplyflow-pro.description}}</p>
<span class="price">{{product:ref=supplyflow-pro.price}} €</span>
<span>{{product:ref=supplyflow-pro.ef_tagline}}</span>
<img src="{{product:ref=supplyflow-pro.ef_hero_image}}" alt="...">
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_<slug>

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-<ref>.php), utilisez ref=$current :

<h1>{{product:ref=$current.label}}</h1>
<p>{{product:ref=$current.ef_tagline}}</p>

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.

<h3>{{category:id=5.label}}</h3>
<p>{{category:id=5.description}}</p>

Namespace dict

Lit une entrée d'un dictionnaire Dolibarr (c_country, c_currencies, etc.).

<span>{{dict:c_country.code=FR.label}}</span>
<span>{{dict:c_currencies.code_iso=EUR.label}}</span>

Namespace mysoc

Lit les informations de la société courante ($mysoc).

<footer>
    © {{mysoc.name}} — {{mysoc.address}}, {{mysoc.zip}} {{mysoc.town}}
    Tél : {{mysoc.phone}} — Courriel : {{mysoc.email}}
    SIRET {{mysoc.idprof2}} — TVA {{mysoc.tva_intra}}
</footer>
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).

<img src="{{media:ref=hero-1.url}}" alt="{{media:ref=hero-1.alt}}">
<img src="{{media:ref=hero-1.thumb}}">
<img src="{{media:ref=hero-1.card}}">
<img src="{{media:ref=hero-1.wide}}">
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 :

<!-- Shortcode dans le default d'un slot -->
<p>{{slot:greeting|type=text|default=Bienvenue chez {{mysoc.name}}}}</p>

<!-- Shortcode dans un slot richtext (l'éditeur peut le saisir librement) -->
<div>{{slot:long_intro|type=richtext|default=Notre équipe à {{mysoc.town}} vous accompagne.}}</div>

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 :

<h2>{{myorg:id=12.name}}</h2>
<p>Secteur : {{myorg:id=12.sector}}</p>

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 : <img src="{{media:ref=X.url}}">, <a href="{{slot:cta_url|...}}">, etc.

Récapitulatif

Vous savez désormais :

PARTIE IV — Pour le développeur intégrateur

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:<name>|type=<type>|default=<value>|label=<text>|group=<section>|help=<text>|maxlength=<int>|options=<csv>}}

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.

<h1>{{slot:hero_title|type=text|default=Bienvenue|label=Titre principal|maxlength=80}}</h1>
Type textarea — Texte long brut

Multi-lignes, sans mise en forme HTML.

<p class="lead">{{slot:hero_lead|type=textarea|default=Une accroche.|label=Accroche|maxlength=300}}</p>
Type richtext — Texte riche WYSIWYG

Mise en forme complète via CKEditor.

<div class="post-body">
    {{slot:post_body|type=richtext|default=<p>Contenu de l'article.</p>|label=Corps de l'article}}
</div>
Type image — Média image
<img src="{{slot:hero_image|type=image|default=/medias/hero.jpg|label=Image hero}}" alt="...">
Type url — Lien
<a href="{{slot:hero_cta_url|type=url|default=/contact|label=URL du bouton}}">...</a>
Type icon — Icône FontAwesome
{{slot:feature_1_icon|type=icon|default=fa-solid fa-rocket|label=Icône feature 1}}
Type color — Couleur
<section style="background-color:{{slot:section_bg|type=color|default=#19052d|label=Couleur de fond}}">
Type number — Nombre
<span class="stat">{{slot:stats_clients|type=number|default=42|label=Nombre de clients}}</span>
Type bool — Booléen
<?php if ('{{slot:hero_show_badge|type=bool|default=1|label=Afficher le badge}}'): ?>
    <span class="badge">Nouveau</span>
<?php endif; ?>
Type select — Liste déroulante
<section class="hero hero-{{slot:hero_layout|type=select|options=light,dark,gradient|default=light|label=Style du hero}}">

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 :

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

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/<entity>/website/<ref>/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 :

Le chapitre suivant aborde les shortcodes, qui injectent des données Dolibarr dans le HTML.

PARTIE IV — Pour le développeur intégrateur

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

  1. Vous écrivez votre HTML normalement, comme vous le feriez sans le module.
  2. 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
<section class="hero">
    <h1>Bienvenue chez Keatic</h1>
    <p>Votre partenaire numérique de confiance depuis 2010.</p>
    <a href="/contact" class="btn">Nous contacter</a>
</section>
Après — page éditable via le Studio
<section class="hero">
    <h1>{{slot:hero_title|type=text|default=Bienvenue chez Keatic|label=Titre du hero|group=hero}}</h1>
    <p>{{slot:hero_lead|type=textarea|default=Votre partenaire numérique de confiance depuis 2010.|label=Accroche|group=hero}}</p>
    <a href="{{slot:hero_cta_url|type=url|default=/contact|label=URL du bouton|group=hero}}" class="btn">
        {{slot:hero_cta_label|type=text|default=Nous contacter|label=Libellé du bouton|group=hero}}
    </a>
</section>

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:<identifiant>|type=<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)
<h1>{{slot:title|type=text|default=Bienvenue}}</h1>
Dans un attribut HTML
<img src="{{slot:hero_image|type=image|default=/medias/hero.jpg}}" alt="...">
<a href="{{slot:cta_url|type=url|default=/contact}}">...</a>
<section style="background-color:{{slot:bg_color|type=color|default=#19052d}}">
Dans une chaîne de classes CSS
<i class="fa-solid {{slot:hero_icon|type=text|default=fa-rocket}}"></i>

À ne pas faire — Ne placez pas un slot dans un commentaire HTML, dans un bloc <script>, ou dans du JSON intégré. Le scanner détecte tous les tokens et peut générer des slots fantômes.

Convention de nommage des identifiants

L'identifiant est libre, mais une convention claire facilite la maintenance.

Schéma recommandé

<section>_<champ> ou <page>_<section>_<champ>

Bon

À éviter

hero_title

title

(trop générique, risque de collision)

features_grid_card_3_label

truc3

(incompréhensible)

footer_copyright

FooterCopyright

(les majuscules sont rejetées par le scanner)

Recommandé — Si votre site comporte cinq sections (hero, features, stats, testimonials, footer), préfixez tous vos slots par leur section. Le client retrouvera ainsi plus rapidement ce qu'il cherche dans le Studio.

Utiliser le groupe pour structurer l'interface

L'attribut group détermine sous quelle section le slot apparaît dans le panneau « Contenu de la page » du Studio.

{{slot:hero_title|type=text|group=hero|...}}
{{slot:hero_lead|type=textarea|group=hero|...}}
{{slot:hero_image|type=image|group=hero|...}}

{{slot:features_card_1_title|type=text|group=features|...}}
{{slot:features_card_2_title|type=text|group=features|...}}
{{slot:features_card_3_title|type=text|group=features|...}}

{{slot:footer_copyright|type=text|group=footer|...}}

Dans le Studio, ces slots seront regroupés visuellement sous trois sections : Hero, Features et Footer.

Le rescan après ajout

Ajouter un slot dans un fichier tpl.php ne suffit pas : le module doit le détecter et l'enregistrer en base. Pour cela, lancez un rescan.

Méthode A — Via l'interface Studio
  1. Outils → InfraSStudio → Contenu des pages.
  2. Sélectionnez votre site.
  3. Cliquez sur Rescanner en haut.
  4. Le module parcourt tous les fichiers tpl.php et synchronise les slots.
Méthode B — En ligne de commande
php htdocs/custom/infrasstudio/scripts/rescan_slots.php <ref-du-site> --entity=<N>

Sortie typique :

Rescanning website #1 — monsite (entity 2)
Pages scanned   : 22
Slots added     : 3
Slots updated   : 40
Slots orphaned  : 0

Mode de validation — Ajoutez l'option --lint pour détecter les erreurs de syntaxe avant de les valider :
php rescan_slots.php <ref> --lint
Le code de sortie est 0 en l'absence d'erreur, 1 en présence d'avertissements, 2 en cas d'erreurs. Cette commande peut être intégrée dans un crochet de pré-commit.

Slots orphelins

Lorsque vous supprimez un slot d'un fichier tpl.php, son enregistrement en base passe au statut « orphelin ». Le module le conserve pendant 30 jours avant de le supprimer automatiquement (via une tâche planifiée).

Cette politique présente un avantage : si vous restaurez le slot dans le HTML pendant cette période, sa valeur précédente est récupérée.

Note — Pour forcer la purge immédiate des slots orphelins :
php rescan_slots.php <ref> --purge-orphans

Liste de contrôle d'annotation

Avant de livrer une page annotée :

Le chapitre suivant détaille la grammaire complète des slots, avec tous les types et leurs comportements.

PARTIE IV — Pour le développeur intégrateur

CHAPITRE 17 — Préparer un site Dolibarr Website

Avant de pouvoir éditer un site via le module, ce site doit exister côté Dolibarr Website. Ce chapitre s'adresse au développeur qui démarre un nouveau projet : créer le site, le câbler proprement, et préparer le terrain pour le Studio.

Étape 1 — Créer le site dans Dolibarr Website

  1. Connectez-vous à Dolibarr en tant qu'administrateur.
  2. Rendez-vous dans Accueil → Sites web.
  3. Cliquez sur Nouveau site.
  4. Renseignez les informations suivantes :
    • Référence : identifiant court sans espace, par exemple monsite ou keaticweb. C'est l'identifiant interne, utilisé partout (URLs des wrappers, dossiers de données, constantes de configuration).
    • Description : libellé facultatif.
    • Virtualhost principal : URL publique, par exemple https://monsite.com.
    • Langue principale : code de la locale, par exemple fr_FR.
    • Autres langues : valeurs séparées par des virgules, par exemple en_US,de_DE,es_ES.
  5. Enregistrez.

Convention de référence — Privilégiez un identifiant court et stable. Cette référence apparaîtra dans les chemins de fichiers, les URLs internes et les constantes de configuration. La modifier ultérieurement nécessite plusieurs ajustements.

Étape 2 — Configurer le virtualhost Apache

Le module Website ne configure pas Apache pour vous. Vous devez créer un VirtualHost qui pointe sur le docroot du site.

Arborescence type
/var/www/monsite/                           # docroot Apache du site
├── index.php                                # wrapper page d'accueil
├── <alias>.php                              # autres wrappers générés
├── master.inc.php                           # bootstrap (inclut DOL_DOCUMENT_ROOT)
├── medias  -> lien symbolique vers DOL_DATA_ROOT/<entity>/medias/
└── ...

DOL_DATA_ROOT/<entity>/website/monsite/      # dossier de données du site
├── page1.tpl.php                            # gabarits des pages
├── page2.tpl.php
├── ...
└── htmlheader.html                          # en-tête commun éventuel
Exemple de VirtualHost minimal
<VirtualHost *:443>
    ServerName monsite.com
    DocumentRoot /var/www/monsite

    SSLEngine on
    SSLCertificateFile      /etc/letsencrypt/live/monsite.com/fullchain.pem
    SSLCertificateKeyFile   /etc/letsencrypt/live/monsite.com/privkey.pem

    <Directory /var/www/monsite>
        Options FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    # PHP-FPM dédié recommandé
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.2-fpm.monsite.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Note — Un pool PHP-FPM dédié est recommandé pour isoler les performances et les variables d'environnement par site. Le pool peut tourner sous un utilisateur spécifique pour faciliter la gestion des permissions.

Étape 3 — Le lien symbolique medias

Pour que les images téléversées soient servies directement par Apache (mode média « native »), il faut un lien symbolique :

cd /var/www/monsite
ln -sfn /mnt/data/dolibarr/<entity>/medias medias
ls -la medias  # doit pointer sur le dossier de données Dolibarr

Conseil — Si vous ne pouvez pas créer ce lien symbolique, basculez le site en mode média module dans la configuration du module. Les images seront servies via document.php, avec un coût de performance modéré.

Étape 4 — Le master.inc.php multicompany

Si votre installation Dolibarr fonctionne en multicompany, le fichier master.inc.php du site doit définir DOLENTITY avant le chargement :

<?php
// /var/www/monsite/master.inc.php
define('DOLENTITY', 2);   // l'entity correspondant au client
require_once '/var/www/dolibarr/htdocs/master.inc.php';

Avertissement — Sur une instance multicompany sans DOLENTITY, le site renverra une erreur 503 ou affichera les données de la mauvaise entity. C'est l'erreur la plus fréquemment rencontrée lors de la mise en service.

Étape 5 — Créer la page d'accueil

Toujours dans le module Website Dolibarr :

  1. Sélectionnez votre site.
  2. Cliquez sur Nouvelle page.
  3. Renseignez :
    • Page URL : home, index ou autre.
    • Title : Accueil.
    • Type container : page.
    • Lang : fr_FR.
    • Status : Brouillon (le passage à Publié interviendra plus tard).
  4. Enregistrez.
  5. Dolibarr crée automatiquement les fichiers /var/www/monsite/home.php et page<N>.tpl.php.

Étape 6 — Activer le site dans le module

La procédure complète est détaillée au Chapitre 7. En résumé :

  1. Outils → InfraSStudio → Configuration.
  2. Cochez votre site dans la liste.
  3. Choisissez le mode média (native recommandé).
  4. Enregistrez.

Étape 7 — Annoter les premières pages avec des slots

Cette étape fait l'objet du Chapitre 18. En quelques mots : modifiez le fichier page<N>.tpl.php pour ajouter des tokens {{slot:nom|type=...}} aux endroits que vous souhaitez rendre éditables.

Étape 8 — Vérifier avec la page Diagnostic

Avant de livrer le site au client, lancez le diagnostic (Outils → InfraSStudio → Diagnostic) :

Récapitulatif

Votre site est prêt si :

Le chapitre suivant aborde l'annotation des templates avec des slots.

Partie III — Pour l'utilisateur final

Partie III — Pour l'utilisateur final

CHAPITRE 16 — Référencement, sitemap et partage social

Avoir un beau contenu est nécessaire ; obtenir une visibilité de Google et des réseaux sociaux est tout aussi important. Le module intègre l'ensemble des outils de référencement de base directement dans l'éditeur, sans extension tierce.

Le panneau SEO d'une page

Pour chaque page, vous pouvez personnaliser ses métadonnées de référencement via un panneau dédié dans la barre d'outils.

Accéder au panneau
  1. Ouvrez la page dans l'éditeur.
  2. Dans la barre d'outils centrale, cliquez sur SEO.
  3. Une fenêtre de 720 pixels de largeur s'ouvre.
Les champs disponibles

Champ

Description

Cible

Titre SEO

Le titre affiché dans l'onglet du navigateur et dans les résultats Google.

50 à 60 caractères

Meta description

Le texte de présentation sous le titre dans Google.

140 à 160 caractères

Mots-clés

Mots-clés séparés par des virgules.

Facultatif — peu utilisé par Google moderne

Image Open Graph

Image affichée lorsque la page est partagée sur Facebook, LinkedIn, Twitter, WhatsApp.

1200 × 630 px recommandé

L'aperçu Google en direct

En haut de la fenêtre, un aperçu live reproduit l'affichage d'un résultat Google :

L'aperçu se met à jour à chaque saisie. Vous voyez immédiatement si votre titre est tronqué ou si votre description est trop longue.

Compteurs colorés — À côté de chaque champ, un compteur indique le nombre de caractères :
Vert : dans la plage idéale.
Orange : en dehors de la plage mais acceptable.
Rouge : trop long, sera tronqué par Google.

Choisir l'image Open Graph

  1. Dans la fenêtre SEO, cliquez sur Choisir une image.
  2. La bibliothèque média s'ouvre.
  3. Sélectionnez une image ou téléversez-en une nouvelle.
  4. L'image apparaît à droite de l'aperçu Google.

Format idéal — 1200 × 630 px (ratio 1.91:1) pour Facebook et LinkedIn. Format JPG ou PNG. Affichez votre logo et un texte court qui résume la page. Évitez les images de banque génériques.

Lorsqu'une image Open Graph est renseignée, le module ajoute automatiquement les balises Open Graph et Twitter Cards dans l'en-tête HTML de la page :

<meta property="og:image" content="..." />
<meta property="og:title" content="..." />
<meta property="og:description" content="..." />
<meta name="twitter:card" content="summary_large_image" />

Enregistrer le SEO

  1. Modifiez les champs.
  2. Cliquez sur Enregistrer en bas de la fenêtre.
  3. Le module met à jour la base de données (llx_website_page) et le fichier tpl.php en synchronisant les balises HTML.
  4. L'aperçu se rafraîchit.

Note — Les métadonnées SEO ne suivent pas le cycle de publication des slots. Une fois enregistrées, elles sont visibles publiquement immédiatement.

Sitemap.xml

Le sitemap est le fichier que Google utilise pour découvrir toutes les pages de votre site. Le module le génère automatiquement à partir de votre liste de pages.

Contenu généré
Régénérer le sitemap

Méthode A — Bouton dans l'éditeur

  1. Rendez-vous dans la liste des pages d'un site.
  2. Cliquez sur le bouton Sitemap en haut.
  3. Le module régénère le fichier sitemap.xml à la racine du docroot.
  4. Une notification confirme l'opération.

Méthode B — En ligne de commande (administrateurs)

php htdocs/custom/infrasstudio/scripts/generate_sitemap.php <ref-du-site> <entity>

Cette méthode convient à une planification quotidienne automatisée.

Recommandé — Soumettez votre sitemap à Google Search Console une seule fois. Google reviendra ensuite le consulter automatiquement à intervalles réguliers.

Balises hreflang multilingues

Pour un site multilingue, Google a besoin de savoir quelles pages sont des traductions les unes des autres. C'est le rôle des balises <link rel="alternate" hreflang="...">.

Le module génère ces balises automatiquement, à condition que votre développeur ait inclus le helper dans l'en-tête du gabarit :

Conseil — Si vous ne voyez pas ces balises sur votre site, demandez à votre développeur d'ajouter <?php echo infrasstudio_hreflang_tags($website, $page); ?> dans l'en-tête de vos gabarits.

Liste de contrôle SEO par page

Avant de publier une nouvelle page, vérifiez les points suivants :

Outils de mesure du référencement

Le module génère le SEO mais ne le mesure pas. Pour suivre vos résultats, utilisez les outils standards :

Récapitulatif

Vous savez désormais :

Fin de la Partie III — Vous savez désormais utiliser le module au quotidien : modifier le contenu, gérer les médias, publier, traduire, gérer un blog, exploiter un catalogue produit et soigner le référencement. Vous êtes autonome.

La Partie IV s'adresse aux développeurs intégrateurs. Si ce n'est pas votre rôle, vous pouvez passer directement aux Annexes (glossaire, FAQ, historique des versions).

Partie III — Pour l'utilisateur final

CHAPITRE 15 — Catalogue produit dynamique

Si votre site présente un catalogue de produits Dolibarr (services, logiciels, abonnements), le module peut générer automatiquement une page web dédiée à chaque produit. Vous ajoutez un produit dans Dolibarr, sa page web est créée sans intervention supplémentaire.

Le concept

Vous disposez probablement déjà de produits dans Dolibarr (table llx_product) avec leur fiche commerciale (libellé, description, prix). Sur votre site web, vous souhaitez :

Le module remplit exactement ce besoin. Vous écrivez un seul gabarit de fiche produit (la page solution-detail), et le module génère un wrapper solution-<ref>.php pour chaque produit publié.

Préparer un produit Dolibarr pour le catalogue

Pour qu'un produit apparaisse dans le catalogue web, deux conditions doivent être remplies :

Champ

Valeur requise

Statut commercialisable

(

tosell

)

À vendre (= 1)

Publié sur le site

(champ personnalisé

infrasstudio_published

)

Coché (= 1)

Trois états possibles pour un produit

tosell

published

Visibilité

0

Invisible partout (commercial et web)

1

0

Brouillon — modifiable côté Studio mais invisible publiquement

1

1

Publié — la carte apparaît sur le catalogue et la page de détail est servie

Accéder à la section Produits

  1. Ouvrez l'éditeur Studio.
  2. Dans la colonne de gauche, cliquez sur l'onglet Produits.
  3. La liste de tous vos produits commercialisables s'affiche.

Pour chaque produit, vous voyez :

Modifier un produit

  1. Cliquez sur un produit dans la liste.
  2. L'aperçu central charge la page solution-detail avec ce produit.
  3. L'inspecteur à droite affiche les champs natifs Dolibarr et les champs personnalisés.
Champs modifiables

Catégorie

Champs

Champs natifs Dolibarr (traduisibles)

libellé, description (texte riche)

Champs personnalisés traduisibles

accroche, libellé du bouton, déploiement, compatibilité, support, langues, fonctionnalités, paliers tarifaires

Champs personnalisés non traduisibles

image principale, URL du bouton, étiquette

Modifier un champ
  1. Cliquez sur le champ dans l'inspecteur, ou directement sur l'élément correspondant dans l'aperçu central.
  2. L'inspecteur passe en mode édition avec un bouton ← Retour.
  3. Modifiez la valeur.
  4. Pour les champs traduisibles, dépliez la section Autres langues.
  5. Cliquez sur Enregistrer en bas du panneau. Le compteur indique le nombre de champs modifiés en attente.
  6. L'aperçu se rafraîchit.

Conseil — Pour les produits, l'enregistrement automatique n'est pas activé : vous cliquez sur « Enregistrer » manuellement. Ce choix est délibéré, les champs Dolibarr étant plus sensibles, car directement liés à votre fiche produit commerciale.

Publier ou retirer un produit

  1. Sélectionnez le produit dans la liste.
  2. Dans la barre d'outils centrale, cliquez sur Publier (ou Dépublier si déjà publié).
  3. Le module modifie le champ personnalisé infrasstudio_published à 1 (ou 0).
  4. Il déclenche ensuite la régénération automatique des wrappers solution-<ref>.php.
  5. Une notification verte confirme l'opération.

Effet de la publication — Le wrapper /var/www/<site>/solution-<ref>.php est créé. La carte du produit apparaît sur le catalogue. La page de détail est accessible via /solution-<ref>.php.

Effet de la dépublication — Le wrapper est supprimé. Tout visiteur tentant d'accéder à l'URL reçoit une erreur 404. La carte disparaît du catalogue.

Régénérer les wrappers manuellement

Si une désynchronisation est suspectée — par exemple un produit modifié récemment qui n'affiche pas la bonne version — deux options sont disponibles.

Bouton dans la barre d'outils
  1. Sur la fiche produit, cliquez sur l'icône Régénérer wrapper (icône de synchronisation).
  2. Le module reconstruit le wrapper de ce produit.
Bouton « Reconstruire maintenant » (administrateur)
  1. Rendez-vous dans Outils → InfraSStudio → Configuration.
  2. Repérez la section Wrappers solution.
  3. Cliquez sur Reconstruire maintenant.
  4. L'ensemble des wrappers est régénéré en une seule opération.

Note — Une tâche planifiée toutes les heures régénère les wrappers en arrière-plan. En cas d'oubli ou d'incident temporaire, l'état est rétabli au plus tard une heure après.

La page de catalogue

La page de catalogue (généralement /catalogue.php) liste tous les produits publiés sous forme de cartes. Chaque carte présente :

Les visiteurs peuvent filtrer le catalogue par univers (Supply Chain, Health, Legal, etc.) et par type (SaaS, Extension, Instant). Les filtres sont en JavaScript et instantanés.

Lien direct depuis Dolibarr

Sur la fiche produit du Studio, un bouton Voir public ouvre la page solution publique dans un nouvel onglet. Un autre bouton Voir la fiche Dolibarr ouvre la fiche produit native.

Aller-retour fluide — Vous pouvez naviguer entre la fiche commerciale Dolibarr et l'éditeur web Studio sans interrompre votre flux de travail.

Récapitulatif

Vous savez désormais :

Le dernier chapitre de la Partie III aborde le référencement.

Partie III — Pour l'utilisateur final

CHAPITRE 14 — Gérer les articles de blog

Le blog géré par le module repose sur les pages standard du module Website. Aucune table dédiée, aucun système parallèle : un article correspond à une page web. L'ensemble de ce que vous savez déjà s'applique, avec quelques raccourcis ergonomiques supplémentaires.

Comprendre l'architecture du blog

Élément

Description

Article

Une page Dolibarr Website portant le type

blogpost

.

Page d'index

Une page standard (par exemple « Ressources » ou « Blog ») qui liste les articles publiés.

Multilingue

Un article correspond à une page, qui correspond à un fichier PHP. Les traductions vivent dans les surcharges de slots, comme pour toute page.

Créer un nouvel article

L'assistant de création est contextuel : il s'active automatiquement lorsque vous êtes sur la page d'index du blog désignée par votre administrateur.

Procédure
  1. Ouvrez la page d'index du blog (par exemple /ressources).
  2. Le bouton de la barre latérale devient + Nouvel article (au lieu de « + Nouvelle page »).
  3. Cliquez sur ce bouton.
  4. Une fenêtre s'ouvre avec trois champs :
    • Titre : il deviendra le H1 et le titre SEO. Il pré-remplit le slot post_title.
    • Slug : généré automatiquement à partir du titre, préfixé par blog-. Vous pouvez le modifier.
    • Catégorie : la rubrique de l'article (par exemple transformation digitale, juridique). Elle pré-remplit le slot post_category.
  5. Cliquez sur Créer l'article.
  6. Une nouvelle page blog-mon-titre est créée à partir du gabarit blog du site.
  7. Vous êtes automatiquement redirigé vers l'éditeur de cette nouvelle page.

Effet automatique — Le module crée la page Dolibarr, le fichier tpl.php, le wrapper Apache blog-mon-titre.php et pré-remplit les slots post_title et post_category.

Anatomie d'un article

Un article créé depuis le gabarit standard contient les slots suivants :

Slot

Type

Rôle

post_title

texte court

H1 et titre SEO de l'article

post_meta_description

texte court

Meta description SEO (150-160 caractères)

post_category

texte court

Rubrique affichée en pastille au-dessus du titre

post_lead

texte long

Chapeau ou accroche en italique sous le titre

post_hero_image

image

Image principale en pleine largeur en haut de l'article

post_body

texte riche

Le corps de l'article (éditeur visuel complet)

post_secondary_image

image

Image illustrative facultative dans le corps

post_secondary_alt

texte court

Texte alternatif de l'image secondaire

Note — La date d'un article n'est pas un slot. Elle est lue automatiquement depuis la base Dolibarr (date de modification, sinon date de création). Vous n'avez pas à la saisir.

Date et auteur d'un article

La date affichée publiquement suit cette cascade :

  1. La date de modification de la page (la plus récente).
  2. La date de création si la page n'a jamais été modifiée.

Vous n'avez rien à saisir : à chaque publication d'une modification, la date est mise à jour automatiquement. C'est le comportement standard d'un blog.

Conseil — Pour antidater un article, demandez à votre administrateur Dolibarr de modifier llx_website_page.date_creation en SQL. Aucune interface dédiée n'est prévue, par souci de simplicité.

L'auteur affiché est généralement géré par un slot dans le gabarit du site (par exemple post_author).

La page d'index avec son listing automatique

La page d'index du blog (« Ressources », « Blog », etc.) ne nécessite aucune édition manuelle pour ajouter un nouvel article : la liste se met à jour automatiquement.

Lorsque vous publiez un nouvel article :

  1. Le module détecte la nouvelle page de type blogpost au statut publié.
  2. Au prochain rendu de la page d'index, l'article apparaît dans la grille.
  3. Image principale, titre, catégorie, accroche, date : tout est lu depuis les slots de l'article.

Conséquence — Vous ne touchez jamais à la page d'index. Vous publiez vos articles. Le listing se met à jour de lui-même.

La section « À lire également »

Sous chaque article, une section affiche trois articles aléatoires (autres que celui qui est consulté). Aucune configuration n'est nécessaire : la sélection est effectuée par le module à chaque rendu.

Modifier un article existant

  1. Ouvrez l'éditeur Studio.
  2. Dans la colonne de gauche, dépliez le groupe blogpost.
  3. Cliquez sur l'article à modifier.
  4. L'aperçu se charge. Modifiez les slots normalement (clic dans l'aperçu, inspecteur, etc.).
  5. Publiez lorsque vous êtes prêt.

Dupliquer un article

Cette fonction est utile pour réutiliser une structure existante :

  1. Ouvrez l'article modèle.
  2. Cliquez sur Dupliquer dans la barre d'outils.
  3. Une fenêtre demande le nouveau slug (préfixé blog-) et le nouveau titre.
  4. Confirmez.
  5. Le module crée la copie avec tous les slots clonés (canonique et traductions).
  6. Vous êtes redirigé vers le nouvel article pour le personnaliser.

Supprimer un article

Réservé aux administrateurs — Le bouton « Supprimer » de la barre d'outils n'est visible qu'avec la permission admin. Une confirmation est demandée. La suppression est irréversible : la page Dolibarr, ses slots, son fichier tpl.php et son wrapper Apache disparaissent définitivement.

Alternative — Plutôt que de supprimer, utilisez Retirer du site. L'article sort du listing public mais reste consultable depuis l'éditeur. Vous pouvez le remettre en ligne plus tard.

Récapitulatif

Vous savez désormais :

Le chapitre suivant présente le catalogue produit dynamique.

Partie III — Pour l'utilisateur final

CHAPITRE 13 — Travailler en plusieurs langues

Si votre site existe en plusieurs langues, ce chapitre vous concerne. Le module est multilingue dès la création du premier slot. Aucune duplication de page n'est nécessaire : une seule page, plusieurs traductions.

Le modèle multilingue

Le module repose sur le modèle « une page, plusieurs traductions » :

Concept

Description

Langue canonique

La langue principale du site (généralement le français). C'est la valeur de référence.

Langues secondaires

Les autres langues activées sur le site. Chaque slot peut disposer d'une surcharge spécifique pour chacune d'elles.

Valeur par défaut

Définie par le développeur dans le HTML. Sert de filet de sécurité ultime.

L'ordre de résolution au rendu

Lorsqu'un visiteur consulte votre site en allemand, le module recherche la valeur d'un slot dans cet ordre :

  1. La surcharge dans la langue du visiteur (de_DE).
  2. La valeur canonique (FR par défaut).
  3. La valeur par défaut définie dans le code par le développeur.

Conséquence rassurante — Si vous omettez de traduire un slot en allemand, le visiteur voit la version française. Aucune page cassée, aucun texte vide.

Activer une langue sur votre site

Cette opération s'effectue une fois pour toutes, par le développeur ou l'administrateur, dans le module Website Dolibarr :

  1. Rendez-vous dans Accueil → Sites web.
  2. Sélectionnez votre site.
  3. Cliquez sur l'onglet Configuration.
  4. Dans le champ Autres langues, ajoutez les codes ISO (par exemple en_US,de_DE,es_ES).
  5. Enregistrez.

Les langues disponibles correspondent à votre installation Dolibarr (environ 118 langues nativement). Les plus courantes sont : fr_FR, en_US, de_DE, es_ES, it_IT, pt_PT, nl_NL, pl_PL.

Basculer entre les langues dans l'éditeur

Au-dessus de l'aperçu central, une rangée d'onglets accompagnés de drapeaux représente les langues activées. Le drapeau actif est mis en valeur visuellement.

  1. Cliquez sur le drapeau d'une autre langue (par exemple anglais).
  2. L'aperçu se recharge dans cette langue.
  3. Si vous avez déjà saisi des traductions, elles s'affichent.
  4. Sinon, l'aperçu présente la version canonique (français).

Conseil — Ouvrez deux onglets de votre navigateur côte à côte, l'un en français et l'autre en anglais. Vous visualisez en temps réel l'effet de vos traductions sur les deux versions.

Traduire un slot — méthode rapide

La méthode la plus naturelle consiste à rester focalisé sur la langue affichée :

  1. Cliquez sur l'onglet de la langue cible (par exemple anglais).
  2. Cliquez sur le texte à traduire dans l'aperçu.
  3. L'inspecteur s'ouvre. Le champ principal est prêt à recevoir la traduction.
  4. Saisissez la traduction.
  5. L'enregistrement automatique l'enregistre comme surcharge pour cette langue.

L'aperçu se met à jour. Pour vérifier que vous n'avez pas écrasé la version française, basculez sur l'onglet français : le texte original doit toujours s'y trouver.

Traduire un slot — méthode toutes-langues

Pour saisir d'un coup les traductions dans toutes les langues, sans changer d'onglet :

  1. Sélectionnez un slot.
  2. Dans l'inspecteur, dépliez la section Autres langues.
  3. Vous voyez un champ par langue, avec un drapeau en préfixe.
  4. Saisissez chaque traduction.
  5. L'enregistrement automatique s'effectue à chaque champ.

Conseil — Cette vue est idéale pour un traducteur professionnel à qui vous donnez accès au Studio avec la seule permission editTranslations.

Indicateurs visuels de surcharge

Comment savoir d'un coup d'œil quels slots sont traduits et lesquels ne le sont pas ?

Sur les onglets de langue

L'onglet de la langue actuellement affichée comporte un point coloré si la valeur est une surcharge (différente du canonique). Sur le canonique, aucun point n'est affiché.

Dans la section « Autres langues »

Chaque champ de langue affiche un repère à droite :

Repère

Signification

surcharge

(vert)

Vous avez saisi une traduction spécifique pour cette langue.

hérite FR

(gris)

Aucune traduction. Le visiteur voit la valeur canonique.

Revenir à la valeur canonique

Vous avez traduit un slot mais souhaitez finalement que la langue concernée réutilise la valeur française :

  1. Sélectionnez le slot.
  2. Dans la section « Autres langues », repérez la langue concernée.
  3. Cliquez sur le bouton Retour au FR à droite du champ. Il n'apparaît que si une surcharge existe.
  4. La surcharge est supprimée. Le visiteur de cette langue verra à nouveau la valeur canonique.

Conseil — Si vous saisissez dans un champ surcharge la même valeur que le canonique, le module supprime automatiquement la surcharge. Cela évite un enregistrement redondant.

Traductions des fiches produit

Les fiches produit Dolibarr disposent de leur propre éditeur de traductions, distinct de l'éditeur de slots. Pour y accéder :

  1. Tableau de bord du Studio → carte Traductions produits.
  2. Vous arrivez sur une page à deux colonnes.
  3. À gauche, la liste des produits commercialisables.
  4. À droite, l'éditeur avec onglets de langue.
Champs traduisibles

Catégorie

Champs

Champs natifs Dolibarr

libellé, description

Champs personnalisés traduisibles

accroche, libellé du bouton, déploiement, compatibilité, support, langues, fonctionnalités, paliers tarifaires

Champs non traduisibles

image principale, URL du bouton, étiquette (ces valeurs sont universelles)

Synchronisation native — Les modifications effectuées depuis le Studio sont visibles instantanément dans la fiche produit Dolibarr et dans son onglet Traductions natif. Et inversement.

Récapitulatif

Vous savez désormais :

Le chapitre suivant aborde la gestion du blog.

Partie III — Pour l'utilisateur final

CHAPITRE 12 — Brouillon, publication et versions

Tout ce que vous saisissez n'est pas immédiatement visible publiquement. Le module utilise un système de brouillons qui vous permet de préparer plusieurs modifications, de les relire, puis de les publier en une seule opération. Ce chapitre détaille ce mécanisme.

La distinction essentielle entre brouillon et publication

État

Visibilité

Brouillon

Visible uniquement dans l'éditeur Studio (aperçu central). Les visiteurs du site continuent à voir l'ancienne version.

Publié

Visible publiquement. Les visiteurs voient la nouvelle version dès la publication.

Note — Le module stocke deux valeurs par slot : value (la valeur publique) et value_draft (le brouillon). L'aperçu Studio lit en priorité value_draft. Le rendu public lit uniquement value.

Repérer ses brouillons en attente

Plusieurs indicateurs visuels signalent la présence de brouillons non publiés.

Sur la liste des pages (colonne de gauche)

Une pastille orange à côté du titre de la page indique qu'elle contient au moins un brouillon non publié.

Sur la barre d'outils de l'éditeur

Le bouton Publier les modifications apparaît avec un compteur numérique précisant le nombre de brouillons :

Sur l'inspecteur

Un slot avec un brouillon en cours porte un repère orange « modifié » à côté de son libellé.

Sur l'aperçu central

L'aperçu présente toujours la version brouillon. Pour voir exactement ce que verrait un visiteur, cliquez sur Voir public dans la barre d'outils, ce qui ouvre la page dans un nouvel onglet.

Publier les modifications

Lorsque vous êtes satisfait de votre brouillon :

  1. Cliquez sur Publier les modifications en haut à droite de la barre d'outils.
  2. Une boîte de confirmation s'affiche : « Publier les N modifications de cette page ? »
  3. Cliquez sur Confirmer.
  4. Une notification verte « Modifications publiées » apparaît en bas à droite.
  5. L'aperçu reste identique, puisque la version brouillon est devenue la version publique.
  6. Le compteur numérique disparaît, ainsi que la pastille orange dans la barre latérale.

Effet immédiat — Les visiteurs qui ouvrent la page après votre publication voient la nouvelle version. Aucun délai, aucun cache à vider.

Conseil — Préparez plusieurs modifications avant de publier. Le bouton publie l'ensemble des brouillons en une seule fois, ce qui évite que les visiteurs voient des versions intermédiaires.

Annuler les modifications en attente

Si vous changez d'avis et souhaitez tout abandonner pour revenir à la version actuelle du site :

  1. Cliquez sur Annuler les modifications dans la barre d'outils, à côté de « Publier ».
  2. Une boîte de confirmation s'affiche : « Annuler les N modifications de cette page ? Cette action est irréversible. »
  3. Cliquez sur Confirmer.
  4. L'ensemble des brouillons est supprimé.
  5. L'aperçu se met à jour avec la version publique.

Avertissement — Une fois confirmée, l'annulation efface définitivement vos brouillons. Aucune récupération n'est possible.

Mettre en ligne ou retirer du site (statut de la page)

Cette fonction ne doit pas être confondue avec « Publier les modifications ». Le bouton agit ici sur la visibilité de la page elle-même, non sur ses contenus.

Bouton

Effet

Publier les modifications

Bascule les brouillons des slots vers les valeurs publiques. Concerne le contenu de la page.

Mettre en ligne ou Retirer du site

Bascule la visibilité de la page. Une page « Retirée du site » renvoie une erreur 404 ; le wrapper Apache est supprimé.

Cas d'usage de « Retirer du site »

Effet de « Mettre en ligne » — Le wrapper Apache <alias>.php est régénéré et la page redevient accessible. La page canonique et ses pages sœurs (autres langues) basculent simultanément.

L'historique des modifications

Toutes vos publications sont consignées dans un journal interne (llx_infrasstudio_revision). Pour les consulter :

  1. Sélectionnez un slot dans l'inspecteur.
  2. Dépliez la section Historique en bas du panneau.
  3. Vous y voyez la chronologie des modifications, avec :
    • la date et l'heure,
    • l'auteur (utilisateur Dolibarr),
    • l'action effectuée (création, mise à jour, publication, annulation).

Note — L'historique vous permet de consulter qui a fait quoi. Une fonction de restauration directe d'une version antérieure n'est pas encore disponible : si vous avez besoin de revenir en arrière, contactez votre administrateur Dolibarr, qui peut récupérer la valeur depuis la base de données.

Workflow recommandé pour une équipe

Pour les sites édités par plusieurs personnes :

  1. Le rédacteur ouvre la page et procède aux modifications. Toutes restent à l'état de brouillon.
  2. Le rédacteur partage le lien de l'éditeur avec un relecteur (chef de projet, marketing, juriste, etc.).
  3. Le relecteur ouvre la même page dans le Studio. L'aperçu lui présente la version brouillon.
  4. Le relecteur valide ou demande des ajustements via un canal externe (Slack, courriel, etc.).
  5. Le rédacteur applique les ajustements (toujours en brouillon).
  6. Une fois la version validée, le rédacteur ou un publicateur dédié, selon les permissions configurées, clique sur « Publier les modifications ».

À retenir — Le système de brouillon n'est pas un confort optionnel. Il évite les publications accidentelles en cours de rédaction et permet une véritable validation à plusieurs avant que les visiteurs voient le résultat.

Récapitulatif

Vous savez désormais :

Le chapitre suivant aborde la gestion du multilingue.

Partie III — Pour l'utilisateur final

CHAPITRE 11 — Gérer les images et la bibliothèque média

Toutes les images, vidéos et documents que vous utilisez sur votre site transitent par la bibliothèque média. Il s'agit d'un emplacement central : vous téléversez un fichier une seule fois et le réutilisez partout où vous en avez besoin.

Accéder à la bibliothèque

Trois entrées sont possibles :

  1. Depuis le tableau de bord : cliquez sur la carte « Bibliothèque médias ».
  2. Depuis l'éditeur : sélectionnez l'onglet Médias en haut de la colonne gauche.
  3. Depuis un slot image : cliquez sur le bouton « Choisir une image » qui ouvre la bibliothèque dans une fenêtre.

L'organisation de la bibliothèque

La bibliothèque est gérée par site. Si vous administrez plusieurs sites, chacun dispose de sa propre médiathèque indépendante.

Au sein d'un site, les médias sont classés par type :

Type

Formats acceptés

Image

JPG, PNG, WebP, SVG, GIF

Vidéo

MP4, WebM

Document

PDF, DOC et autres formats bureautiques

Téléverser un nouveau média

Méthode A — Bouton « Envoyer un fichier »
  1. Dans la barre d'outils de la bibliothèque, cliquez sur Envoyer un fichier.
  2. Sélectionnez un ou plusieurs fichiers depuis votre poste.
  3. Le ou les fichiers sont téléversés. Une vignette apparaît dans la grille.
Méthode B — Glisser-déposer
  1. Faites glisser une image depuis votre explorateur de fichiers.
  2. Déposez-la directement sur la grille de la bibliothèque.
  3. Le téléversement démarre automatiquement.
Méthode C — Pendant l'édition d'un slot image
  1. Vous éditez un slot de type image dans l'inspecteur.
  2. Cliquez sur Choisir une image.
  3. La bibliothèque s'ouvre. Un bouton Envoyer est disponible en haut.
  4. Téléversez sans interrompre votre flux d'édition.

Conseil — Pour les photographies, le format WebP est recommandé. Il offre un fichier 30 à 50 % plus léger qu'un JPG à qualité équivalente. Le module accepte ce format nativement.

Retrouver un média existant

Au-dessus de la grille, plusieurs filtres sont disponibles :

La grille se met à jour instantanément. Un défilement infini en bas de page charge les médias suivants par lots de cinquante.

Modifier les métadonnées d'un média

Cliquez sur une vignette. Une fenêtre d'édition s'ouvre, organisée en deux colonnes.

Colonne de gauche — Aperçu et utilisation
Colonne de droite — Champs éditables

Champ

Description

Référence

Identifiant court, réutilisable dans les shortcodes (par exemple

{{media:ref=hero-1.url}}

).

Libellé

Nom affiché dans la bibliothèque.

Texte alternatif (canonique)

L'attribut

alt

par défaut. Important pour le référencement et l'accessibilité.

Tags

Mots-clés facilitant la recherche du média.

Traductions par langue

Section dépliable. Un champ par langue pour traduire le texte alternatif.

Recommandé — Renseignez systématiquement le texte alternatif. C'est ce qui est affiché si l'image ne se charge pas, ce que lit un lecteur d'écran et ce que Google utilise pour comprendre vos images.

Les variantes générées automatiquement

Lors de chaque téléversement d'image, le module crée automatiquement trois tailles supplémentaires en plus de l'original.

Variante

Dimensions

Usage type

thumb

200 × 200 px

Vignettes, galerie

card

640 × 480 px

Cartes d'articles, mosaïques

wide

1600 × 1200 px

Hero pleine largeur

original

Dimensions natives

Téléchargement, impression

Les variantes sont générées à la demande. Lors de la première utilisation d'une variante (par exemple card), elle est créée puis mise en cache.

Supprimer un média

  1. Ouvrez la fenêtre d'édition en cliquant sur la vignette.
  2. En bas à droite, cliquez sur Envoyer à la corbeille.

Note — La suppression est en réalité un marquage : le média n'est pas effacé physiquement du disque. Il est simplement signalé comme inactif et n'apparaît plus dans la grille. Vos pages qui le référencent continuent à l'afficher.

Avertissement — Si le média est encore utilisé, la suppression est par défaut refusée. Le module présente la liste des pages concernées. Soit vous remplacez l'image sur ces pages, soit vous forcez la suppression — auquel cas les pages afficheront une image cassée.

Réimporter le contenu d'un dossier

Si vous avez ajouté des fichiers sans passer par le Studio (FTP, SCP, ou via l'éditeur Dolibarr Website), ils n'apparaissent pas dans la bibliothèque.

Pour les détecter :

  1. Dans la barre d'outils de la bibliothèque, cliquez sur Réimporter.
  2. Le module parcourt le dossier physique du site.
  3. Les fichiers absents de la bibliothèque sont enregistrés.

Conseil — Le module effectue cette réimportation automatiquement toutes les cinq minutes au maximum lors de l'ouverture de la bibliothèque. Le bouton sert uniquement à forcer une réimportation immédiate.

Insérer un média dans un slot de texte riche

  1. Vous éditez un slot de type texte riche.
  2. Au-dessus de la barre d'outils, cliquez sur Insérer un média.
  3. La bibliothèque s'ouvre dans une fenêtre.
  4. Sélectionnez ou téléversez une image.
  5. Le module insère :
    • une balise <img> si vous avez choisi une image,
    • un lien <a> avec le libellé si vous avez choisi un document.

Récapitulatif

Vous savez désormais :

Le chapitre suivant aborde le mécanisme de publication, qui sépare votre travail en cours de la version visible publiquement.

Partie III — Pour l'utilisateur final

CHAPITRE 10 — Modifier les textes

La modification d'un texte est l'opération la plus fréquente dans le Studio. Ce chapitre présente les trois méthodes pour y procéder, ainsi que les différents types de champs que vous rencontrerez.

Méthode 1 — Édition directe depuis l'aperçu

C'est la méthode la plus rapide et la plus naturelle.

  1. Ouvrez la page que vous souhaitez modifier en cliquant sur son nom dans la colonne de gauche.
  2. Dans l'aperçu central, survolez avec la souris : les zones éditables sont entourées d'un cadre orange en pointillés.
  3. Cliquez sur le texte à modifier.
  4. L'inspecteur s'ouvre à droite avec un champ déjà rempli.
  5. Modifiez le texte. L'enregistrement automatique intervient une demi-seconde après votre dernière saisie.
  6. L'aperçu se met à jour en direct.

Recommandé — L'indicateur « Enregistré » à côté du champ confirme la sauvegarde en brouillon. Pour rendre la modification visible publiquement, cliquez sur Publier les modifications en haut à droite.

Méthode 2 — Liste « Contenu de la page »

Cette méthode est utile lorsqu'un slot n'est pas directement cliquable, par exemple une image masquée ou une valeur stockée dans un attribut.

  1. Ouvrez la page sans cliquer sur l'aperçu.
  2. Consultez la colonne de droite.
  3. La liste « Contenu de la page » répertorie tous les emplacements éditables.
  4. Chaque ligne présente un type, un libellé, un aperçu de la valeur et un repère « modifié » en cas de brouillon en cours.
  5. Cliquez sur la ligne souhaitée pour ouvrir son formulaire.

Conseil — Les slots sont regroupés par section (« hero », « pied de page », « appel à l'action », etc.) selon le découpage défini par votre développeur. Cela facilite la navigation sur les pages longues.

Méthode 3 — Navigation par sections

Sur les pages longues, vous pouvez utiliser la barre de défilement de l'aperçu pour atteindre la section recherchée, puis cliquer dessus directement.

Les types de champs disponibles

Le développeur a choisi un type pour chaque slot. Ce type détermine l'apparence du formulaire d'édition. Voici l'ensemble des types existants.

Texte court

Champ d'une seule ligne, sans mise en forme. Convient pour les titres, les libellés et les noms. Une longueur maximale peut être imposée, auquel cas un compteur de caractères est affiché.

Texte long

Champ multi-lignes sans mise en forme. Les sauts de ligne sont autorisés et automatiquement convertis en retours visuels. Idéal pour une accroche ou un paragraphe simple.

Texte riche

Éditeur visuel complet (CKEditor) avec barre d'outils étendue.

Outil

Effet

Format

Paragraphe, Titre 2, Titre 3, Titre 4, Code

Style

Gras, italique, souligné, barré

Couleur

Couleur de texte et couleur de fond, selon la palette de la marque

Alignement

Gauche, centre, droite, justifié

Listes

Listes à puces, listes numérotées, indentation

Liens

Insérer ou supprimer un lien

Insérer un média

Ouvre la bibliothèque pour insérer une image au curseur

Note importante — L'éditeur ne propose pas de bouton « source » pour modifier le HTML brut. Ce choix est délibéré, comme expliqué au Chapitre 3.

Image

Le champ comporte une zone de saisie, un bouton de sélection dans la bibliothèque, un bouton de suppression et une vignette d'aperçu.

  1. Cliquez sur le bouton Choisir une image.
  2. La bibliothèque média s'ouvre dans une fenêtre.
  3. Sélectionnez une image existante ou téléversez-en une nouvelle.
  4. L'image est intégrée et la vignette s'affiche.

Conseil — Vous pouvez également glisser-déposer une image depuis la barre latérale Médias directement sur la zone d'image dans l'aperçu central.

URL

Champ texte adapté aux liens. Les mêmes outils que pour les images sont disponibles, par exemple le sélecteur pour insérer un média comme cible.

Icône

Champ de sélection d'une icône FontAwesome.

  1. Saisissez le nom de la classe (par exemple fa-solid fa-star) ou cliquez sur l'une des vingt icônes proposées (étoile, cœur, fusée, etc.).
  2. Choisissez la couleur dans le sélecteur.
  3. Un aperçu en direct s'affiche.
Couleur

Sélecteur de couleur HTML5 accompagné d'un champ hexadécimal.

Nombre

Champ numérique simple avec validation.

Booléen

Case à cocher pour un choix oui ou non.

Liste déroulante

Menu déroulant avec des options définies par votre développeur.

Le panneau d'édition multilingue

Pour les slots de type texte (texte court, texte long, texte riche), l'inspecteur présente trois zones distinctes.

Zone

Contenu

Champ principal

La langue actuellement affichée dans l'aperçu (drapeau actif). C'est ici que vous saisissez la majorité du temps.

Autres langues

(dépliable)

Un champ par langue prise en charge. Cliquez sur la flèche pour déplier et saisir les traductions.

Options avancées

(dépliable)

La valeur canonique partagée entre toutes les langues. À ne modifier qu'en cas de besoin spécifique.

Note — Au moment du rendu public, le module recherche la valeur dans cet ordre : surcharge dans la langue du visiteur, valeur canonique, valeur par défaut. Le visiteur voit toujours un contenu, même en l'absence de traduction.

Pour les slots non textuels (image, couleur, icône, etc.), une seule zone « Valeur (toutes langues) » est proposée. Une image se traduit rarement.

L'enregistrement automatique en pratique

Aucun bouton « Enregistrer » n'est à cliquer. Le module sauvegarde automatiquement votre travail.

  1. Vous saisissez du texte.
  2. Le module attend une demi-seconde de pause.
  3. L'indicateur passe à Enregistrement....
  4. Le serveur reçoit la valeur et l'enregistre comme brouillon.
  5. L'indicateur passe à Enregistré en vert.

Conseil — Si l'indicateur affiche « Erreur réseau », votre connexion a probablement été interrompue. Utilisez Ctrl+Z pour récupérer votre saisie, attendez le rétablissement de la connexion, puis ressaisissez.

Annuler une modification non publiée

Tant que vous n'avez pas publié, plusieurs options de retour en arrière sont possibles :

  1. Annulation locale : utilisez Ctrl+Z dans le champ pour revenir frappe par frappe.
  2. Annulation globale de la page : cliquez sur Annuler les modifications dans la barre d'outils. Tous les brouillons de la page courante sont alors supprimés.

Avertissement — Le bouton « Annuler les modifications » est définitif. Une confirmation est demandée. Une fois validée, le brouillon est perdu et la page revient à sa version publique.

Récapitulatif

Vous savez désormais :

Le chapitre suivant aborde la bibliothèque média.

Partie III — Pour l'utilisateur final

CHAPITRE 09 — Tour de l'interface Studio

Ce chapitre constitue votre première visite guidée du Studio. Vous allez parcourir l'ensemble des écrans sans encore éditer quoi que ce soit. À la fin, vous saurez où chercher chaque élément et comment vous repérer.

Note — Le module InfraSStudio doit être activé sur votre instance Dolibarr et au moins un site doit être configuré. Si ce n'est pas le cas, consultez d'abord la Partie II.

Étape 1 — Accéder au Studio

  1. Connectez-vous à votre Dolibarr.
  2. Dans le menu supérieur, cliquez sur Outils.
  3. Dans le menu latéral qui apparaît, repérez la section InfraS.
  4. Cliquez sur InfraSStudio.

Vous arrivez sur le tableau de bord du Studio.

Conseil — Vous pouvez ajouter cette page à vos favoris dans votre navigateur. Vous y reviendrez fréquemment.

Étape 2 — Comprendre le tableau de bord

Le tableau de bord constitue votre point d'entrée. Il se divise en plusieurs zones, présentées de haut en bas.

L'en-tête personnalisé

Une salutation contextuelle (« Bonjour », « Bon après-midi », « Bonsoir » selon l'heure) est suivie de la date du jour. Cet élément constitue un simple repère visuel.

Vos sites

Une grille de cartes affiche un site géré par carte. Pour chacun, vous retrouvez :

Recommandé — Cliquez sur Éditer pour entrer dans l'éditeur principal. C'est par cette voie que vous passerez la majorité de votre temps.

Statistiques globales

Quatre indicateurs sont présentés en permanence : nombre de produits publiés, nombre de produits en brouillon, nombre de médias dans la bibliothèque et taille totale en mégaoctets.

Actions rapides

Cinq cartes cliquables conduisent directement aux opérations courantes :

  1. Nouvel article : créer un billet de blog en deux clics.
  2. Éditer une page : ouvrir l'éditeur unifié.
  3. Gérer les produits : accéder à la section produits dans l'éditeur.
  4. Traductions produits : ouvrir l'éditeur multilingue dédié aux fiches produit.
  5. Bibliothèque médias : accéder à la gestion centralisée des fichiers.
Activité récente

Une frise chronologique affiche les huit derniers contenus modifiés (slots et produits), avec un lien Ouvrir qui vous permet de reprendre votre travail là où vous l'aviez laissé.

Aide à la prise en main

Un panneau dépliable « Comment utiliser InfraSStudio ? » présente quatre étapes guidées. Il s'avère particulièrement utile pour vos collègues qui découvrent l'outil.

Étape 3 — Entrer dans l'éditeur

Cliquez sur le bouton Éditer de la carte d'un site. Vous accédez alors à l'écran central du Studio : l'éditeur en trois colonnes.

Colonne

Rôle

Gauche — Arborescence

Liste des pages du site, regroupées par type (pages standards, articles de blog, en-tête, pied de page). Recherche en temps réel. Compteur de slots par page. Indicateurs visuels pour les brouillons en attente.

Centre — Aperçu

Aperçu en direct de la page sélectionnée, présenté dans un cadre qui imite un navigateur. Onglets de langue avec drapeaux. Boutons de basculement entre les vues bureau, tablette et mobile.

Droite — Inspecteur

Lorsqu'aucun slot n'est sélectionné, l'inspecteur présente la liste de tous les emplacements éditables de la page. Lorsqu'un slot est sélectionné, il bascule sur le formulaire d'édition correspondant.

Conseil — Les trois colonnes sont redimensionnables. Faites glisser les séparateurs verticaux pour ajuster la mise en page à la taille de votre écran.

Étape 4 — Le déroulement d'une session d'édition

Voici le déroulement type d'une session d'édition :

  1. Vous cliquez sur une page dans la colonne de gauche.
  2. L'aperçu se charge au centre, avec la page rendue exactement comme la verra un visiteur.
  3. Vous cliquez sur un texte de l'aperçu, par exemple le titre principal.
  4. L'inspecteur s'ouvre à droite avec un champ de saisie pré-rempli avec la valeur actuelle.
  5. Vous modifiez le texte. Le système enregistre automatiquement après une demi-seconde d'inactivité.
  6. L'aperçu se met à jour. À ce stade, votre modification reste à l'état de brouillon, invisible pour les visiteurs du site.
  7. Lorsque vous êtes satisfait, vous cliquez sur le bouton « Publier les modifications » en haut à droite. Votre travail devient alors visible publiquement.

Recommandé — Préparez plusieurs modifications avant de publier. Le bouton « Publier les modifications » applique en une seule fois l'ensemble des modifications en attente sur la page, ce qui évite que les visiteurs voient des versions intermédiaires incohérentes.

Étape 5 — Les boutons de la barre d'outils centrale

Une barre d'actions est présentée au-dessus de l'aperçu. Voici la fonction de chaque bouton, dans l'ordre d'apparition.

Bouton

Effet

SEO

Ouvre une fenêtre avec un aperçu du résultat Google en direct. Voir le Chapitre 16.

Dupliquer

Crée une copie de la page courante. Cette fonction est particulièrement utile pour les articles de blog.

Mettre en ligne / Retirer du site

Modifie la visibilité publique de la page. À distinguer de « Publier les modifications » dont la fonction est différente.

Publier les modifications

Publie l'ensemble des brouillons en attente sur la page. Une pastille indique le nombre de modifications concernées.

Annuler les modifications

Supprime tous les brouillons et restaure la version actuellement publiée.

Voir public

Ouvre la page publique dans un nouvel onglet du navigateur.

Supprimer

Réservé aux administrateurs. Une confirmation est demandée. Voir l'avertissement ci-dessous.

Avertissement — Le bouton Supprimer efface définitivement la page, ses traductions, ses slots, son fichier tpl.php et son wrapper Apache. Aucun retour en arrière n'est possible. Réservez son usage aux cas véritablement nécessaires.

Étape 6 — Naviguer dans la liste des pages

La colonne de gauche est plus puissante qu'il n'y paraît. Voici comment l'exploiter.

Le sélecteur de section

En haut de la colonne, deux onglets : Pages et Médias. Selon la configuration du site, un troisième onglet Produits peut apparaître si le catalogue dynamique est activé.

La recherche en temps réel

Saisissez quelques caractères dans le champ Rechercher : la liste se filtre instantanément. La recherche porte sur le titre, le slug et la catégorie.

Les groupes de pages

Les pages sont regroupées par type :

Les indicateurs visuels
Le bouton Nouveau

Le bouton est situé tout en bas de la liste. Selon le contexte :

Étape 7 — L'inspecteur

L'inspecteur connaît deux états distincts.

État vide : la liste « Contenu de la page »

Lorsqu'aucun slot n'est sélectionné dans l'aperçu, l'inspecteur présente la liste exhaustive des slots de la page, regroupés par section. Pour chacun :

Cliquez sur n'importe quelle ligne pour ouvrir le formulaire d'édition.

État édition : le formulaire

Lorsqu'un slot est sélectionné, l'inspecteur bascule en mode édition. Vous y trouvez :

Conseil — L'enregistrement automatique se déclenche une demi-seconde après votre dernière saisie. Un indicateur affiche successivement « Enregistrement... » puis « Enregistré ». Aucun bouton de sauvegarde n'est nécessaire.

Étape 8 — Changer de langue dans l'aperçu

Au-dessus de l'aperçu, une rangée d'onglets accompagnés de drapeaux représente les langues activées sur votre site (FR, EN, DE, etc.).

  1. Cliquez sur le drapeau d'une autre langue.
  2. L'aperçu se recharge dans cette langue.
  3. Lorsque vous éditez un slot, le champ principal de l'inspecteur correspond à la langue actuellement affichée.

Note — La langue principale du site (généralement le français) constitue la langue canonique. Les autres langues sont des traductions complémentaires. Lorsqu'une traduction manque, le visiteur voit la version canonique. Le Chapitre 13 détaille ce mécanisme.

Récapitulatif

Vous savez désormais :

Le chapitre suivant aborde concrètement la modification d'un texte.

Partie II — Démarrer

Partie II — Démarrer

Chapitre 8 — Vérifier l'installation avec la page Diagnostic

Le module dispose d'une page dédiée qui passe en revue l'ensemble de l'intégration et indique, point par point, si tout est en ordre.

C'est le premier réflexe à adopter après une installation, après une mise à jour ou en cas de comportement inattendu.

Accéder à la page Diagnostic

  1. Rendez-vous dans Outils → InfraS → InfraSStudio.
  2. Cliquez sur l'onglet Diagnostic dans le menu latéral.

La page se charge et exécute en direct une série de vérifications. Chaque ligne s'accompagne d'une pastille de couleur :

Couleur

Signification

Vert

Le point est correctement configuré. Aucune action n'est requise.

Orange

Avertissement non bloquant. Le module fonctionne mais une amélioration est possible.

Rouge

Anomalie bloquante. Une fonctionnalité importante ne fonctionne pas correctement.

Bleu

Information contextuelle, sans contrôle effectué.

Section 1 — Environnement

Cette section vérifie les versions de Dolibarr et de PHP, ainsi que la présence des extensions PHP requises.

Contrôle

Action en cas d'anomalie

Version Dolibarr

Mettez Dolibarr à jour (entre 18.0.0 et 24.x.x).

Version PHP

Demandez à votre hébergeur de basculer sur une version comprise entre 7.4 et 8.4.

Extensions PHP

Installez les extensions manquantes (par exemple

apt install php-mbstring php-gd

).

Module InfraSStudio activé

Activez le module dans Configuration → Modules.

Module Website (dépendance)

Activez le module Website dans Configuration → Modules.

Section 2 — Schéma SQL

Cette section vérifie la présence des cinq tables du module dans la base de données :

Conseil — En cas de table manquante, désactivez puis réactivez le module dans Configuration → Modules. Le module recrée les tables absentes lors de la réactivation.

Section 3 — Stockage

Cette section vérifie que les dossiers d'écriture sont accessibles à PHP :

Avertissement — Si un dossier n'est pas accessible en écriture, corrigez les permissions :
chown -R www-data:www-data /var/www/dolibarr/htdocs/documents/

Section 4 — Intégration Dolibarr

Cette section vérifie les hooks, le trigger et les tâches planifiées.

Contrôle

Description

Hooks

Quatre hooks sont attendus :

main

,

login

,

websitepage

,

websitenav

.

Trigger PRODUCT et CATEGORY

Le fichier

InterfaceInfrasstudiotrigger

doit être présent sur le disque.

Tâches planifiées

Au moins une tâche cron doit être déclarée pour le module.

Section 5 — Sites gérés

Pour chaque site activé, cette section contrôle :

« Aucun docroot résolu » — Définissez la constante INFRASSTUDIO_SITE_<id>_DOCROOT avec le chemin Apache absolu de ce site, ou utilisez le pattern INFRASSTUDIO_DOCROOT_PATTERN (par exemple /var/www/{ref}).

Section 6 — Catalogue produit dynamique (optionnel)

Cette section n'apparaît que si vous avez configuré INFRASSTUDIO_WEBSITE_KEY ou INFRASSTUDIO_PUBLIC_DOCROOT. Elle vérifie que ces deux constantes pointent vers des cibles valides.

Lecture du résultat global

Tous les voyants au vert — Vous pouvez passer à la Partie III (utilisateur final) ou à la Partie IV (développeur), selon votre rôle.

Quelques avertissements oranges — Le module fonctionne. Examinez les avertissements à tête reposée et décidez s'il convient de corriger immédiatement ou plus tard.

Au moins un voyant rouge — Interrompez votre installation et corrigez l'anomalie. Une fonctionnalité importante est inopérante et son symptôme apparaîtra plus tard de manière inattendue.

Quand relancer le diagnostic

Bonne pratique pour les équipes — Demandez à toute personne signalant un dysfonctionnement de joindre d'abord une capture d'écran de la page Diagnostic. La majorité des incidents trouvent leur explication dans une ligne orange ou rouge passée inaperçue.

Partie II — Démarrer

Chapitre 7 — Activer un site managé

Le module est installé mais ne gère encore aucun site. Cette étape consiste à lui indiquer quel site Dolibarr Website il doit prendre en charge. C'est cette opération qui établit la connexion entre le module et un site existant.

Étape 1 — Disposer d'un site Website

Avant de l'activer dans le module, le site doit déjà exister dans le module Website natif. Si ce n'est pas encore le cas :

  1. Rendez-vous dans Accueil → Sites web (menu du module Website).
  2. Cliquez sur « Nouveau site ».
  3. Renseignez les informations suivantes :
    • Référence : un identifiant court sans espace, par exemple monsite.
    • Description : optionnelle.
    • Virtualhost : l'URL publique, par exemple https://monsite.com.
    • Langue principale : par exemple fr_FR.
    • Autres langues : optionnel, séparées par des virgules.
  4. Enregistrez.

Note — Le module détecte automatiquement les sites créés dans Website. Aucune configuration parallèle n'est nécessaire.

Étape 2 — Sélectionner le site dans la configuration

  1. Rendez-vous dans Outils → InfraS → InfraSStudio.
  2. Cliquez sur l'entrée Configuration dans le menu latéral du module.
    • La page Paramètres de configuration s'affiche.
  3. Repérez la section « Sites Website gérés ».
    • Vous y voyez la liste de tous les sites Dolibarr Website disponibles, accompagnés d'une case à cocher.
  4. Cochez le ou les sites que vous souhaitez éditer via InfraSStudio.
  5. Cliquez sur « Enregistrer » en bas de la page.

Effet — Le site apparaît désormais sur le tableau de bord du Studio d'Infrasstudio. Vous pouvez commencer à l'éditer.

Étape 3 — Réglages spécifiques par site

Pour chaque site coché, deux réglages complémentaires apparaissent.

Le mode de stockage des médias

Vous choisissez l'emplacement physique où les images téléversées seront enregistrées :

Mode

Quand l'utiliser

Avec le site (mode native)

— recommandé

Les fichiers sont servis directement par Apache via le lien symbolique

/medias/

standard. Plus rapide, URL plus courte, accessible également depuis l'éditeur Dolibarr Website natif.

Gerer par le module Infrasstudio

Les fichiers sont servis via

document.php?modulepart=infrasstudio

. Utile uniquement lorsque le serveur Apache n'a pas accès au dossier

/medias/

du site.

La page d'index du blog

Si votre site comporte une page « Blog » ou « Ressources » qui liste les articles publiés, vous pouvez la désigner ici.

Conseil — Lorsque vous serez sur cette page dans l'éditeur, le bouton « + Nouveau » deviendra automatiquement « + Nouvel article ». C'est un raccourci ergonomique appréciable.

Laissez ce paramètre sur « Aucune » si votre site ne dispose pas de blog.

Étape 4 — Configuration du catalogue produit (optionnel)

Cette section ne concerne que les sites disposant d'un catalogue produit dynamique, c'est-à-dire d'une page web générée automatiquement par produit Dolibarr publié.

Le cas échéant, configurez :

Constante

Valeur

INFRASSTUDIO_WEBSITE_KEY

La référence du site cible (par exemple

monsite

)

INFRASSTUDIO_PUBLIC_DOCROOT

Le chemin Apache absolu du site (par exemple

/var/www/monsite

)

Le bouton « Reconstruire maintenant » permet de générer immédiatement les wrappers solution-<ref>.php pour chaque produit publié.

Note — Si vous ne savez pas si vous avez besoin de cette fonctionnalité, ignorez cette section. Le Chapitre 23 explique le catalogue dynamique en détail.

Étape 5 — Réglages avancés

En bas de la page Configuration, une section repliable « Réglages avancés » expose des constantes plus pointues. Pour une première installation, conservez les valeurs par défaut. Le Chapitre 25 documente chacun de ces paramètres.

Liste de contrôle après activation

Votre site est correctement activé si :

Au chapitre suivant, le diagnostic complet permet de valider l'intégration de bout en bout.

Partie II — Démarrer

Chapitre 6 — Installation du module

Trois méthodes d'installation sont possibles. Choisissez celle qui correspond à votre environnement de travail. Les trois aboutissent au même résultat.

Méthode 1 — Via l'interface Dolibarr (recommandée)

C'est la méthode la plus simple. Elle ne nécessite pas d'accès SSH et fonctionne dès lors que la constante MAIN_DISALLOW_INSTALL_EXTERNAL_MODULES n'est pas activée sur votre instance.

Procédure
  1. Connectez-vous à Dolibarr en tant qu'administrateur.
  2. Rendez-vous dans Accueil → Configuration → Modules.
  3. Cliquez sur le bouton « Déployer / installer un module externe » en haut de la page.
  4. Cliquez sur « Choisir un fichier » et sélectionnez l'archive module_infrasstudio-X.Y.Z.zip.
  5. Cliquez sur « Envoyer le fichier ».
  6. Patientez quelques secondes pendant la décompression de l'archive.
  7. Un message confirme la réussite de l'installation et vous invite à activer le module.

Conseil — L'archive doit être nommée module_infrasstudio-X.Y.Z.zip, où X.Y.Z correspond au numéro de version. Ce nom est utilisé par Dolibarr pour identifier le module.

Méthode 2 — Manuelle (SSH ou FTP)

Cette méthode est adaptée si vous disposez d'un accès au serveur ou si vous travaillez dans un environnement local.

Procédure
  1. Décompressez l'archive module_infrasstudio-X.Y.Z.zip sur votre poste de travail.
  2. Vous obtenez un dossier nommé infrasstudio/.
  3. Copiez ce dossier dans <votre_dolibarr>/htdocs/custom/ sur votre serveur, par SCP ou FTP.
  4. Vérifiez les permissions : le dossier doit être accessible en lecture par l'utilisateur sous lequel tourne PHP, généralement www-data.
# Exemple complet en SSH
cd /var/www/dolibarr/htdocs/custom/
unzip /tmp/module_infrasstudio-1.9.0.zip
chown -R www-data:www-data infrasstudio/

Méthode 3 — Via Git (pour les développeurs)

Cette méthode est appropriée si vous souhaitez suivre les évolutions du module au fil des versions.

cd /var/www/dolibarr/htdocs/custom/
git clone https://github.com/infras/infrasstudio.git
cd infrasstudio
git checkout v1.9.0   # ou la version souhaitée

Avertissement — En production, ne pointez jamais sur la branche main. Utilisez toujours un tag de version stable.

Activer le module dans Dolibarr

Une fois le dossier en place, l'activation s'effectue depuis l'interface :

  1. Rendez-vous dans Accueil → Configuration → Modules.
  2. Recherchez « InfraSStudio » dans le filtre.
    • La carte du module apparaît : « InfraSStudio — surcouche d'édition Website ».
  3. Cliquez sur l'interrupteur d'activation à droite de la carte.
  4. Patientez. Dolibarr exécute alors plusieurs opérations en tâche de fond :
    • création des cinq tables SQL,
    • enregistrement des sept permissions,
    • installation des hooks (main, login, websitepage, websitenav),
    • déclaration des tâches planifiées,
    • restauration des constantes éventuellement sauvegardées lors d'une désactivation antérieure.
    • L'interrupteur passe au vert : le module est activé.

Vérification rapide — Survolez le menu Outils en haut de Dolibarr. Une nouvelle entrée doit apparaître : InfraS → InfraSStudio.

En cas d'échec de l'activation

Voici les erreurs les plus fréquentes et leurs solutions :

Message d'erreur

Cause et solution

« Module Website non activé »

Activez le module Website dans Configuration → Modules, puis revenez activer InfraSStudio.

« Version Dolibarr incompatible »

Mettez Dolibarr à jour vers une version supportée. En dernier recours, définissez la constante

INFRASSTUDIO_DISABLE_CHECK_VERSION_MIN=1

.

« Erreur SQL CREATE TABLE »

L'utilisateur SQL ne dispose pas du droit

CREATE

. Accordez-le, ou créez les tables manuellement à partir des fichiers

sql/llx_infrasstudio_*.sql

.

« Permission denied » sur le système de fichiers

Exécutez

chown -R www-data:www-data htdocs/custom/infrasstudio/

côté serveur.

Page blanche après activation

Consultez le fichier

htdocs/documents/dolibarr.log

. La cause est presque toujours une extension PHP manquante.

Vérification après installation

Le module est correctement installé si :

Au chapitre suivant, vous configurerez votre premier site géré par le module.

Partie II — Démarrer

Chapitre 5 — Prérequis et compatibilité

Avant l'installation du module, il convient de vérifier que votre environnement répond aux conditions techniques requises. Cette page liste l'ensemble des prérequis. Aucun n'est facultatif.

Côté Dolibarr

Élément

Exigence

Version Dolibarr

18.0.0 minimum, 24.x.x maximum

Module Website

Activé. Cette dépendance est obligatoire ; sans elle, l'installation du module échoue.

Au moins un site Website

Créé avec une référence et un virtualhost

Module Categories

Recommandé. Utile pour la catégorisation des contenus.

Conseil — La version de votre Dolibarr est consultable depuis Accueil → À propos. La liste des modules activés est disponible dans Configuration → Modules.

Côté serveur (PHP et système)

Élément

Exigence

Version PHP

7.4 minimum, 8.4 maximum

Extensions PHP

mbstring

,

json

,

pdo_mysql

,

gd

,

fileinfo

Base de données

MySQL 5.7 ou supérieur, ou MariaDB 10.3 ou supérieur

Serveur web

Apache (recommandé) ; nginx pris en charge avec une configuration dédiée

Espace disque

Environ 50 Mo pour le module, en plus de l'espace nécessaire à vos médias

Permissions du système de fichiers

PHP doit pouvoir écrire dans

DOL_DATA_ROOT

ainsi que dans le docroot des sites

Note — Tous ces prérequis sont contrôlés automatiquement par la page Diagnostic du module après installation. En cas de doute, procédez à l'installation et laissez le diagnostic identifier les manquements éventuels.

Vérification rapide en ligne de commande

Si vous disposez d'un accès SSH au serveur, les commandes suivantes vous permettent de contrôler l'environnement en quelques instants :

# Version PHP
php -v

# Extensions PHP installées
php -m | grep -iE "mbstring|json|pdo_mysql|gd|fileinfo"

# Version de Dolibarr
grep "version =" /var/www/dolibarr/htdocs/filefunc.inc.php

# Espace disque disponible
df -h /var/www/

Liste de contrôle avant installation

Avant de passer au chapitre suivant, assurez-vous des points suivants :

Avertissement — Sur une instance de production, il est impératif d'effectuer une sauvegarde complète (base de données et fichiers) avant l'installation. C'est l'occasion idéale de tester votre procédure de restauration.

Partie I — Comprendre InfraSStudio

Partie I — Comprendre InfraSStudio

CHAPITRE 4 — InfraSStudio dans l'écosystème Dolibarr

Pour utiliser le module efficacement, il est utile de comprendre son positionnement par rapport à Dolibarr et au module Website natif. Ce chapitre présente la répartition des rôles, les dépendances et les limites de la responsabilité du module.

Une analogie pour introduire

L'écosystème Dolibarr et ses extensions peuvent être comparés à un musée et sa galerie d'exposition.

Composant

Rôle

Dolibarr ERP

Le musée. Il abrite les collections (produits, tiers, médias), les notices (libellés multilingues) et les registres (ventes, factures).

Module Website

La galerie d'exposition. Elle définit l'espace et l'éclairage où les œuvres choisies sont présentées au public.

InfraSStudio

Le commissaire d'exposition. Il choisit la mise en valeur des œuvres existantes, sans intervenir sur les œuvres elles-mêmes. Il rédige les notices et organise les parcours.

Lorsqu'une nouvelle œuvre rejoint les collections du musée, elle est automatiquement présentée dans la galerie selon la mise en page prévue. C'est le rôle du catalogue produit dynamique, présenté en détail au Chapitre 15.

Une architecture en trois couches

Le module fonctionne dans un système composé de trois couches superposées, chacune avec un rôle précis.

Couche

Rôle

InfraSStudio

Édition des slots et des médias, gestion des traductions, catalogue produit dynamique, fonctionnalités de blog, outils de référencement.

Module Website (natif Dolibarr)

Stockage des pages, génération des fichiers Apache, gestion des virtualhosts, support multicompany.

Dolibarr ERP

Tiers, produits, factures, utilisateurs, permissions, traductions, base de données, médias.

Chaque couche s'appuie sur celle qui se trouve en dessous, sans la remplacer ni la dupliquer.

Dolibarr ERP, la couche fondamentale

Dolibarr ERP constitue le socle. Il fournit l'ensemble des services dont les couches supérieures ont besoin :

Recommandé — Le module s'appuie systématiquement sur les classes natives de Dolibarr lorsque c'est possible. Cette approche garantit la cohérence avec le reste de l'instance et limite les divergences en cas de mise à jour de Dolibarr.

Le module Website, la couche d'hébergement

Le module Website est livré nativement avec Dolibarr. Pour chaque site qu'il prend en charge, il assure les fonctions suivantes :

Important — Le module Website est l'hôte d'InfraSStudio. Sans lui, le module n'a rien à éditer. La dépendance est inscrite dans le descripteur : InfraSStudio refuse de s'activer si le module Website ne l'est pas.

Le module InfraSStudio, la couche d'édition

InfraSStudio ajoute par-dessus le module Website l'ensemble des fonctionnalités nécessaires à un usage par des utilisateurs non techniques :

Note — Ce qu'InfraSStudio ne fait pas

Le déroulement d'une requête publique

Pour clarifier le rôle de chaque couche, suivons le parcours d'une requête HTTP de bout en bout :

  1. Le visiteur demande une URL, par exemple https://exemple.com/page1.php.
  2. Apache reçoit la requête. Le virtualhost pointe vers le docroot du site.
  3. Le wrapper page1.php, généré par le module Website, inclut le fichier master.inc.php local et amorce Dolibarr.
  4. Le wrapper inclut ensuite le fichier page<N>.tpl.php correspondant.
  5. Le template produit le HTML, contenant encore les tokens {{slot:...}} et {{shortcode:...}}.
  6. InfraSStudio intercepte le HTML via le hook completeHtmlOutput et résout chaque token : valeurs courantes des slots filtrées par la locale du visiteur, données Dolibarr lues en direct.
  7. Apache transmet au navigateur le HTML final, dépourvu de tout token.

Résultat — Du point de vue du navigateur, la page est un document HTML standard. Aucun token n'est visible et aucun traitement JavaScript spécifique n'est nécessaire.

L'emplacement des données

Pour comprendre le module en profondeur, le tableau ci-dessous récapitule où chaque type de donnée est stocké.

Donnée

Emplacement

HTML d'une page (avec tokens)

Disque (

page<N>.tpl.php

) et base (

llx_website_page.content

)

Métadonnées de page (titre SEO, description)

llx_website_page.title

,

description

,

keywords

,

image

Valeurs des slots

llx_infrasstudio_slot

Brouillons en attente de publication

llx_infrasstudio_slot.value_draft

Médias téléversés

DOL_DATA_ROOT/<entity>/medias/<type>/<site>/

Métadonnées des médias

llx_infrasstudio_media

Texte alternatif par locale

llx_infrasstudio_media_alt

Traductions natives produit

llx_product

(FR) et

llx_product_lang

(autres locales)

Traductions des extrafields produit

llx_product_extrafields

et

llx_infrasstudio_product_translation

Historique des modifications

llx_infrasstudio_revision

Configuration du module

llx_const

(constantes préfixées

INFRASSTUDIO_

)

Ce qui reste géré dans Dolibarr lui-même

Le module ne remplace aucun module Dolibarr existant. Les opérations suivantes continuent à se faire dans Dolibarr :

Recommandé — Le module ne crée aucun outil parallèle pour ces fonctions. Il s'appuie sur l'existant, ce qui simplifie la formation et limite la duplication d'information.

Partie I — Comprendre InfraSStudio

CHAPITRE 3 — Le principe de séparation entre contenu et design


Une analogie pour comprendre

Le rapport entre développeur et éditeur peut être comparé à celui qui unit un architecte et l'occupant d'un appartement.

Rôle

Responsabilité

L'architecte

Conçoit les murs, les ouvertures, les volumes, les circulations. Une fois le chantier livré, sa mission est terminée.

L'occupant

Choisit la peinture, le mobilier, l'agencement. Vit dans le logement et l'adapte à ses besoins, dans le respect des volumes existants.

InfraSStudio applique le même découpage à votre site. Le développeur conçoit la structure et la livre. L'éditeur en remplit les contenus, sans toucher aux volumes.

Cette discipline est la condition pour qu'un site reste maintenable et cohérent dans la durée.

L'approche fondamentale du module se résume à un principe simple :

Le design relève de la responsabilité du développeur. Le contenu relève de celle de l'éditeur. Les deux périmètres ne se superposent jamais.

Cette séparation détermine l'architecture du module, le fonctionnement de l'éditeur, le découpage des permissions et même les fonctionnalités qui ne sont volontairement pas implémentées.

Pourquoi cette séparation est essentielle

Dans la majorité des outils de gestion de contenu, les frontières entre contenu et structure finissent par s'estomper. Le rédacteur a accès au HTML, au CSS, à la mise en page. À l'usage, il modifie sans s'en rendre compte des éléments structurels — parce que les outils l'autorisent à toucher à ce qui ne devrait pas l'être.

InfraSStudio adopte la position inverse : la structure est verrouillée et seules les zones explicitement marquées comme éditables par le développeur sont accessibles à l'éditeur.

Bénéfices observés

Il modifie uniquement les zones identifiées comme slots. Les conteneurs, les classes CSS et l'ordre des sections lui sont totalement inaccessibles.

Une refonte ne casse pas les contenus existants. Les valeurs des slots sont conservées et viennent simplement remplir la nouvelle structure.

Plusieurs mois après la livraison, un autre développeur peut reprendre le code et identifier sans ambiguïté ce qui est éditable et ce qui ne l'est pas.

Les mécanismes qui matérialisent cette séparation

La séparation n'est pas une simple convention, elle est inscrite à plusieurs niveaux dans le fonctionnement technique du module.

Le HTML reste sous le contrôle du développeur

Le HTML d'une page Dolibarr Website est stocké dans deux emplacements synchronisés : la base de données et un fichier .tpl.php sur le disque. Le module ne propose à aucun moment d'éditer ce HTML. Il n'existe pas de bouton « voir le code source », pas d'éditeur de texte brut, pas d'option dissimulée. L'éditeur n'a accès qu'aux zones marquées comme slots, le reste lui demeure transparent.

Les slots sont détectés automatiquement

Lorsque le développeur ajoute un slot dans un template, aucune autre opération n'est nécessaire. Le module dispose d'un scanner qui parcourt les fichiers .tpl.php du site, détecte les tokens {{slot:...}}, les enregistre dans la table dédiée et génère l'interface d'édition correspondante.

<h2>{{slot:section_title|type=text|default=Nos services|label=Titre de la section}}</h2>

Au prochain rescan, manuel ou automatique, le slot apparaît dans le panneau d'édition. Aucune configuration intermédiaire n'est requise.

Le rendu public est transparent

Lorsqu'un visiteur consulte une page publique, le navigateur ne voit jamais de slot. Le module intercepte le HTML avant son envoi, remplace chaque token {{slot:...}} par sa valeur courante et transmet au visiteur un document HTML standard.

Cette substitution intervient au moment du rendu, jamais au moment de l'édition. Le fichier .tpl.php conserve toujours les tokens originaux, ce qui présente plusieurs avantages :

Les permissions traduisent la séparation

Le module définit sept permissions Dolibarr distinctes, qui permettent d'adapter précisément l'accès aux différents rôles :

Permission

Destinataire type

paramMenu

Tout utilisateur autorisé à voir le menu du module

readContent

Lecteur seul, par exemple un commercial qui consulte le site avant un rendez-vous

editContent

Rédacteur autorisé à modifier les slots de texte

editTranslations

Traducteur intervenant sur les versions linguistiques

editMedias

Gestionnaire des médias, autorisé à téléverser et remplacer des images

publish

Responsable de la publication finale des contenus

admin

Administrateur du module : configuration, sites gérés, gabarits

En pratique, un rédacteur reçoit en général readContent et editContent. Un traducteur reçoit editTranslations. L'intégrateur conserve admin. Aucune permission n'est attribuée au-delà du strict nécessaire.

Ce qui n'est volontairement pas proposé

Pour rester fidèle à ce principe, certaines fonctionnalités ne sont pas implémentées. Ce choix est délibéré.

Pas d'éditeur visuel par blocs

Il n'est pas possible de déposer des blocs à la souris pour composer une page. La structure reste codée par le développeur. Si une nouvelle section est nécessaire, deux options se présentent : utiliser un slot de type richtext, qui autorise une mise en forme limitée à l'intérieur d'une zone existante, ou demander au développeur d'ajouter un nouvel emplacement dans le template.

Pourquoi — Les éditeurs visuels par blocs produisent fréquemment des pages incohérentes lorsque l'utilisateur n'est pas formé à la mise en page. La structure verrouillée garantit la cohérence visuelle dans la durée.

Pas d'édition HTML brute

Même un éditeur expérimenté ne dispose pas d'un mode permettant de modifier le HTML directement. Les slots de type richtext proposent un éditeur visuel avec mise en forme (gras, italique, listes, liens, sous-titres) mais aucun bouton « source ».

Pourquoi — L'édition de HTML brut est la première source d'erreurs de mise en forme. Si une présentation spécifique est nécessaire, elle relève du CSS, et donc du développeur, non du contenu.

Pas de gestion de menus côté éditeur

Les menus de navigation (en-tête, pied de page) sont des pages Dolibarr Website particulières. Elles peuvent comporter des slots pour les libellés, le logo ou les liens sociaux, mais l'ordre des éléments et la structure restent codés dans le HTML.

Pourquoi — La navigation est un élément structurel du site, non un contenu éditorial. Sa modification doit être un acte délibéré du développeur, non un effet de bord d'une manipulation par l'éditeur.

Pas de logique conditionnelle dans les slots

Les slots ne portent aucune logique métier. Il n'est pas possible de définir une règle du type « afficher ce texte uniquement si l'utilisateur est connecté ». Les slots sont strictement des conteneurs de contenu.

Pourquoi — La logique relève du PHP, donc du développeur. Mêler logique et contenu rend les sites difficiles à maintenir au-delà de quelques années.

Partie I — Comprendre InfraSStudio

CHAPITRE 2 — À qui s'adresse le module


InfraSStudio s'adresse à trois publics qui collaborent autour d'un même site web. Identifier votre rôle vous aidera à repérer les sections de cette documentation qui vous concernent en priorité.

Le rédacteur ou utilisateur final

Vous êtes en charge de la rédaction ou de la mise à jour des contenus publiés sur votre site.

Conseil — Votre lecture prioritaire est la Partie III. Commencez par le Chapitre 9 pour le tour de l'interface, puis le Chapitre 10 pour vos premières modifications.

Vos attentes
Ce que le module vous apporte

Fonctionnalité

Avantages

Interface en trois colonnes

Liste des pages, aperçu en direct et formulaires d'édition rassemblés dans un seul écran.

Édition au clic

Cliquer sur un texte de l'aperçu ouvre directement le formulaire correspondant.

Bibliothèque média partagée

Réutilisation des images d'une page à l'autre sans téléchargement répété.

Mécanisme de publication

Les modifications restent privées tant qu'elles ne sont pas explicitement publiées.

Onglets de langue

Bascule rapide entre les versions linguistiques, avec drapeaux comme repères visuels.

Le développeur intégrateur

Vous êtes en charge de la conception ou de l'évolution technique d'un site Dolibarr Website.

Conseil — Votre lecture prioritaire est la Partie IV pour les aspects pratiques, complétée par la Partie VI en référence.

Vos attentes
Ce que le module vous apporte

Outil

Usage

Système de slots

Rendre éditable n'importe quelle balise HTML par l'ajout d'un token

{{slot:nom|type=...}}

.

Shortcodes

Insérer des données Dolibarr en direct :

{{product:ref=xxx.label}}

,

{{mysoc.name}}

, etc.

Catalogue de gabarits

Modèles de page réutilisables (page libre, article, landing produit) que vos clients peuvent instancier.

Génération automatique de pages produit

Un seul template pour N produits Dolibarr ; le module génère automatiquement les pages publiques.

Outils en ligne de commande

Scripts pour le rescan des slots, la génération de sitemap, les migrations, intégrables dans des pipelines.

L'administrateur Dolibarr

Vous êtes en charge de l'instance Dolibarr : installation, mises à jour, permissions, sauvegardes.

Conseil — Votre lecture prioritaire est la Partie II pour la mise en service, puis la Partie V pour la maintenance.

Vos attentes
Ce que le module vous apporte

Outil

Usage

Module Dolibarr standard

Installation par la procédure classique des modules externes Dolibarr.

Page Diagnostic

Vérification automatisée de tous les points d'intégration : versions, extensions PHP, tables, hooks, tâches planifiées, état des sites.

Permissions granulaires

Sept permissions distinctes pour adapter l'accès à chaque rôle.

Mécanismes de portabilité

Constantes de configuration permettant l'adaptation à différents types d'hébergement.

Historique des versions

Changelog au format XML standard Dolibarr, consultable depuis l'administration.

Le cas des équipes réduites

Sur de nombreuses installations, une seule personne porte plusieurs rôles. C'est typiquement le cas du consultant indépendant qui livre un site à un petit commerce, de l'agence où le développeur senior assure aussi l'administration, ou du dirigeant d'une jeune entreprise qui édite lui-même son site avant de pouvoir déléguer.

Recommandé — Si vous combinez plusieurs rôles, lisez la documentation dans l'ordre des parties. Le ton et le niveau technique évoluent progressivement, du général vers le spécifique.

Partie I — Comprendre InfraSStudio

CHAPITRE 1 — Qu'est-ce qu'InfraSStudio ?

Définition

InfraSStudio est un module d'édition de contenu pour Dolibarr. Il s'installe par-dessus le module Website natif de Dolibarr et permet aux utilisateurs non techniques de modifier les textes, les images et les données affichées sur leur site web public, sans manipuler de code HTML ni de base de données.

Le module est conçu pour s'intégrer dans le quotidien d'une équipe : le développeur livre la structure d'un site, l'éditeur en remplit les contenus, et chacun reste dans son rôle.

Le besoin auquel il répond

Dolibarr propose depuis plusieurs versions un module Website complet, capable de gérer des pages, des langues, des images et des virtualhosts. Toutefois, l'édition d'une page passe par la modification directe du HTML stocké en base. Pour un développeur, cette opération est triviale ; pour la personne chargée de rédiger des contenus marketing, d'actualiser des fiches ou d'ajuster une page de contact, elle constitue un obstacle.

Sans outil intermédiaire, le scénario qui se reproduit régulièrement est le suivant :

  1. Le développeur livre un site abouti.
  2. Plusieurs mois plus tard, un changement mineur est demandé par le client.
  3. Le client ouvre l'éditeur de Dolibarr, voit du HTML, hésite à modifier.
  4. Une demande est envoyée par e-mail au développeur.
  5. La modification, qui prend quelques minutes, est appliquée plusieurs jours plus tard, après deux ou trois échanges.

InfraSStudio interrompt ce cycle. Le développeur conserve la responsabilité du HTML, mais y insère des balises invisibles aux endroits qui doivent rester modifiables. Lorsque l'éditeur ouvre l'interface du module, il voit non plus du code, mais des champs de formulaire correspondant exactement aux zones éditables. Il modifie, il enregistre, le site est à jour.

Le principe de fonctionnement

L'unité de base du module est le slot. Un slot est un emplacement nommé dans une page, déclaré par le développeur dans le HTML, qui correspond à une zone éditable. Chaque slot possède un type (texte court, texte riche, image, lien, couleur, etc.) et, si nécessaire, une valeur par défaut.

<!-- Page non éditable -->
<h1>Bienvenue sur notre site</h1>

<!-- Page rendue éditable via InfraSStudio -->
<h1>{{slot:hero_title|type=text|default=Bienvenue sur notre site}}</h1>

Le HTML reste lisible pour le développeur. Lorsqu'un visiteur consulte la page publique, le module substitue le slot par sa valeur courante avant l'envoi au navigateur. Dans l'interface du module, l'éditeur ne voit pas le HTML mais un champ de saisie nommé « Hero Title » avec un bouton de validation.

Ce que le module n'est pas

Pour situer correctement InfraSStudio, il est utile de préciser ce qu'il ne cherche pas à être :

Ce n'est pas

Pourquoi

Un éditeur visuel par blocs (de type Elementor, Divi, WordPress Gutenberg)

La structure des pages reste codée par le développeur. L'éditeur remplit les emplacements prévus, sans réorganiser la mise en page.

Un thème prêt à l'emploi

Le module ne fournit pas de composants visuels, mais une couche d'édition pour le HTML que vous écrivez.

Un système de gestion de contenu autonome

Le module dépend de Dolibarr et du module Website. Il fonctionne comme une surcouche, non comme un remplacement.


Ce que le module apporte

Fonctionnalités

Avantages

Un éditeur de slots

Détecte automatiquement les zones éditables dans le HTML et génère l'interface de saisie correspondante.

Une bibliothèque de médias centralisée

Gère les images, vidéos et documents partagés entre les pages.

Un système de traduction local

Aligné sur les langues prises en charge par Dolibarr.

Un éditeur de fiches produit

Transforme le catalogue Dolibarr en pages web dynamiques.

Une gestion de blog

Repose sur les pages standard du module Website, sans table dédiée.

Un mécanisme de brouillons et de publication

Prépare plusieurs modifications avant de les rendre visibles.

Des outils de référencement intégrés

Offrent un aperçu des résultats Google ainsi que la génération de sitemap et de balises hreflang multilingues.


La promesse du module

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.

Infrasstudio

📚 InfraSStudio — Le wiki

Le manuel complet du module InfraSStudio. Ce wiki est organisé comme un livre : six parties, qui vont de la présentation générale jusqu'aux références techniques détaillées et aux procédures pas à pas.


🎯 Vous éditez le contenu de votre site ?

Lisez la Partie I (pour comprendre l'outil) puis sautez à la Partie III (l'utilisation au quotidien).

🛠️ Vous installez le module sur une instance Dolibarr ?

Lisez la Partie II puis la Partie V.

👨‍💻 Vous intégrez un nouveau site ou personnalisez un template ?

Tout y passe, mais commencez par la Partie IV après les fondamentaux.


📖 Table des matières

Partie I — Comprendre InfraSStudio

  1. Qu'est-ce qu'InfraSStudio ?
  2. À qui s'adresse le module
  3. La philosophie : séparer contenu et design
  4. InfraSStudio dans l'écosystème Dolibarr

Partie II — Démarrer

  1. Prérequis et compatibilité
  2. Installation du module
  3. Activer un site managé
  4. Vérifier l'installation avec la page Diagnostic

Partie III — Pour l'utilisateur final

  1. Tour de l'interface Studio
  2. Éditer les textes (slots)
  3. Gérer les images et la bibliothèque média
  4. Brouillon, publication et versions
  5. Travailler en plusieurs langues
  6. Gérer les articles de blog
  7. Catalogue produit dynamique
  8. SEO, sitemap et partage social

Partie IV — Pour le développeur intégrateur

  1. Préparer un site Dolibarr Website
  2. Annoter un template avec des slots
  3. La grammaire des slots en détail
  4. Insérer des données Dolibarr (shortcodes)
  5. Gérer le multilingue (pages sœurs)
  6. Créer ses propres gabarits de page
  7. Le catalogue produit dynamique en profondeur

Partie V — Administration et maintenance

  1. Permissions et rôles utilisateur
  2. Configuration avancée (constantes)
  3. Diagnostic et dépannage
  4. Mettre à jour le module

Partie VI — Référence

  1. Référence des constantes
  2. Référence des shortcodes
  3. Référence des hooks et triggers
  4. Référence SQL : tables et colonnes
  5. Référence des scripts CLI

Partie VII — Annexes


🧭 Conventions de lecture

ℹ️ Information — Une mise en contexte ou un complément utile à la compréhension.

💡 Astuce — Un raccourci, une bonne pratique optionnelle, un gain de temps.

⚠️ Attention — Une action irréversible ou un piège fréquent.

✅ Bonne pratique — Une recommandation validée par l'expérience.