Skip to main content

CHAPITRE 20 — 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, infosinformations société, médias, …)médias). Ils sont résolus au runtime,moment du rendu, à chaque renduconsultation de page.


Distinction

🎯 Différenceentre slot vset shortcode

Slot

Shortcode

📝 Stocke du

contenu éditable

par le client.

🔍 Affiche des

données Dolibarr

lues en direct.

Persistance dans

llx_infrasstudio_slot

.

Pas deAucune 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 : commentla manière d'identifier l'élément (le plus souvent ref=xxx ou id=N).
  • champ : quellela donnée à extraire de l'élément.

📦 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 localelangue du visiteur via

llx_product_lang

)

price

,

price_ttc

,

cost_price

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

ref

,

tosell

Référence, statut commercialisable

ef_<slug>

N'importeTout quelchamp extrafieldpersonnalisé (ex.

ef_tagline

,

ef_hero_image

, etc.)

Le placeholdermarqueur $current

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

<footer>
    © {{mysoc.name}} — {{mysoc.address}}, {{mysoc.zip}} {{mysoc.town}}
    TelTél : {{mysoc.phone}} — EmailCourriel : {{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 extrafieldchamp 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 quandlorsque le namespace dédié n'existe pas (ex.par exemple pour societe, ou contact).


🖼️ Namespace media

Lit un média de la bibliothèque InfraSStudiodu 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 × 200

card

Variante 640×640 × 480

wide

Variante 1600×1600 × 1200

alt

Texte alternatif (résolu selon la locale)langue)

label

,

width

,

height

Métadonnées


🔄

Combiner shortcodes et slots

Vous pouvez mettreintégrer un shortcode dans la valeur par défaut d'un slot, ou un shortcode dans le contenu d'un slot richtextde 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 typique — Une page de remerciements après commande qui dit « Merci {{customer.name}},Merci, votre commande sera livrée à {{customer.address}}à... ». Tout enLe HTML reste statique côté template,gabarit, mais le rendu est personnalisé pour chaque visiteur.


🛠️

Étendre avec un namespace custom

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

<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 100cent fois le même shortcode dans une page, vous faiteseffectuez 100cent requêtes SQL. CachezMettez vos données en cache dans une variable locale avant la boucleboucle, 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. PasAucune d'erreur visible.n'est affichée. Testez en local avant dela livrer.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 maintenantdésormais :

  • DifférencierDistinguer slots (contenu éditable) et shortcodes (données Dolibarr).
  • Utiliser les 6six namespaces livrés (product, category, dict, mysoc, extrafield, media).
  • Utiliser $current dans les templatesgabarits partagés entre Nplusieurs 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.