Matthieu Marcillaud a écrit :
Je voulais savoir si quelqu'un a une astuce pour transmettre un doublons à un inclure, ou quelque chose d'équivalent... (version 1.9.3 dev svn)
Bon, c'est renato qui m'a bien aidé en me fournissant ces 2 balises et quelques instructions :
function balise_SET_DOUBLONS($p) {
$p->code = "vide(\$GLOBALS['recherche_doublons'] = \$doublons)";
return $p;
}
function balise_MERGE_DOUBLONS($p) {
$p->code = "vide(\$doublons=array_merge(\$doublons,\$GLOBALS['recherche_doublons']))";
return $p;
}
Cependant... bien, ça ne fonctionnait pas, ou je n'ai pas trouvé comment; j'ai du adapter un peu...
Donc, éclaircissement de ce que je voulais (grosso grosso modo) :
- quand j'inclus B.html, il affiche les 3 derniers articles
- et idem quand j'inclus C.html... (mais les 3 suivants...)
dans A.html
[(#INCLURE{fond=B}{mm_doublons = toto})]
[(#INCLURE{fond=C}{mm_doublons = toto})]
dans B.html
<BOUCLE_B(ARTICLES){par date}{inverse}{0,3}{doublons [(#ENV{mm_doublons})]>
- #TITRE<br />
</BOUCLE_B>
dans C.html
<BOUCLE_B(ARTICLES){par date}{inverse}{0,3}{doublons [(#ENV{mm_doublons})]>
- #TITRE<br />
</BOUCLE_B>
Pour y arriver, j'ai placé dans mes_fonctions.php les nouvelles balises suivantes :
/* balises pour doublons entre inclure (_renato_) */
function balise_SET_DOUBLONS($p) {
$p->code = "vide(\$GLOBALS['recherche_doublons'] = \$doublons)";
return $p;
}
function balise_GET_DOUBLONS($p) {
if(!isset($GLOBALS['recherche_doublons'])){$GLOBALS['recherche_doublons'] = array();}
$p->code = "vide(\$doublons = \$GLOBALS['recherche_doublons'])";
return $p;
}
function balise_MERGE_DOUBLONS($p) {
if(!isset($GLOBALS['recherche_doublons'])){$GLOBALS['recherche_doublons'] = array();}
$p->code .= "vide(\$GLOBALS['recherche_doublons']=\$doublons=array_merge(\$doublons,\$GLOBALS['recherche_doublons']))";
return $p;
}
J'ai ajouté des choses par rapport au code de renato :
- pas besoin de charger #SET_DOUBLONS obligatoirement, #GET_DOUBLONS ou #MERGE_DOUBLONS peuvent être appelés sans générer d'erreur sur array_merge (second argument is not an array).
- #MERGE_DOUBLONS sauvegarde aussi le résultat dans la globale.
Fonctionnement :
dans B.html
#GET_DOUBLONS
<BOUCLE_B(ARTICLES){par date}{inverse}{0,3}{doublons [(#ENV{mm_doublons})]}>
- #TITRE<br />
</BOUCLE_B>
#MERGE_DOUBLONS
dans C.html
#GET_DOUBLONS
<BOUCLE_B(ARTICLES){par date}{inverse}{0,3}{doublons [(#ENV{mm_doublons})]}>
- #TITRE<br />
</BOUCLE_B>
#MERGE_DOUBLONS
Rien d'autre à faire pour que cela fonctionne.
#SET_DOUBLONS : enregistre dans une variable globale le tableau de doublons actuel (sur le squelette en cours, ou plutôt, sur la noisette en cours, bref, dans le fichier dans lequel il est placé)
#GET_DOUBLONS : fait exactement l'inverse : il replace la globale dans la variable $doublons de SPIP, toujours simplement dans le fichier dans lequel il est placé.
#MERGE_DOUBLONS : fusionne les deux tableaux ($doublons et la variable globale) et les sauvegarde le résultat dans les 2 tableaux... En gros :
$doublons = $GLOBALS['recherche_doublons'] = $doublons + $GLOBALS['recherche_doublons']
Quelques exemples de possibilités dans
A.html
[(#INCLURE{fond=B}{mm_doublons = toto})] // inclus 3 premiers articles
[(#INCLURE{fond=B}{mm_doublons = toto})] // inclus les 3 suivants
[(#INCLURE{fond=B}{mm_doublons = xxxx})] // réinclus les 3 premiers articles...
[(#INCLURE{fond=C}{mm_doublons = xxxx})] // devinez ?!
Autre remarque : il se peut que vous ne souhaitiez pas passer de doublons au fichier inclus... mais dans ce cas, il va stocker tout de même un doublons, dans nom : {doublons}, ce qui pourrait poser des problèmes avec d'autres inclusions comme cela...
Un détour possible avec microtime pour désigner un nom aléatoire :
B.html
[(#SET{doublons, [(#ENV{mm_doublons}|sinon{[(#REM|microtime|replace{' ',''}|replace{'0\.',''})]})]})]
#GET_DOUBLONS
<BOUCLE_B(ARTICLES){par date}{inverse}{0,3}{doublons [(#GET{doublons})]}>
- #TITRE<br />
</BOUCLE_B>
#MERGE_DOUBLONS
Voilà pour ce soir...
Il faut que je teste un peu mieux la chose encore, mais ça semble bien fonctionner.
Bien sûr, ça marche aussi simplement comme cela :
dans A.html
#INCLURE{fond=B}
#INCLURE{fond=C}
dans B.html
#GET_DOUBLONS
<BOUCLE_B(ARTICLES){par date}{inverse}{0,3}{doublons toto}>
- #TITRE<br />
</BOUCLE_B>
#MERGE_DOUBLONS
dans C.html
#GET_DOUBLONS
<BOUCLE_B(ARTICLES){par date}{inverse}{0,3}{doublons toto}>
- #TITRE<br />
</BOUCLE_B>
#MERGE_DOUBLONS
MM.