Carnet Wiki

Balises Bonux

Le plugin Bonux intègre de nombreux ajouts à la syntaxe SPIP 2, appelés à devenir les standards de SPIP3, et déjà indispensables à la plupart des plugins développés par la Team (comme CFG [1]), mais beaucoup ne sont pas encore documentés complètement.

Cet article vient en complément de l’article original : SPIP Bonux à lire en référence, et fait partie d’une trilogie avec Autres Goodies dans Bonux et Appels par Balises URL en cours d’etude
rien de mystérieux à ses “révélations”, juste imaginées à la lecture du code .php.. dont on citera souvent les commentaires


Mais l’intéret à l’origine de cet article, portait surtout sur la construction des balises de liens surchargeant celles du Spip d’origine [2] (étendues pour prendre en compte les boucles de Bonux !) : depuis, la plupart des balises de Bonux sont intégrées a SPIP3 et leur fonctionnement décrit dans la documentation officielle

Balises d’accès #INFO_..


-  #INFO__ obtient n’importe quel champ-information pour un objet de manière générique, à partir des deux arguments : type d’objet, et identificateur (sans oublier le nom d’info) : l’intérêt est d’éviter une boucle accessoire (qui serait de plus interdite dans la partie conditionnelle d’une balise).
#INFO_TITRE{article, #ENV{id_article}}
#INFO_TEXTE{mot, id_mot}

Par défaut une info-champ est tout simplement le #CHAMP_SQL de l’objet, le #TITRE étant obtenu par une table interne pour les objets n’ayant pas ce champ nativement, et la génération d’une URL (#INFO_URL{objet, id_objet} mais c’est personnalisable par une fonction generer_<quoi>_entite() grâce à la fonction associée par l’appel de la balise : la fonction associée generer_info_entite($id_objet, $type_objet, $info)
Attention : Les arguments de la fonction associée sont dans l’ordre inverse de ceux de la balise #INFO !

On peut ensuite personnaliser les autres infos en créant une fonction surchargeant
generer_<nom_info>_entite($id_objet, $type_objet, $ligne) ; la dernière variable (fournie par Spip) $ligne correspond à la ligne SQL de tous les champs de l’objet, ce qui évite tout besoin de requete supplémentaire dans ces fonctions ( de génération de champs calculés).

function <generer_info_entite($id_objet, $type_objet, $info, $etoile=''){
De plus, deux possibilités sur $info sont prises en compte en interne par la fonction : ’url’ va rendre le lien d’accès via generer_url_entite(), et le titre (car SPIP permet de déclarer un titre d’après un autre champ que le champ SQL “titre”).

La fonction respecte la magie de SPIP : les traitements par défaut (débrayables par le *) seront appliqués automatiquement, si déclarés pour cette information (cf. la globale $table_des_traitements), en particulier pour gérer directement les textes et autres transformations.

Référence à #INFO_ARTICLE{#ENV{id_article}, titre} : http://zone.spip.org/trac/spip-zone/changeset/31574/_plugins_/spip-bonux-2/public/spip_bonux_balises.php
-  Generer n’importe quel info pour un objet : #INFO_TITRE{article, #ENV{id_article}}
Suite à une discussions sur IRC, il serait même peut-etre possible d’utiliser #INFO_champ sans paramètres, si la fonction associée savait se passer d’arguments explicites dans la structure $p pour récupérer au plus proche niveau de l’environnement, de façon contextuelle objet et identificateur courants au sein du compilateur.

Boutons et URL d’actions (privées)


-  La syntaxe complète d’un #BOUTON_ACTION : #BOUTON_ACTION{libelle[,url[,ajax[,message_confirmation[,title[,callback]]]]]} pour generer un bouton d’action en post, ajaxable
à utiliser a la place des liens action_auteur...
Cette balise est désormais intégrée a SPIP 3, avec une syntaxe à consulter ici : #BOUTON_ACTION{libellé, url, class ,message de confirmation}

Voici le code source avec ses commentaires :

/**
 * Generer un bouton d'action en post, ajaxable
 * a utiliser a la place des liens action_auteur, sous la forme
 * #BOUTON_ACTION{libelle,url}
 * ou
 * #BOUTON_ACTION{libelle,url,ajax} pour que l'action soit ajax comme un lien class='ajax'
 * ou
 * #BOUTON_ACTION{libelle,url,ajax,message_confirmation} pour utiliser un message de confirmation
 * ou
 * #BOUTON_ACTION{libelle,url,ajax,'',info} pour insérer une bulle d'information
 *
 * @param unknown_type $p
 * @return unknown
 */
function balise_BOUTON_ACTION($p){

 [3]

-  #URL_ACTION_AUTEUR{action, id_arg(s), url_retour} affiche l’adresse d’une commande .php stockée dans le sous-dossier ./action avec le nécessaire pour vérifier les autorisations du visiteur connecté. Cette balise accepte deux paramètres supplémentaires et facultatifs : un argument (l’index de l’élément ciblé, qui peut aussi être une liste d’arguments), puis une adresse de redirection éventuelle.
-  #URL_ECRIRE
-  #URL_PAGE{page_squelette, id_arg=valeur} est déjà largement utilisée dans les squelettes publics,car c’est l’instruction universelle pour appeler toute page non typique d’une URL en SPIP. Si vous souhaitez passer plus d’un argument, voyez du coté du filtre |parametre_url

Ainsi que les fonctions support :

  • generer_generer_url_pour($type, $code) {return 'generer_url_public(' . $code .')';}
  • generer_generer_url_condition($type, $code)
  • generer_url_public() [4]

On va tenter d’appréhender la generation de ces liens, en se rappelant comment SPIP, PHP et Javascript sont dans un bateau, d’où l’interrogation pour écrire une #URL_GO{page} exécutable en plein coeur d’un squelette [5] gérant de façon plus “propre” le script calculé <?php  echo "<script>document.location='[(#URL_ARTICLE|texte_script)]';</script>"; ?> : en l’etat actuel de mes découvertes, cela passe en deux etapes du PHP, donc la phase “visible” consiste à générer des chaines de code .php avec l’appel des fonctions

[1L’usage de CFG semble déconseillé désormais : CFG : Comment s’en passer !..

[2Cette surcharge, selon les aléas de l’ordre alphabétiques des noms des plugins, peut vous jouer des tours quant à l’appel des fonction surchargées dans plusieurs plugins... ;-)

[3Avoir la maitrise du compilateur SPIP pour comprendre la suite....

[4Explications complémentaires par plus compétente SVP !)

[5Impossible donc d’utiliser header.location du php !

YannX - Mise à jour :9 February 2019 at 15:21