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
. | Aucune persistance — résolu à chaque requête. |
Exemple :
| Exemple :
|
Syntaxe générale
{{<namespace>:<sélecteur>.<champ>}}
- namespace : la source de données (
product,category,dict,mysoc,extrafield,media). - sélecteur : la manière d'identifier l'élément (le plus souvent
ref=xxxouid=N). - champ : la 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 |
|---|---|
,
,
| Champs natifs (traduits selon la langue du visiteur via
) |
,
,
| Prix HT, TTC, coût (formaté selon la langue) |
,
| Référence, statut commercialisable |
| Tout champ personnalisé (
,
, 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 du fichier original |
| Variante 200 × 200 |
| Variante 640 × 480 |
| Variante 1600 × 1200 |
| Texte alternatif (résolu selon la langue) |
,
,
| 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 :
- Distinguer slots (contenu éditable) et shortcodes (données Dolibarr).
- Utiliser les six namespaces livrés (product, category, dict, mysoc, extrafield, media).
- Utiliser
$currentdans les gabarits partagés entre plusieurs produits. - Combiner shortcodes et slots.
- Ajouter votre propre namespace via un fichier dans
shortcodes/. - Anticiper les pièges (boucles, valeurs absentes).