proposé sur le wikini :
http://www.spip-contrib.net/spikini/CommentSpipEvolue
JL
Ouh le fayot !
Sinon, c'est l'occasion d'expliquer ce vers quoi nous essayons d'aller (en
fait, c'est quasi fini, je suis en train de terminer la partie {critères} :
Avec la version 1.8, le « compilateur » de SPIP devient un moteur générique
de <BOUCLES>, {critères}, #BALISES et |filtres sur une base de données.
<BOUCLES> :
pour ajouter des boucles, il faut décrire la table correspondante dans
$tables_principales (ou mes_fonctions ?) ex: <BOUCLE_a(CHANSONS)>
#BALISES :
pour ajouter des balises, il suffit, si la balise correspond à un champ de
la table concernée par la <BOUCLE> dans laquelle on se trouve (ou dans une
boucle englobant celle-ci), de laisser faire SPIP, qui ira directement
chercher ce champ ; si la balise est plus complexe que cela, on peut la
définir dans mes_fonctions.php3 (s'inspirer de inc-balises.php3)
filtres
ceci fonctionne depuis le tout début de SPIP ; la plupart des filtres sont
des fonctions qui prennent comme premier argument le contenu à filtrer, et
comme arguments optionnels suivants les arguments optionnels du filtre,
exemple [(#CHAMP|filtre{#ID_ARTICLE,#TITRE})] sera défini dans
mes_fonctions.php3 par
function filtre ($texte, $id=0, $titre='') {
... return resultat
}
Les filtres standards de SPIP sont principalement dans ecrire/inc_texte et
ecrire/inc_filtres, mais il peut s'agir de n'importe quelle fonction définie
en php (ex: |strlen donne la longueur en octets de l'argument).
{critères}
ils sont définis dans inc-criteres.php3 ; on peut les surcharger en créant
function critere_toto ($critere, $p) {
$p->....; modifier la requete, ajouter des filtres, etc.
return $p;
}
la fonction critere_toto si elle existe définit le critère {toto ....}, donc
tout ce qui se trouve après le mot toto est ignoré dans le choix de la
fonction critère.
Exemple : {par titre} est définie par la fonction critere_par($critere,
$not, $p). ($not consigne le ! initial d'inversion du critère {!doublons}
Quelques critères sont définis de manière interne : ainsi {0,1}.
Enfin, par défaut, si vous n'interceptez pas le critère avec une fonction
critere_xxxxx() :
* {zigzig=x} signifiera "aller chercher les éléments dont la valeur du
champ zigzig est égale à 'x'
* {zigzig} signifiera "aller chercher les éléments dont la valeur du champ
zigzig est égale à celle du contexte" (c-à-d en général à la valeur du champ
zigzig de la boucle précedente, ou, pour une boucle de premier niveau, au
paramètre ?zigzig=x passé dans l'URL); {zigzig=x} signifiant
* {zigzig=$x} signifiera "aller chercher les éléments dont la valeur du
champ zigzig est égale à la valeur de 'x' dans le contexte initial
* enfin {zigzig=#TEXTE} signifiera "aller chercher les éléments dont la
valeur du champ zigzig est égale à la valeur du champ #TEXTE de l'élément
englobant" (attention, la notation #TEXTE dénote ici un champ et non une
balise, on ne peut pas faire {zig=#LESAUTEURS}, et les filtres standards
(typo, propre...) n'ont pas été appliqués)
-- Fil
<BOUCLES> :
pour ajouter des boucles, il faut décrire la table correspondante dans
$tables_principales (ou mes_fonctions ?) ex: <BOUCLE_a(CHANSONS)>
Le message précédent était évidemment un brouillon, pour donner des idées ;
une autre piste de discussion a été lancée ici, sans trop de réponses pour
l'instant :
Et pourtant, dans ses rêves les plus fous Emmanuel prétend qu'on pourrait
faire <BOUCLE_externe(base2:CHANSONS)>... où base2 est une autre base,
séparée de la base spip proprement dite, et même éventuellement disponible
sous un autre hôte (voire un autre SGBD). Et le pire c'est qu'on n'est pas
loin de ça du tout, puisqu'il s'agit de requêtes en lecture seule (SELECT,
cf. la fonction spip_abstract_select())
Je vous laisse imaginer les contribs de folie, et pourquoi pas la prise
d'indépendance du compilateur par rapport au reste de SPIP. Ainsi l'espace
privé, les spip_articles etc serait juste "une application" de ce moteur
générique de templates SQL -> liste de résultats ("html").
-- Fil
Fil wrote:
Ouh le fayot !
C'est aussi un challenge ...
A +
JLuc