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

## <span style="color: rgb(35, 111, 161);">Une analogie pour introduire</span>

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

<table id="bkmrk-composantr%C3%B4ledolibar" style="width: 100%; border-collapse: collapse; margin: 0.75rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Composant

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Rôle

</th></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">**Dolibarr ERP**

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Le musée. Il abrite les collections (produits, tiers, médias), les notices (libellés multilingues) et les registres (ventes, factures).

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">**Module Website**

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">La galerie d'exposition. Elle définit l'espace et l'éclairage où les œuvres choisies sont présentées au public.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">**InfraSStudio**

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">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.

</td></tr></tbody></table>

<span style="white-space: pre-wrap;">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 </span>**catalogue produit dynamique**, présenté en détail au Chapitre 15.

### <span style="color: rgb(35, 111, 161);">Une architecture en trois couches</span>

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

<table id="bkmrk-coucher%C3%B4leinfrasstud" style="width: 100%; border-collapse: collapse; margin: 1rem 0px; font-size: 0.95em;"><colgroup><col style="width: 30%;"></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.7rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45); width: 30%;">Couche

</th><th class="align-left" style="padding: 0.7rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Rôle

</th></tr><tr><td style="padding: 0.7rem 1rem; border: 1px solid rgb(229, 231, 235);">**InfraSStudio**

</td><td style="padding: 0.7rem 1rem; border: 1px solid rgb(229, 231, 235);">Édition des slots et des médias, gestion des traductions, catalogue produit dynamique, fonctionnalités de blog, outils de référencement.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.7rem 1rem; border: 1px solid rgb(229, 231, 235);">**Module Website (natif Dolibarr)**

</td><td style="padding: 0.7rem 1rem; border: 1px solid rgb(229, 231, 235);">Stockage des pages, génération des fichiers Apache, gestion des virtualhosts, support multicompany.

</td></tr><tr><td style="padding: 0.7rem 1rem; border: 1px solid rgb(229, 231, 235);">**Dolibarr ERP**

</td><td style="padding: 0.7rem 1rem; border: 1px solid rgb(229, 231, 235);">Tiers, produits, factures, utilisateurs, permissions, traductions, base de données, médias.

</td></tr></tbody></table>

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 :

- <span style="white-space: pre-wrap;">Une base de données structurée (environ 300 tables préfixées </span>`<span class="editor-theme-code">llx_</span>`).
- Un système d'utilisateurs avec gestion fine des permissions.
- Une gestion multicompany permettant à plusieurs entités juridiques de cohabiter sur la même installation.
- Un système de constantes pour le stockage des configurations.
- <span style="white-space: pre-wrap;">Des classes métier réutilisables : </span>`<span class="editor-theme-code">Product</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">Societe</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">Contact</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">User</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">CMailFile</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">Translate</span>`, etc.
- <span style="white-space: pre-wrap;">Un système de traductions par fichiers </span>`<span class="editor-theme-code">.lang</span>`.
- Des mécanismes d'extension par hooks et triggers.

<p class="callout info">**Recommandé —**<span style="white-space: pre-wrap;"> 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.</span></p>

##### **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 :

- <span style="white-space: pre-wrap;">Création d'une entrée dans la table </span>`<span class="editor-theme-code">llx_website</span>`<span style="white-space: pre-wrap;"> contenant la référence, le virtualhost et les langues.</span>
- <span style="white-space: pre-wrap;">Stockage des pages dans la table </span>`<span class="editor-theme-code">llx_website_page</span>`<span style="white-space: pre-wrap;"> avec leur contenu HTML.</span>
- <span style="white-space: pre-wrap;">Génération d'un fichier </span>`<span class="editor-theme-code">page<N>.tpl.php</span>`<span style="white-space: pre-wrap;"> sur le disque.</span>
- <span style="white-space: pre-wrap;">Création des wrappers Apache </span>`<span class="editor-theme-code"><alias>.php</span>`<span style="white-space: pre-wrap;"> qui redirigent vers le bon template.</span>
- Prise en charge du multilingue via le mécanisme de pages sœurs.

<p class="callout warning">**Important —**<span style="white-space: pre-wrap;"> 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.</span></p>

##### **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 :

- Le scanner de slots qui détecte automatiquement les zones éditables.
- L'éditeur en trois colonnes accessible depuis l'interface Dolibarr.
- La bibliothèque de médias mutualisée.
- <span style="white-space: pre-wrap;">Le système de traductions, synchronisé avec les fichiers </span>`<span class="editor-theme-code">.lang</span>`<span style="white-space: pre-wrap;"> de Dolibarr.</span>
- <span style="white-space: pre-wrap;">Le catalogue produit dynamique, qui transforme la table </span>`<span class="editor-theme-code">llx_product</span>`<span style="white-space: pre-wrap;"> en pages publiques.</span>
- Le mécanisme de brouillons et de publication.
- La génération automatique du sitemap et des balises hreflang.
- Le système de gabarits permettant aux éditeurs de créer leurs propres pages.

**Note — Ce qu'InfraSStudio ne fait pas**

- Il ne sert pas les pages publiques. Cette fonction est assurée par Apache et le module Website.
- <span style="white-space: pre-wrap;">Il ne stocke pas les pages elles-mêmes, qui restent dans </span>`<span class="editor-theme-code">llx_website_page</span>`<span style="white-space: pre-wrap;"> et leurs templates correspondants.</span>
- Il ne gère pas les utilisateurs ni les permissions globales : ce sont les utilisateurs Dolibarr qui sont autorisés via les permissions du module.

### <span style="color: rgb(35, 111, 161);">Le déroulement d'une requête publique</span>

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

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

<p class="callout success">**Résultat —**<span style="white-space: pre-wrap;"> 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.</span></p>

##### **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é.

<table id="bkmrk-donn%C3%A9eemplacementhtm" style="width: 100%; border-collapse: collapse; margin: 0.75rem 0px; font-size: 0.92em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Donnée

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Emplacement

</th></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">HTML d'une page (avec tokens)

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Disque (

`<span class="editor-theme-code">page<N>.tpl.php</span>`

) et base (

`<span class="editor-theme-code">llx_website_page.content</span>`

)

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Métadonnées de page (titre SEO, description)

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_website_page.title</span>`

<span style="white-space: pre-wrap;">, </span>

`<span class="editor-theme-code">description</span>`

<span style="white-space: pre-wrap;">, </span>

`<span class="editor-theme-code">keywords</span>`

<span style="white-space: pre-wrap;">, </span>

`<span class="editor-theme-code">image</span>`

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Valeurs des slots

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_infrasstudio_slot</span>`

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Brouillons en attente de publication

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_infrasstudio_slot.value_draft</span>`

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Médias téléversés

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">DOL_DATA_ROOT/<entity>/medias/<type>/<site>/</span>`

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Métadonnées des médias

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_infrasstudio_media</span>`

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Texte alternatif par locale

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_infrasstudio_media_alt</span>`

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Traductions natives produit

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_product</span>`

<span style="white-space: pre-wrap;"> (FR) et </span>

`<span class="editor-theme-code">llx_product_lang</span>`

<span style="white-space: pre-wrap;"> (autres locales)</span>

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Traductions des extrafields produit

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_product_extrafields</span>`

<span style="white-space: pre-wrap;"> et </span>

`<span class="editor-theme-code">llx_infrasstudio_product_translation</span>`

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Historique des modifications

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_infrasstudio_revision</span>`

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Configuration du module

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">llx_const</span>`

<span style="white-space: pre-wrap;"> (constantes préfixées </span>

`<span class="editor-theme-code">INFRASSTUDIO_</span>`

)

</td></tr></tbody></table>

### <span style="color: rgb(35, 111, 161);">Ce qui reste géré dans Dolibarr lui-même</span>

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

- L'édition d'une fiche produit (libellé, prix, catégories, photos rattachées) reste l'usage standard de la fiche produit Dolibarr. Le module InfraSStudio n'édite que les extrafields traduisibles et leurs versions linguistiques, qui se synchronisent automatiquement avec la fiche native.
- La gestion des tiers, des contacts, des devis et des factures s'effectue via les modules natifs Dolibarr.
- L'administration des utilisateurs et des permissions reste dans l'interface d'administration Dolibarr.
- La création d'un nouveau site Website (référence, virtualhost, langues principales) se fait dans l'administration du module Website. InfraSStudio prend ensuite le relais pour l'édition du contenu.
- La sauvegarde de la base et des fichiers suit la procédure standard de Dolibarr.

<p class="callout success">**Recommandé —**<span style="white-space: pre-wrap;"> 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.</span></p>

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

#### <span style="color: rgb(22, 145, 121);">Une analogie pour comprendre</span>

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

<table id="bkmrk-r%C3%B4leresponsabilit%C3%A9l%27" style="width: 100%; border-collapse: collapse; margin: 0.75rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Rôle

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Responsabilité

</th></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">L'architecte

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Conçoit les murs, les ouvertures, les volumes, les circulations. Une fois le chantier livré, sa mission est terminée.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">L'occupant

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Choisit la peinture, le mobilier, l'agencement. Vit dans le logement et l'adapte à ses besoins, dans le respect des volumes existants.

</td></tr></tbody></table>

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.

#### <span style="color: rgb(53, 152, 219);">Pourquoi cette séparation est essentielle</span>

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.

#### <span style="color: rgb(35, 111, 161);">Bénéfices observés</span>

- **L'éditeur ne peut pas altérer la mise en page**

<span style="white-space: pre-wrap;"> Il modifie uniquement les zones identifiées comme slots. Les conteneurs, les classes CSS et l'ordre des sections lui sont totalement inaccessibles.</span>

- **Le design peut évoluer indépendamment du contenu**

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

- **La maintenance reste compréhensible dans la durée**

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.

### <span style="color: rgb(35, 111, 161);">Les mécanismes qui matérialisent cette séparation</span>

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

#### <span style="color: rgb(22, 145, 121);">Le HTML reste sous le contrôle du développeur</span>

<span style="white-space: pre-wrap;">Le HTML d'une page Dolibarr Website est stocké dans deux emplacements synchronisés : la base de données et un fichier </span>`<span class="editor-theme-code">.tpl.php</span>`<span style="white-space: pre-wrap;"> 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.</span>

#### <span style="color: rgb(22, 145, 121);">Les slots sont détectés automatiquement</span>

<span style="white-space: pre-wrap;">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 </span>`<span class="editor-theme-code">.tpl.php</span>`<span style="white-space: pre-wrap;"> du site, détecte les tokens </span>`<span class="editor-theme-code">{{slot:...}}</span>`, 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.

#### <span style="color: rgb(22, 145, 121);">Le rendu public est transparent</span>

<span style="white-space: pre-wrap;">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 </span>`<span class="editor-theme-code">{{slot:...}}</span>`<span style="white-space: pre-wrap;"> par sa valeur courante et transmet au visiteur un document HTML standard.</span>

<span style="white-space: pre-wrap;">Cette substitution intervient au moment du rendu, jamais au moment de l'édition. Le fichier </span>`<span class="editor-theme-code">.tpl.php</span>`<span style="white-space: pre-wrap;"> conserve toujours les tokens originaux, ce qui présente plusieurs avantages :</span>

- Le développeur peut consulter et modifier le template sans craindre une pollution par les modifications de l'éditeur.
- Si vous purgez la table des slots, le site affichera simplement les valeurs par défaut, sans cesser de fonctionner.
- L'export du code d'un site et l'export de son contenu sont deux opérations distinctes, ce qui simplifie les migrations.

#### <span style="color: rgb(22, 145, 121);">Les permissions traduisent la séparation</span>

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

<table id="bkmrk-permissiondestinatai" style="width: 100%; border-collapse: collapse; margin: 0.75rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Permission

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Destinataire type

</th></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">paramMenu</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Tout utilisateur autorisé à voir le menu du module

</td></tr><tr style="height: 10px; background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">readContent</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Lecteur seul, par exemple un commercial qui consulte le site avant un rendez-vous

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">editContent</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Rédacteur autorisé à modifier les slots de texte

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">editTranslations</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Traducteur intervenant sur les versions linguistiques

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">editMedias</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Gestionnaire des médias, autorisé à téléverser et remplacer des images

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">publish</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Responsable de la publication finale des contenus

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">admin</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Administrateur du module : configuration, sites gérés, gabarits

</td></tr></tbody></table>

<span style="white-space: pre-wrap;">En pratique, un rédacteur reçoit en général </span>`<span class="editor-theme-code">readContent</span>`<span style="white-space: pre-wrap;"> et </span>`<span class="editor-theme-code">editContent</span>`<span style="white-space: pre-wrap;">. Un traducteur reçoit </span>`<span class="editor-theme-code">editTranslations</span>`<span style="white-space: pre-wrap;">. L'intégrateur conserve </span>`<span class="editor-theme-code">admin</span>`. Aucune permission n'est attribuée au-delà du strict nécessaire.

### <span style="color: rgb(35, 111, 161);">Ce qui n'est volontairement pas proposé</span>

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

#### <span style="color: rgb(22, 145, 121);">Pas d'éditeur visuel par blocs</span>

<span style="white-space: pre-wrap;">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 </span>`<span class="editor-theme-code">richtext</span>`, 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.

<p class="callout info">**Pourquoi —**<span style="white-space: pre-wrap;"> 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.</span></p>

#### <span style="color: rgb(22, 145, 121);">Pas d'édition HTML brute</span>

<span style="white-space: pre-wrap;">Même un éditeur expérimenté ne dispose pas d'un mode permettant de modifier le HTML directement. Les slots de type </span>`<span class="editor-theme-code">richtext</span>`<span style="white-space: pre-wrap;"> proposent un éditeur visuel avec mise en forme (gras, italique, listes, liens, sous-titres) mais aucun bouton « source ».</span>

<p class="callout info">**Pourquoi —**<span style="white-space: pre-wrap;"> 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.</span></p>

#### <span style="color: rgb(22, 145, 121);">Pas de gestion de menus côté éditeur</span>

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.

<p class="callout info">**Pourquoi —**<span style="white-space: pre-wrap;"> 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.</span></p>

#### <span style="color: rgb(22, 145, 121);">Pas de logique conditionnelle dans les slots</span>

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.

<p class="callout info">**Pourquoi —**<span style="white-space: pre-wrap;"> 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.</span></p>

# CHAPITRE 2 — À qui s'adresse le module

InfraSStudio s'adresse à<span style="color: rgb(22, 145, 121); white-space: pre-wrap;"> </span>**trois publics**<span style="white-space: pre-wrap;"> 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é.</span>

#### **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.**

<p class="callout info">**Conseil —**<span style="white-space: pre-wrap;"> 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.</span></p>

##### <span style="color: rgb(53, 152, 219);">Vos attentes</span>

- Modifier rapidement un texte ou une image, sans craindre d'altérer la mise en page.
- Visualiser immédiatement le résultat de vos modifications.
- Travailler sans dépendance technique : ne pas avoir à solliciter un développeur pour chaque ajustement.
- Gérer les versions linguistiques sans dupliquer les pages.
- Préparer plusieurs modifications avant publication, et tout publier en une fois.

##### <span style="color: rgb(53, 152, 219);">Ce que le module vous apporte</span>

<table id="bkmrk-fonctionnalit%C3%A9avanta" style="width: 100%; border-collapse: collapse; margin: 0.75rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Fonctionnalité

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Avantages

</th></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Interface en trois colonnes

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Liste des pages, aperçu en direct et formulaires d'édition rassemblés dans un seul écran.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Édition au clic

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Cliquer sur un texte de l'aperçu ouvre directement le formulaire correspondant.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Bibliothèque média partagée

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Réutilisation des images d'une page à l'autre sans téléchargement répété.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Mécanisme de publication

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Les modifications restent privées tant qu'elles ne sont pas explicitement publiées.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Onglets de langue

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Bascule rapide entre les versions linguistiques, avec drapeaux comme repères visuels.

</td></tr></tbody></table>

#### **Le développeur intégrateur**

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

<p class="callout info">**Conseil —**<span style="white-space: pre-wrap;"> Votre lecture prioritaire est la Partie IV pour les aspects pratiques, complétée par la Partie VI en référence.</span></p>

##### <span style="color: rgb(53, 152, 219);">Vos attentes</span>

- Conserver la maîtrise complète du HTML, du CSS et de la structure des pages.
- Permettre à votre client d'éditer ses contenus sans solliciter votre intervention.
- Réutiliser une même structure pour des pages similaires.
- Afficher des données Dolibarr (produits, catégories, informations société) sans dupliquer ces informations.
- Livrer un site dont la maintenance courante ne vous incombe pas.

##### <span style="color: rgb(53, 152, 219);">Ce que le module vous apporte</span>

<table id="bkmrk-outilusagesyst%C3%A8me-de" style="width: 100%; border-collapse: collapse; margin: 0.75rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Outil

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Usage

</th></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Système de slots

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);"><span style="white-space: pre-wrap;">Rendre éditable n'importe quelle balise HTML par l'ajout d'un token </span>

`<span class="editor-theme-code">{{slot:nom|type=...}}</span>`

.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Shortcodes

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);"><span style="white-space: pre-wrap;">Insérer des données Dolibarr en direct : </span>

`<span class="editor-theme-code">{{product:ref=xxx.label}}</span>`

<span style="white-space: pre-wrap;">, </span>

`<span class="editor-theme-code">{{mysoc.name}}</span>`

, etc.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Catalogue de gabarits

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Modèles de page réutilisables (page libre, article, landing produit) que vos clients peuvent instancier.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Génération automatique de pages produit

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Un seul template pour N produits Dolibarr ; le module génère automatiquement les pages publiques.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Outils en ligne de commande

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Scripts pour le rescan des slots, la génération de sitemap, les migrations, intégrables dans des pipelines.

</td></tr></tbody></table>

#### **L'administrateur Dolibarr**

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

<p class="callout info">**Conseil —**<span style="white-space: pre-wrap;"> Votre lecture prioritaire est la Partie II pour la mise en service, puis la Partie V pour la maintenance.</span></p>

##### <span style="color: rgb(53, 152, 219);">Vos attentes</span>

- Installer le module sans surprise et de manière reproductible.
- Vérifier que l'intégration est complète : versions compatibles, tables créées, hooks en place, tâches planifiées actives.
- Distribuer les permissions selon les rôles de chacun.
- Disposer de points de vérification clairs en cas de problème.
- Maîtriser les mises à jour sans interruption du site public.

##### <span style="color: rgb(53, 152, 219);">Ce que le module vous apporte</span>

<table id="bkmrk-outilusagemodule-dol" style="width: 100%; border-collapse: collapse; margin: 0.75rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Outil

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(15, 25, 45);">Usage

</th></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Module Dolibarr standard

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Installation par la procédure classique des modules externes Dolibarr.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Page Diagnostic

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Vérification automatisée de tous les points d'intégration : versions, extensions PHP, tables, hooks, tâches planifiées, état des sites.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Permissions granulaires

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Sept permissions distinctes pour adapter l'accès à chaque rôle.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Mécanismes de portabilité

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Constantes de configuration permettant l'adaptation à différents types d'hébergement.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Historique des versions

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Changelog au format XML standard Dolibarr, consultable depuis l'administration.

</td></tr></tbody></table>

##### <span style="color: rgb(53, 152, 219);">Le cas des équipes réduites</span>

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é —**<span style="white-space: pre-wrap;"> 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.</span>

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

#### <span style="color: rgb(53, 152, 219);">Définition</span>

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.

#### <span style="color: rgb(53, 152, 219);">Le besoin auquel il répond</span>

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.

#### <span style="color: rgb(53, 152, 219);">Le principe de fonctionnement</span>

<span style="white-space: pre-wrap;">L'unité de base du module est le </span>**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.

#### <span style="color: rgb(53, 152, 219);">Ce que le module n'est pas</span>

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

<table id="bkmrk-ce-n%27est-paspourquoi" style="width: 100%; border-collapse: collapse; margin: 1rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 2px solid rgb(25, 5, 45);">Ce n'est pas

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 2px solid rgb(25, 5, 45);">Pourquoi

</th></tr><tr><td style="padding: 0.6rem 1rem; border: 2px solid rgb(229, 231, 235);">Un éditeur visuel par blocs (de type Elementor, Divi, WordPress Gutenberg)

</td><td style="padding: 0.6rem 1rem; border: 2px solid rgb(229, 231, 235);">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.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 2px solid rgb(229, 231, 235);">Un thème prêt à l'emploi

</td><td style="padding: 0.6rem 1rem; border: 2px solid rgb(229, 231, 235);">Le module ne fournit pas de composants visuels, mais une couche d'édition pour le HTML que vous écrivez.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 2px solid rgb(229, 231, 235);">Un système de gestion de contenu autonome

</td><td style="padding: 0.6rem 1rem; border: 2px solid rgb(229, 231, 235);">Le module dépend de Dolibarr et du module Website. Il fonctionne comme une surcouche, non comme un remplacement.

</td></tr></tbody></table>

### <span style="color: rgb(25, 5, 45);">Ce que le module apporte</span>

<table id="bkmrk-fonctionnalit%C3%A9savant" style="width: 100%; border-collapse: collapse; margin: 1rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Fonctionnalités

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Avantages

</th></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Un éditeur de slots

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Détecte automatiquement les zones éditables dans le HTML et génère l'interface de saisie correspondante.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Une bibliothèque de médias centralisée

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Gère les images, vidéos et documents partagés entre les pages.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Un système de traduction local

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Aligné sur les langues prises en charge par Dolibarr.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Un éditeur de fiches produit

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Transforme le catalogue Dolibarr en pages web dynamiques.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Une gestion de blog

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Repose sur les pages standard du module Website, sans table dédiée.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Un mécanisme de brouillons et de publication

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Prépare plusieurs modifications avant de les rendre visibles.

</td></tr><tr><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Des outils de référencement intégrés

</td><td style="padding: 0.6rem 1rem; border: 1px solid rgb(229, 231, 235);">Offrent un aperçu des résultats Google ainsi que la génération de sitemap et de balises hreflang multilingues.

</td></tr></tbody></table>

#### <span style="color: rgb(53, 152, 219);">La promesse du module</span>

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.