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 |
|---|---|
contenu éditable par le client. |
données Dolibarr lues en direct. |
Persistance dans
. |
|
Exemple :
| Exemple :
|
📐 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 souventref=xxxouid=N). - champ
—:quellela donnée à extraire de l'élément.
📦 Namespace product
productLit 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 |
|---|---|
,
,
| Champs natifs (traduits selon la
) |
,
,
| Prix HT, TTC, coût (formaté selon la |
,
| Référence, statut commercialisable |
|
,
, 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
categoryLit une catégorie dans la table llx_categorie.
<h3>{{category:id=5.label}}</h3>
<p>{{category:id=5.description}}</p>
📚 Namespace dict
dictLit 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
mysocLit 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
extrafieldLit 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
mediaLit 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 du fichier original |
| Variante |
| Variante |
| Variante |
| Texte alternatif (résolu selon la |
,
,
| 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
$currentdans lestemplatesgabarits partagés entreNplusieurs 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.