Carnet Wiki

CreerSaBalise

Version 3 — Mars 2007 NicolasR

NouveauCompilo NouvelleBoucle NouveauCritere InterfaceEtUsages

Voir aussi [-> NouvelleBalise]
NouvelleBalise


---------------

Rappel : accès direct aux colonnes de la base de donnée

Chaque colonne d’une table déclarée dans le compilo est par défaut directement accessible dans sa boucle comme balise #NOM_COLONNE. Dans l’exemple présenté dans NouvelleBoucle et AutreTableSpip, on pourra donc afficher directement les nouvelles balises #ID_MACHIN, #LIBELLE et #ID_ARTICLE.

Balises dynamiques

Définition de balises personalisées et redéfinition de balises existantes

Pour (re-)définir une balise calculée par le compilateur, il suffit de déclarer une fonction dans mes_fonctions.php3. Le nom de la fonction pour la balise #X doit être balise_X. Si la balise #X existait, elle sera redéfinie.

<blockquote class="spip">


// Pour chaque balise, il est possible de surcharger, dans mes_fonctions.php3,
// la fonction balise_TOTO_dist par une fonction balise_TOTO() respectant la
// même API :
// elle reçoit en entrée un objet de classe CHAMP, le modifie et le retourne.
// Cette classe est définie dans inc-compilo-index.php3

</blockquote>

Extrait de inc-balises.php3.

[Erreur...8]Attention : contrairement à ce qui est écrit dans ce commentaire, la classe CHAMP est maintenant dans le fichier inc-compilo-api.php3.

Exemples d’utilisation :
-  BalisePagination : définir une nouvelle balise.
-  BaliseNomSite : dans un forum, afficher un nom de site si seule l’url du site est donnée.
-  Balise EXIF : récuperer les informations stoquées dans les images. (sur spip-contrib) : affichage des metadata EXIF pour les images JPG et TIFF (création d’une nouvelle balise avec des paramètres).
-  Une balise pour des raccourcis (lien HS ?). Faire des raccourcis vers des morceau de code SPIP.

[Erreur...10]

Exemple

On voudrait bien pouvoir écrire <link rel="stylesheet" href="#URL_SQUELETTE/Monstyle.css" type="text/css" > pour avoir un squelette un peu plus portable. Mais la balise #URL_SQUELETTE existe pas (jusqu’à la version 1.8b6 de SPIP en tout cas). En attendant que SPIP ajuste automagiquement les URL relatives dans les squelettes, créons cette balise en mettant le code suivant dans mes_options.php3 (contrairement à ce qui est écrit ci dessus j’ai pas réussi avec mes_fonctions.php3, en attendant une réponse officielle méfiez vous donc.) :

[Erreur...12]

function calcul_URL_SQUELETTE() {
    global $dossier_squelettes;
    return lire_meta('adresse_site').'/'.$dossier_squelettes;
}


function balise_URL_SQUELETTE($p) {
    $p->code = "calcul_URL_SQUELETTE()";
    $p->statut = 'html';
    return $p;
}

Remarques : Je ne met pas de ’/’ à la fin parceque dans le squelette on en a besoin pour terminer la balise. J’ai pas trouvé comment faire sans découper en deux fonctions.

[Erreur...14][Erreur...15]Noter que dans la fonction balise_NOM_BALISE, il faut écrire l’appel à la methode PHP entre guillemets, comme ci-dessou :
 $a = "lire_meta('adresse_site')"   <— Comme ça
 $a = lire_meta('adresse_site')     <— Pas comme ça

En fait, la méthode lire_meta(paramètres) sera appelée ultérieurement par le compilo de squelettes SPIP.

Hé oui, quand on veut retourner du code php, on doit retourner une chaîne de caractère contenant le code c’est à dire mettre les «  » autour. Finalement j’ai rien mis dans la fonction balise c’est calcul qui fait tout le boulot.

_ $p->statut peut prendre deux valeurs ’html’ ou ’php’ la signification est la suivante : si le code retourné par la balise est propre, sans risque d’être polué par un script on peut donner la valeur ’php’ par contre si la balise retourne une partie pouvant être manimulé par un tiers on préférera ’html’ qui impose le passage du retour par la fonction interdire_scripts qui supprime les scripts malicieux. Donc par défaut donnez la valeur ’html’ et n’utilisez la valeur ’php’ qu’en cas de certitude.

[Erreur...19]Note à l’attention des autres apprentis sur le tas : le global $dossier_squelettes; est nécessaire parce par défaut en PHP les variables globales ne sont pas visibles de l’intérieur des fonctions.

Note pour les devs : Pourquoi les squelettes ils doivent être en local d’abord ? fopen() accepte bien les URLs, non ? Ce serait bien plus riche de pouvoir se régler sur une URL quelconque et à partir de l’interface privée.

[Erreur...21]

Balise partiellement cachée

Dans certain cas, on peut vouloir ne pas mettre le résultat d’une balise dans le cache.

Par exemple les balises FORMULAIRE de spip on besoin d’information fournie par le visiteur. Elles ne peuvent donc pas être stoquées dans le cache — puisqu’il est partagé entre tous les utilisateurs jusqu’au prochain recalcul.

Il y a une API en développement pour gérer ce genre de cas. Des éléments de documentation provisoire concernant l’API des balises incomplètement calculables à la mise en cache sont disponible dans un message du 9 janvier 2005 sur la liste de développement.

[Erreur...25]l’implementation nécessite alors l’utilisation des fonctions
-  calculer_parametre_dynamique (pour l’analyse syntaxique)
-  calculer_liste (pour la production de code)

Quelques fonctions utiles dans l’implementation de nouvelles balises

- rindex_pile($p, ’champ’, ’critere’)

<blockquote class="spip">

cherche dans la pile une boucle dont un des paramètres correspond au motif donné en argument, et retourne alors le champ de cette boucle dont le nom est donné en argument.

</blockquote>


-  champ_sql(’champ’, $params)

<blockquote class="spip">


cette fonction sert d’API pour demander le champ ’$champ’ dans la pile

</blockquote>


-  param_balise($params)

<blockquote class="spip">

ceci n’est plus valide pour la version 1.8.2. Pour récupérer les paramètres de la balise, avec la version 1.8.2, voir ici :
« nouvelle API pour les paramètres des balises »


qui retourne, si elle existe, la liste de paramètres d’une balise de forme
#BALISE{parametres}|filtre1|... |filtreN
et retire « parametres » du tableau de filtres où il se trouve après le phrasé.

</blockquote>

[Erreur...28]--------

NouveauCompilo NouvelleBoucle NouveauCritere InterfaceEtUsages