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 llx_infrasstudio_slot . Aucune persistance — résolu à chaque requête. Exemple : {{slot:hero_title|type=text}} Exemple : {{product:ref=supplyflow.label}} Syntaxe générale {{:.}} 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=xxx ou id=N ). champ : la donnée à extraire de l'élément. Namespace product Lit un produit dans la table llx_product .

{{product:ref=supplyflow-pro.label}}

{{product:ref=supplyflow-pro.description}}

{{product:ref=supplyflow-pro.price}} € {{product:ref=supplyflow-pro.ef_tagline}} ... Champs disponibles Champ Source label , description , note Champs natifs (traduits selon la langue du visiteur via llx_product_lang ) price , price_ttc , cost_price Prix HT, TTC, coût (formaté selon la langue) ref , tosell Référence, statut commercialisable ef_ Tout champ personnalisé ( ef_tagline , ef_hero_image , etc.) Le marqueur $current Pour un même gabarit utilisé par plusieurs produits (par exemple solution-detail servi par les wrappers solution-.php ), utilisez ref=$current :

{{product:ref=$current.label}}

{{product:ref=$current.ef_tagline}}

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 .

{{category:id=5.label}}

{{category:id=5.description}}

Namespace dict Lit une entrée d'un dictionnaire Dolibarr ( c_country , c_currencies , etc.). {{dict:c_country.code=FR.label}} {{dict:c_currencies.code_iso=EUR.label}} Namespace mysoc Lit les informations de la société courante ( $mysoc ).
© {{mysoc.name}} — {{mysoc.address}}, {{mysoc.zip}} {{mysoc.town}} Tél : {{mysoc.phone}} — Courriel : {{mysoc.email}} SIRET {{mysoc.idprof2}} — TVA {{mysoc.tva_intra}}
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 ). {{media:ref=hero-1.alt}} 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 langue) label , width , height 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 :

{{slot:greeting|type=text|default=Bienvenue chez {{mysoc.name}}}}

{{slot:long_intro|type=richtext|default=Notre équipe à {{mysoc.town}} vous accompagne.}}
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 :

{{myorg:id=12.name}}

Secteur : {{myorg:id=12.sector}}

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 : , , 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 $current dans 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).