Skip to main content

Insérer des données Dolibarr (shortcodes)

🔌 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, infos société, médias, …). Ils sont résolus au runtime, à chaque rendu de page.


🎯 Différence slot vs shortcode

Slot

Shortcode

📝 Stocke du

contenu éditable

par le client.

🔍 Affiche des

données Dolibarr

lues en direct.

Persistance dans

llx_infrasstudio_slot

.

Pas de 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 — la « source » de données : product, category, dict, mysoc, extrafield, media.
  • sélecteur — comment identifier l'élément (souvent ref=xxx ou id=N).
  • champ — quelle donnée extraire de l'élément.

📦 Namespace product

Lit un produit dans 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 locale visiteur via

llx_product_lang

)

price

,

price_ttc

,

cost_price

Prix HT, TTC, coût (formaté selon la locale)

ref

,

tosell

Référence, statut commercialisable

ef_<slug>

N'importe quel extrafield (ex.

ef_tagline

,

ef_hero_image

)

Le placeholder $current

Pour un même tpl utilisé par N produits (ex. 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 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 infos de la société courante ($mysoc).

<footer>
    © {{mysoc.name}} — {{mysoc.address}}, {{mysoc.zip}} {{mysoc.town}}
    Tel : {{mysoc.phone}} — Email : {{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 extrafield 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 quand le namespace dédié n'existe pas (ex. societe, contact).


🖼️ Namespace media

Lit un média de la bibliothèque InfraSStudio (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 locale)

label

,

width

,

height

Métadonnées


🔄 Combiner shortcodes et slots

Vous pouvez mettre un shortcode dans la valeur par défaut d'un slot, ou un shortcode dans un slot richtext :

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

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

✅ Cas d'usage typique — Une page de remerciements après commande qui dit « Merci {{customer.name}}, votre commande sera livrée à {{customer.address}} ». Tout en HTML statique côté template, mais personnalisé pour chaque visiteur.


🛠️ Étendre avec un namespace custom

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

<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 100 fois le même shortcode dans une page, vous faites 100 requêtes SQL. Cachez vos données en 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. Pas d'erreur visible. Testez en local avant de livrer.

💡 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 maintenant :

  • Différencier slots (contenu éditable) et shortcodes (données Dolibarr).
  • Utiliser les 6 namespaces livrés (product, category, dict, mysoc, extrafield, media).
  • Utiliser $current dans les templates partagés entre N produits.
  • Combiner shortcodes et slots.
  • Ajouter votre propre namespace via un fichier dans shortcodes/.
  • Anticiper les pièges (boucles, valeurs absentes).

Au prochain message : multilingue (pages sœurs), templates de page, et catalogue produit dynamique en profondeur — la fin de la Partie IV.