|
ARNO*
31 août 2003 14:31
|
Le PHP est interprété après les boucles
C’est une erreur très classique (je le commets moi-même régulièrement).
Lors de la construction d’une page de ton site, cela fonctionne en gros ainsi :
étape 1 : SPIP récupère le fichier de ton squelette, et va interpréter le langage de boucles : en fonction du paramètre passé en variable (id_article, id_rubrique...), les boucles sont transformées en requêtes vers la base de données, et les balises (#TITRE, #TEXTE...) sont remplacées par les éléments tirés de la base de données ;
Dans cette première étape, tout ce que qui n’est pas du ressort des boucles et des balises SPIP est laissé tel quel ; de cette façon, tu peux mettre absolument ce que tu veux dans ton squelette (PHP, XML...).
Le résultat est un fichier « texte » qui est le résultat de l’interprétation de ton squelette d’origine en y insérant les résultats tirés de la base de données. Ce fichier est sauvegardé (en cache).
étape 2 : ce fichier est appelé sur le serveur et envoyé vers ton butineur. Ainsi, s’il y a du PHP dans ce fichier, alors il est interprété par Apache et le résultat t’es communiqué.
Tu vois donc que le PHP est interprété par Apache après que SPIP ait interprété les boucles et les balises SPIP. Du coup, il n’est pas possible d’utiliser du PHP à l’intérieur des définitions de boucles.
|
|
jcbonsai
31 août 2003 23:17
|
> variable php dans un critère de boucle ?
OK, merci pour l’info. Je crois avoir compris, mais cette limitation est bien génante :-(
Et alors comment puis-je faire ?
Faut-il prévoir des boucles avec critère fixe pour toutes les possibilités et les encadrer par des tests conditionnels en php ? De ce genre, mais c’est bien lourd si je dois me farcir toutes les lettres !
<?php
$lettre = $_GET['lettre'];
if($lettre == 'A') {
?>
<BOUCLE_articles_rubrique_a(ARTICLES) {id_rubrique} {titre==^[aA]} {par titre}>
...
</BOUCLE_articles_rubrique_a>
<?php
} else if($lettre == 'B') {
?>
<BOUCLE_articles_rubrique_b(ARTICLES) {id_rubrique} {titre==^[bB]} {par titre}>
...
</BOUCLE_articles_rubrique_b>
<?php
}
// etc
>?
Mais AMHA il devrait y avoir moyen de donner plus de souplesse à SPIP. On devrait en principe pouvoir exécuter du code php à la première étape, puisque SPIP est lui même écrit en php... Ne pourrait-on pas prévoir des balises propres à SPIP pour délimiter du code php à exécuter AVANT que SPIP n’interprète ses propres balises ? Je n’ai pas trop joué avec ce genre d’astuce php, mais la fonction eval() et éventuellement ob_start() devrait pouvoir le faire. Ex :
<SPIP_PHP>
$lettre = 'B';
$critere_lettre = strtolower($lettre).$lettre;
</SPIP_PHP>
...
<BOUCLE_articles_rubrique(ARTICLES) {id_rubrique} {titre==^[<SPIP_PHP>$critere_lettre</SPIP_PHP>]} {par titre}>
...
</BOUCLE_articles_rubrique>
Merci pour l’aide
|
|
ARNO*
1er septembre 2003 02:39
|
> variable php dans un critère de boucle ?
Je ne vois pas trop pourquoi tu te compliques la vie si tu sais bien utiliser PHP. Tu fais une unique boucle qui te récupère tous les articles, dans cette bouche tu passes les infos nécessaires dans une array PHP. Une fois sorti de la boucle, tu fais le PHP qui va bien pour afficher tout ça lettre par lettre.
|
|
Thierry
1er septembre 2003 16:06
|
> variable php dans un critère de boucle ?
Bonjour,
j’ai un peu le même problème : dans un site en plusieurs langues, je fais des INCLUDE différents suivant la langue. Pour l’instant, je me trouve obligé de faire :
<?php switch($_GET["lang"]){ ?>
<?php case "fr": ?><INCLUDE(includes.php3){lang=fr}><?php break; ?>
<?php case "en": ?><INCLUDE(includes.php3){lang=en}><?php break; ?>
<?php } // end switch ?>
L’idée de balise SPIP permettant de mettre du code php interprété avant le code spip me semble intéressante. Dans ce cas, cela donnerait :
<INCLUDE(includes.php3){lang=<SPIP_PHP>$_GET["lang"]</SPIP_PHP>}>
Je suis encore assez débutant en spip, mais j’ai rencontré plusieurs fois ce type de problème, parfois lourd à contourner.
|
|
jcbonsai
3 septembre 2003 09:34
|
> variable php dans un critère de boucle ?
Merci Arno, j’ai fait comme tu m’as dit et ça marche :-)
Tout de même, je trouve ça peu élégant, compliqué, inefficace et difficile à maintenir de devoir mémoriser dans un tableau php tous les résultats pour n’en afficher que quelques uns, simplement parce que SPIP ne permet pas d’utiliser du php dans ses balises...
Il me semble que ce serait beaucoup plus élégant et simple (pour le webmaster) d’avoir la possibilité d’exécuter du php avant que SPIP ne traite ses balises. J’ai suggéré d’utiliser des balises comme <SPIP_PHP>...</SPIP_PHP> pour délimiter du code php à exécuter avant l’analyse des balises SPIP. Ces balises n’ont peut-être pas une syntaxe adaptée, mais c’est l’idée. Ce n’est sans doute pas simple à implémenter dans SPIP, mais ça doit être faisable avec les fonctions eval() et ob_start() de php.
PS y a pas un forum pour les suggestions ?
|
|
Jean-Christophe
3 septembre 2003 11:32
|
> variable php dans un critère de boucle ?
Ben finalement, je l’ai fait moi-même et ça marche TB pour moi. C’était finalement assez simple.
Ceux que ça intéressent peuvent télécharger le fichier inc-calcul-squel.php3 modifié sur base de la version 1.6 de SPIP (voir fichier joint) Attention, c’est du alpha de pre beta. Ca fonctionne sur la config de apinc.org (php 4.3.1) sans garantie que ça fonctionne pour d’autres config et probablement PAS en php 3.
Pour l’utiliser il faut encadrer le code php à exécuter avant d’analyser le squelette entre des balises <SPIP_PHP> et </SPIP_PHP> Comme pour le php normal, il faut utiliser echo ou print... pour afficher du texte. Donc pour Thierry, ce sera
<INCLUDE(includes.php3){lang=<SPIP_PHP>echo $_GET["lang"];</SPIP_PHP>}>
Il faut être consistant dans le niveau d’execution du php, si vous utilisez une variable entre <SPIP_PHP>, il faut aussi la calculer entre <SPIP_PHP> sinon elle ne sera pas dispo.
En espérant être utile.
|
|
Thierry
6 septembre 2003 00:12
|
> variable php dans un critère de boucle ?
Super, ça marche aussi chez moi (mais pas dans le cas des INCLUDE).
Est-ce qu’on peut raisonnablement espérer que ça fasse partie des versions futures de spip ?
En tous cas merci
|
|
Jean-Christophe
6 septembre 2003 23:07
|
> variable php dans un critère de boucle ?
Oui mais non, c’était pas si simple mais pas beaucoup plus compliqué non plus ;-)
En fait la soluce que j’ai donnée, n’en est pas une car elle exécute le code php au moment où le squelette est compilé (analysé et son cache généré). Alors que le code doit l’être quand le cache du squelette est exécuté, càd quand le cache de l’article, rubrique, brève... est généré. En effet, je veux pouvoir substituer la variable php par sa valeur au moment où le cache de l’article est généré, càd quand le cache du squelette est exécuté, pas quand il est compilé, opération qui ne se fait normalement que si on modifie le squelette.
Oubliez la modif renseignée plus haut, le code ne s’exécute que quand le squelette est modifié avec la valeur de la variable à ce moment là. Les autres appels ne tiendront pas compte du paramètre passé dans l’url et reprendront tjs sa valeur au moment de la compile du squelette.
J’ai un peu farfouillé dans les sources de spip et je comprends mieux le fonctionnement de son cache à deux niveaux : squelette et contenu (article, rubrique, brève...). J’ai trouvé une soluce qui convient à mes besoins, à savoir utiliser une variable php dans un critère de boucle. Ca passe par l’utilisation du tableau $contexte partagé par les fonctions du squelette compilé (en cache) et qui permet de rendre la variable disponible dans la boucle, du moins dans la partie qui calcule la requête SQL qui m’intéresse.
On repart de la version distribuée de spip 1.6. Les modifications à apporter à "inc-calcul-squel.php3" :
Renommer la fonction "calculer_texte" en "calculer_texte1"
Ajouter cette nouvelle fonction "calculer_texte" :
//
// Extraire du texte le code php entre balises <SPIP_PHP> et </SPIP_PHP>
//
// extension par Jean-Christophe Godart
//
function calculer_texte($texte)
{
$code = "";
while(($b1 = strpos($texte, '<SPIP_PHP>')) !== false) {
$b2 = $b1 + strlen('<SPIP_PHP>');
if(($e1 = strpos($texte, '</SPIP_PHP>', $b2)) === false) {
break; // erreur : pas de balise de fin
}
$e2 = $e1 + strlen('</SPIP_PHP>');
$code .= calculer_texte1(substr($texte, 0, $b1));
$code .= substr($texte, $b2, $e1-$b2);
$texte = substr($texte, $e2);
}
$code .= calculer_texte1($texte);
return $code;
}
Dans le squelette html, il faut ajouter au tableau $contexte[] les variables utilisées plus loin. On peut simplement y transférer les paramètres de la page appelée. Par ex dans "article.html", ajouter un code du genre :
<SPIP_PHP>
$contexte['monparam'] = $HTTP_GET_VARS['monparam'];
</SPIP_PHP>
Il faut ajouter ce code avant que la variable ne soit utilisée par une boucle pour qu’elle y soit disponible. Au besoin, vous pouvez faire des calculs, appels de fonctions ou tout autre code php pour la calculer. Ce qui importe, c’est que la variable se retrouve dans le tableau $contexte avec comme indice son nom, dans notre exemple $contexte[’monparam’]. Elle sera alors normalement disponible dans toutes les boucles qui suivent en tant variable locale, dans notre exemple $monparam.
Pour utiliser la variable dans une boucle de votre squelette html, il suffira de la reprendre comme "$monparam", pas besoin de balises ni de echo, simplement la variable précédée du $. Par ex dans "article.html" :
<BOUCLE_articles(ARTICLES) {id_rubrique} {titre==^[$monparam]} {par titre}>
...
</BOUCLE_articles>
Je n’ai essayé cette modification que dans un critère de boucle et cela marche bien pour moi. Je n’ai pas essayé pour d’autres balises SPIP, mais c’est possible que cela marche aussi. Néanmoins, la commande <INCLURE()> de SPIP, semble traitée différemment et c’est probable qu’il faille une autre méthode.
Je me suis basé sur la version 1.6 de SPIP. Il est possible que d’autres versions fonctionnent autrement.
La config php que j’ai utilisé est celle de apinc.org (php 4.3.1), mais le code est très simple et devrait tourner sous d’autres versions de php, y compris php 3.
Cette modification du code n’a pas été testée en profondeur, mais elle ne devrait pas produire d’effet désatreux, sauf peut être si votre code php entre balises <SPIP_PHP> est désastreux !
En espérant être utile,
Jean-Christophe Godart
|
|
dorian
7 septembre 2003 23:02
|
> variable php dans un critère de boucle ?
salut, ta technique a l’air intéressante, aurais tu le temps de proposer une contribution sur spip-contrib afin qu’elle soit largement testée et éventuellement publiée ?
|
|
manu
18 novembre 2003 12:33
|
> variable php dans un critère de boucle ?
je trouve toute cette démarche très intéressante et le passage de variable php au boucle permettrait d’étendre largement les fonctions de spip et notament de créer des moteurs de recherche avancée. C’est d’ailleurs le cas d’un exemple cité plus haut.
Je me suis moi-même heurter à ce problème et la solution proposé par jcbonsai et Jean-Christophe semble pertinente.
Toutefois, il n’est pas forcément nécessaire d’utiliser une balise de type SPIP_PHP. En effet, le texte "$monparam" est passé tel que au squelette et se retouve bien dans la requête servant à la boucle. Le problème se situe plus dans l’interprétation de cette variable.
Cette variable est interprété avec le squelette donc bien après l’interprétation des boucles et la génération du squelette et au moment de la génération du cache de l’article.
Toutefois, il restait le problème du contexte d’interprétation de la variable. Cette dernière est interprété au sein d’une fonction et ,a priori, n’est pas définie. J’ai essayé de passer des noms de variable de type $globals[’monparam’] mais sans succès (problème avec les ’). la solution de Jean-Christophe avec le tableau $contexte (qui porte bien son nom) fonctionne très bien mais il n’est pas nécessaire de le mettre entre des spip_php et donc on a pas besoin de toucher au inc-calcul-squel.php3.
Voilà j’espère avoir été clair.
|
|
20 novembre 2003 09:22
|
> variable php dans un critère de boucle ?
erratum :
il est bien nécessaire d’utiliser des balises de type spip_php pour le tableau $contexte. Pour mes testes, j’utilisai une variable nommée "titre" qui était déclarée comme globale dans une des focntions. Pour passer d’autres variables, il faut bien utiliser la méthode de Jean-Chirstophe. Autant pour moi.
|
|
Gael
22 novembre 2003 23:14
|
> variable php dans un critère de boucle ?
Encore plus dur pour Jean Christophe, j’aimerais utiliser une balise d’une boucle precedente en tant que criteres...
Une biere a celui qui trouve.
Example
<BOUCLE_association(ARTICLES)id_article>
<SPIP_PHP> $contexte[XXX]=#TITRE </SPIP_PHP>
<BOUCLE_assocsMere(RUBRIQUES)titre_mot=ASSO_MERE>
<BOUCLE_assoMere(ARTICLES)id_rubriquesurtitre==$XXX>
#TITRE
<BOUCLE_assoMere>
<BOUCLE_assocsMere>
<BOUCLE_association>
|
|
Guillaume
26 novembre 2003 15:39
|
> variable php dans un critère de boucle ?
Salut Gael,
En fait, je pense que ca doit marcher. Tu as testé ? En fait, la variable context passe de boucle en boucle, a moins que tu n’ecrases la variable entre temps, je pense que ca devrai marcher sans pb.
Guillaume
|
|
cberthe
19 mars 2004 15:38
|
> variable php dans un critère de boucle ?
J’ai patcher SPIP 1.7 avec la fonction calculer_texte et j’ai renommé l’ancienne en calculer_texte1, mais le nouveau tag SPIP_PHP ne fonctionne pas, il affiche simplement le contenu du tag sur ma page !
Par exemple : $contexte[’rub’] = Albums et le filtre sur $rub ne fonctionne alors pas !
Quelqu’un a t-il la solution ?
<BOUCLE_rubrique_breves(RUBRIQUES) {id_rubrique}>
<SPIP_PHP> $contexte['rub'] = #TITRE </SPIP_PHP>
<B_breves_rubrique>
<h2>BREVES DE LA CATEGORIE</h2>
<ul>
<BOUCLE_breves_rubrique(BREVES) {id_secteur} {titre_mot=$rub} {par date} {inverse} {0,5}>
<li><a href="#URL_BREVE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a><br />
<i>Publiée le [(#DATE|affdate_court)]</i>
</li>
</BOUCLE_breves_rubrique>
</ul>
</B_breves_rubrique>
</BOUCLE_rubrique_breves>
|
|
17 avril 2004 04:21
|
> variable php dans un critère de boucle ?
Salut de España :
J’ai patcher SPIP 1.7 aussi, mais le nouveau tag SPIP_PHP ne fonctionne pas, il affiche simplement le contenu du tag sur ma page.
<SPIP_PHP>$contexte[’monparam’] = #ID_FORUM ;</SPIP_PHP>
mais le code dans le cache est :
$retour .= ’
<SPIP_PHP>$contexte[\’monparam\’] = ’ ;
$retour .= $row[id_forum] ;
$retour .= ’ ;</SPIP_PHP>
’ ;
J’ai trouvé une autre manière pour transporter des variables a une boucle du niveau inferieur :
Dans mes_fonctions.php3 :
function set_var_contexte($texte, $var, &$contexte) {
$contexte["$var"] = "$text" ;
return ;
}
Dans le squelette, (n’importe pas le profundite deaux boucles) :
<BOUCLE_forum(FORUMS) {id_article}...>
...
[(#ID_FORUM|set_var_contexte{’monparam’, $contexte})]
...
<BOUCLE_discusion(FORUMS){id_forum=$monparam}...>
...
<BOUCLE_autre(FORUMS){id_forum=$monparam}...>
...
</BOUCLE_autre>
...
</BOUCLE_discusion>
...
<BOUCLE_forum>
Mais pour enlever des variables d’une boucle du niveau inferieur a une boucle du niveau superior,
c’est ne marche pas pourquoi le changements du contexte inferieur sont perdus aux fin de boucle.
Ainsi il fault :
Dans mes_fonctions.php3 :
function set_var_global($text, $var) {
global $mon_contexte ;
$mon_contexte["$var"] = "$text" ;
return ;
}
function echo_var_global($void, $var) {
global $mon_contexte ;
return $mon_contexte["$var"] ;
}
function set_var_contexte($texte, $var, &$contexte) {
$contexte["$var"] = "$text" ;
return ;
}
Dans le squelette (c’est marche aussi puor des boucles recursives) :
<BOUCLE_forum(FORUMS) {id_article}...>
...
[(#ID_FORUM|set_var_global{’monparam’})]
...
<BOUCLE_top(FORUMS) {id_enfant}>
[(#ID_FORUM|set_var_global{’monparam’})]
<BOUCLE_ascendente(boucle_top)>
</BOUCLE_ascendente>
</BOUCLE_top>
<!— Ici, le #ID_FORUM il ne sert pas à n’importe quoi, seulement sert pour lancer le filtre —>
[(#ID_FORUM|echo_var_global{’monparam’}|set_var_contexte{’monparam’, $contexte})]
...
<BOUCLE_discusion(FORUMS){id_forum=$monparam}...>
...
</BOUCLE_discusion>
...
<BOUCLE_forum>
C’est tout. C’est ne pas très elegant mais...
Salut et pardon pour mon fracaise
Jose M. Sánchez
Sevilla (España)
|
|
JMSE
23 avril 2004 09:49
|
> variable a l’URL dans un critère de boucle ?
Salut de l’Espagne.
Pour employer des variables a l’URL dans critères de boucles, il faut :
Dans mes_fonctions.php3 :
function set_var_contexte($text, $var, &$contexte, $value='') {
$contexte["$var"] = $value ? "$value" : "$text";
return;
}
function set_var_contexte_from_get($void, $var, &$contexte) {
set_var_contexte($void, $var, $contexte, $GLOBALS[$var]);
return;
}
Dans le squelette, par exemple, pour rechercher les articles avec un mot par titre
Le balise sert seulement pour lancer le filtre
[(#NOM_SITE_SPIP|set_var_contexte_from_get{'mot_titre', $contexte})]
<BOUCLE_articles(ARTICLES){titre_mot=$mot_titre} {par date} {inverse}>
...
</BOUCLE_articles>
Et dans l’URL : ...php3?mot_titre=motrecherche&
Salut
Jose Mª Sánchez
Sevilla
España
|
|
8 décembre 2004 18:26
|
> variable php dans un critère de boucle ?
Le script php de Jean-Christophe ne fonctionne pas avec la version 1.7
j’ai essayé : pas de message d’erreur, et rien de plus
|
|
MaamuT
15 février 2005 05:34
|
> variable php dans un critère de boucle ?
Je rebondis histoire de relancer la question.
Quelqu’un a t-il trouvé une solution qui fonctionne avec la 1.7, ou qui fonctionne tout court ?
Je cherche simplement à modifier la valeur du critère intervalle :
<BOUCLE_ARTICLES(ARTICLES){id_rubrique}{par date}{inverse}{debut_xxx,(valeur_variable)}{doublons}>
Ou (valeur_variable) est transmise par l’URL !
Aucune des solutions proposées ici ne fonctionne chez moi :/
C’est pas vital mais ça aiderait bien d’avoir une solution à ce petit désagrément ;)
Tshuss.
|
|
MaamuT
15 février 2005 05:41
|
> variable php dans un critère de boucle ?
Je rebondis histoire de relancer la question.
Quelqu’un a t-il trouvé une solution qui fonctionne avec la 1.7, ou qui fonctionne tout court ?
Je cherche simplement à modifier la valeur du critère intervalle :
<BOUCLE_ARTICLES(ARTICLES){id_rubrique}{par date}{inverse}{debut_xxx,(valeur_variable)}{doublons}>
Ou (valeur_variable) est transmise par l’URL !
Aucune des solutions proposées ici ne fonctionne chez moi :/
C’est pas vital mais ça aiderait bien d’avoir une solution à ce petit désagrément ;)
Tshuss.
|
|
MaamuT
15 février 2005 07:00
|
> variable php dans un critère de boucle ?
Je rebondis histoire de relancer la question.
Quelqu’un a t-il trouvé une solution qui fonctionne avec la 1.7, ou qui fonctionne tout court ?
Je cherche simplement à modifier la valeur du critère intervalle :
<BOUCLE_ARTICLES(ARTICLES){id_rubrique}{par date}{inverse}{debut_xxx,(valeur_variable)}{doublons}>
Ou (valeur_variable) est transmise par l’URL !
Aucune des solutions proposées ici ne fonctionne chez moi :/
C’est pas vital mais ça aiderait bien d’avoir une solution à ce petit désagrément ;)
Tshuss.
|
|
MaamuT
16 février 2005 23:31
|
> variable php dans un critère de boucle ?
Bien sur, je m’excuse plus que platement pour le triple post, une erreur de serveur m’ayant fait croire que ma contribution n’avait pas été publiée :/
Si un admin pouvait en supprimer deux, d’avance merci ;)
Et je cherche toujours la soluce à cette question de critère/PHP !
|
|
MaamuT
16 février 2005 23:40
|
> variable php dans un critère de boucle ?
D’ailleurs, l’erreur semble récurrente :
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 115313 bytes) in /var/shim/spipnet/Web/ecrire/inc_db_mysql.php3 on line 233
Si ça peut aider !!
|
|
bbdoc
17 février 2005 11:43
|
> variable php dans un critère de boucle ?
En effet, je viens de faire le test, car j’ai moi-aussi besoin d’utiliser une variable php dans un critère de boucle, et malheureusement cette méthode ne semble plus fonctionner...
Help Please, j’en ai réellement besoin... Jean-Christophe, reviens !!!
|
|
mep
13 mai 2005 11:15
|
> variable php dans un critère de boucle ?
Use #ENV tag introduced in spip version 1.8
http://www.spip.net/en_article2421....
|
|
pogay
25 mars 2006 12:26
|
variable php dans un critère de boucle ?
Solution pour SPIP 1.8x
#ENVFooter,Sard) prend le valeur de l’url
on peu placer un statment
$_GET[’Footer’] = ’Mexico’ ;
dans squelette.php c’est trop tot, on a pas le context
dans squelette.html c’ trop tard
mais on peut faire un filter qu’on place au debut de squelette.html
come :
<?php
# assigner les parametres
$SelSite = [(#REM|SetURLVars{selsite,Pac})];
$TopRub = [(REM|SetURLVars{toprub,68})];$_GET['toprub']='68';
# quelque fois on a besoin aussi des variables php, autrement
#ce ne pas necessaire de place le filter dans le php
?>
Example (dans article.html)
<BOUCLE_article_footer(ARTICLES)
{titre==(#ENV{selsite,default}|GetURLVars{selsite,default})} {titre_mot=mainfooter}>
#TEXTE
</BOUCLE_article_footer>
C’est très pratique, parce qu’on peut parametrer les squelettes.
Filters :
<?
function SetURLVars($texte,$var,$default){
# Sets Global Variable, which can be used in GetURLVars
$_GET["$var"]= $default;
# echo("2)$texte/$var/$default-"."@|".$_GET["$var"]."|@");
return($_GET["$var"]);
}
function GetURLVars($texte,$var,$default)
# #ENV evaluates at the very beginning.
# Filter to evaluate *actual* URL
# values from SetURLVars
#------------------------------------------
# p.ogay / 2006. Feb. 21
{
# echo("2)$texte/$var/$default-"."#|".$_GET["$var"]."|#");
if ($texte==$default){
if ($_GET["$var"]) return $_GET["$var"];
else return($default);
}
else return($texte);
}
function GetURLVars1($texte,$var,$default)
# #ENV evaluates at the very beginning.
# Filter to evaluate *actual* URL
# values from SetURLVars
#------------------------------------------
# p.ogay / 2006. Feb. 21
# rempacement sans check
{
# echo("2)$texte/$var/$default-"."#|".$_GET["$var"]."|#");
if ($_GET["$var"]) return $_GET["$var"];
else return($default);
}
Parametrage des Squelettes
<BOUCLE_principal(ARTICLES) {id_article}>
<?php
# article-1.html
# article_tpl c'est toujours identique, sauf les paramètres change
$SelSite = [(#CHARSET|SetURLVars{selsite,Sard})];
$TopRub = [(#CHARSET|SetURLVars{toprub,1})];$_GET['toprub']='1';
?>
<INCLURE(page.php3){fond=article_tpl}{id_article}{lang}>
</BOUCLE_principal>
Example :
protecpacific.com/spip1.82d/rubrique.php3?id_rubrique=1
protecpacific.com/spip1.82d/rubrique.php3?id_rubrique=16
|
|
Ali.A
21 août 2007 16:24
|
variable php dans un critère de boucle ?
Salut à tous,
Bien que le post remonte à plusieurs année, j’ai tester le patch décrit plus haut.
La methode fonctionne même sous Agora-SPIP.
Pour passer une variable dans un critère d’une boucle SPIP, j’ai suivi les conseil de jean-christophe.
il me fallais passer une variable php dans une boucle rubrique comme ceci
< BOUCLE_rubrique(RUBRIQUES) id_rubrique=$MaVariablePhP>
[(#TITRE)]
< /BOUCLE_rubrique>
Dans mon cas, j’ai simplement dû faire un $_GET à la place du $HTTP_GET_VARS comme ceci :
< SPIP_PHP>
$contexte[’MaVariablePhP’] = $_GET[’MaVariablePhP’] ;
< /SPIP_PHP>
Un grand merci à jean-christophe ;)
|
|
princesse
24 juin 2008 11:48
|
variable php dans un critère de boucle ?
La fonction calculer_texte n’est plus dispo pour SPIP 1.9.2...
Une autre solution serait-elle compatible ???
|
|
Billou
9 août 2008 04:55
|
variable php dans un critère de boucle ?
Raaah après lecture de ce sujet, je sens que je vais devoir me taper 26 itérations d’une boucle…
Au secouuuurs…
|
|
Stanislas
9 août 2008 07:53
|
variable php dans un critère de boucle ?
Pas envie de lire tous ces échanges... mais ton besoin aurait pas rapport par hasard avec les balises SET et GET... voir par exemple
http://www.paris-beyrouth.org/Un-article-au-hasard-parmi-les-5
|
|
Billou
10 août 2008 00:10
|
variable php dans un critère de boucle ?
J’ai essayé mais ça ne marche pas, dès que le #GETvariable se retrouve dans une définition de boucle, c’est erreurs PHP à gogo ou erreurs SPIP.
|
|
Stanislas
10 août 2008 11:47
|
variable php dans un critère de boucle ?
comme je ne sais pas ce que tu veux faire je ne peux que évoquer des généralités, du genre : ne pas oublier que le php est interprété après le code spip donc une variable php ne sera pas encore définie quand le code spip en aura besoin, d’où bogue... le mieux c’est de se débrouiller pour utiliser le fichier mes_fonctions.php en créant une balise si on est très fort sinon la création d’un filtre c’est assez accessible... ou peut être je vais écrire une bêtise mais appeler un fichier php avec la balise #INCLURE je me demande... faut essayer... mais il faut mettre le nom et l’extension du fichier (pas seulement le nom comme pour un squelette)...
|
|
Billou
10 août 2008 16:36
|
variable php dans un critère de boucle ?
Disons que ce que je voulais faire c’est classer les mots-clés par genres et par ordre alphabétique.
Par genres pas de soucis, y’a qu’une seule boucle.
Par contre par ordre alpha, j’ai voulu utiliser une fonction PHP qui définit chaque lettre séquentiellement. Ensuite j’utilise #SET puis #GET dans {titre==^[A]} pour spécifier chaque lettre.
Sauf que ça me fait une erreur SPIP me disant qu’il n’y a rien de définit entre les [ ].
Bon là c’est pas grave, je m’en suis sorti en faisant 26 itérations de la boucle (un peu long et chiant j’avoue) et comme ça fonctionne et que j’ai des tonnes d’autres trucs sur lesquels me prendre la tête, je laisse ça à ceux qui ont les compétences et surtout le temps =D
|