-----Message d'origine-----
De : spip-bounces@rezo.net [mailto:spip-bounces@rezo.net] De
la part de SDC
Envoyé : jeudi 8 septembre 2005 13:50
À : SPIP
Objet : Re: [Spip] Spip contrib?
C'est très précisément la page :
http://www.spip-contrib.net/spikini/NouveauCritere
qui ne s'affiche plus…
Si quelqu'un connait un moyen d'accéder au contenu, avec ou
sans électricité…
Pascale
Ici ça fonctionne.
Voilà la page :
Des nouveaux critères
Principe
Le NouveauCompilo permet maintenant d’ajouter ses propres paramètres aux
boucles. Cela va dans le sens de l’ajout de nouvelles boucles, sur de
nouvelles tables, dans SPIP. Mais bien sûr, on peut aussi les utiliser pour
écrire ses propres extensions des tables actuelles.
Dans SPIP, une boucle dans le squelette est traduite en requête SQL vers la
base de données où sont stockées les tables articles, brèves et autres. Du
coup, un critère de boucle se traduit comme une nouvelle contrainte dans la
requête.
Implémenter un nouveau critère demandera donc une connaissance des requêtes
SQL.
Par exemple, quand on ajoute le critère {exclus} à une boucle d’articles,
SPIP va ajouter une contrainte disant que l’on ne veut pas récupérer
l’article en cours de la table, mais juste les autres :
WHERE ... AND spip_articles.id_articles != XX
implémentation
Les critères du noyau de SPIP sont tous déclarés dans inc-criteres.php3, y
jeter un coup d’oeil est une bonne idée.
Pour déclarer un nouveau critère, il faut déclarer une fonction
critere_quelquechose dans ecrire/mes_options.php3 (ou dans un fichier
indépendant si on veut utiliser le SystemeDePlugin). quelquechose étant le
nom du critère qui apparaîtra dans la boucle (ainsi, on ne peut pas déclarer
de critère purement numériques).
Par exemple, la fonction pour le critère {exclus} est déclarée comme cela :
function critere_exclus_dist($idb, &$boucles, $param, $not) {
$boucle = &$boucles[$idb];
if ($param != 'exclus' OR $not)
erreur_squelette(_T('info_erreur_squelette'), $param);
$boucle->where = $boucle->id_table . '.' .
$boucle->primary."!='"."
. calculer_argument_precedent($idb,$boucle->primary, $boucles) .
"."'";
}
Cette fonction a un _dist à la fin, parce que c’est une fonction du noyau,
on peut ainsi écraser cette fonction en déclarant sa propre fonction
critere_exclus.
La fonction prend quatre paramètres :
1- $idb qui est l’identifiant de la boucle (le nom après BOUCLE dans le
squelette),
2- &$boucles qui est un tableau de toutes les boucles de ce squelette.
Indexer par leur identifiant,
3- $param qui est le critère qui a fait appeler cette fonction, ainsi, si on
veut passer des paramètre, on peut les récupérer ici,
4- $not qui indique si le critère est inversé.
Elle commence par deux morceaux de code assez commun :
$boucle = &$boucles[$idb];
qui permet de récupérer la boucle actuelle.
if ($param != 'exclus' OR $not)
erreur_squelette(_T('info_erreur_squelette'), $param);
qui vérifie que le critère passé n’est pas accompagné d’autres paramètres et
qu’il n’est pas nié (ce qui n’aurait pas de sens pour ce critère)
La dernière partie du code ajoute la nouvelle contrainte à la requête :
$boucle->where = $boucle->id_table . '.' .
$boucle->primary."!='"."
. calculer_argument_precedent($idb,$boucle->primary, $boucles) .
"."'";
On peut modifier un certain nombre de champs de la requête d’une boucle :
- $select quels champs seront sélectionnés et rendus accessible pour
l’affichage (c’est un tableau de nom de champ),
- $from sur quelles tables faire la requête, (ici aussi, un tableau de nom
de table), mais attention à la notive de Déesse A. :
Il faut d’ailleurs remarquer qu’un critère n’a a priori pas à affecter
le champ from de la requête SQL à construire (il y a des exceptions dans le
code de Spip, je sais, mais ça fait partie des scories que je cherche à
évacuer).
- $where quelles sont les contraintes sur la requête, toutes les
contraintes seront associées avec un AND, si on veut faire un OR entre deux
contraintes, il faut le mettre comme une seule contrainte (encore un tableau
de contraintes),
- $limit ???
- $group quelle colonne groupée (un nom de champ),
- $order par quelle colonne trié (une chaîne entre guillemets, ainsi il
faudra toujours retourner quelque chose du genre : "'colonne'"),
- sous_requete ???
- compte_requete ???
Un certain nombre de sucres sont présents pour nous aider à garder des
critères génériques qui puissent marcher avec le plus de boucles possible :
- $boucle->id_table est le nom de la table sur laquelle la boucle
s’applique,
- $boucle->primary est la clef "primaire" de la table,
- on peut récupérer un argument passé dans la boucle (soit par le contexte,
soit par assignation) grâce à la méthode calculer_argument_precedent qui
prend trois paramètres :
* l’identifiant de la boucle actuelle,
* le nom du champ à récupérer,
* le tableau des boucles.
Pour chaque boucle, dans le fichier inc-boucles.php, une requête de base est
déjà spécifiée, il faut donc faire attention à ajouter des nouvelles
contraintes compatibles avec cela. En général, cela implique de mettre une
contrainte sur la clef "primaire" de la table :$boucle->id_table . '.' .
$boucle->primary
Pour accéder aux champs nouveaux demandés dans la requête, il y a deux
méthodes :
- si c’est un champ déclaré dans le fichier de configuration, on y a accès
directement par la balise #NOM_CHAMP,
- sinon (c’est une balise calculée), il faut déclarer une fonction
balise_CHAMP qui explique ‡ spip comment récupérer ce nouveau champ (voir la
page sur le NouveauCompilo).