FW: [Spip] suivant- precedent

Arno m’a répondu par rapport à cette question : SPIP ne sait pas faire ça tout seul , il a besoin d’un peu de php3 pour l’aider mais c’est parfaitement fonctionnel et pas particulièrement compliqué. je l’ai utilisé pour faire des liens dans ma page

http://www.thysmethode.net/article.php3&id_article=34

l’explication complète plus bas.

Est ce que ceci ne devrait pas être inclus dans les trucs et astuces du site uzine section spip ?

Stéphane

contenu du mail d’arno :

Ta question correspond à une difficulté fréquente avec SPIP: afficher
sur la page d'un article un lien vers un "article précédent", et vers
un "article suivant". Cela permettrait comme dans ton cas de découper
(à la main) un article en plusieurs parties, et de faire des liens
automatiques en chaque partie; cela permettrait par exemple de faire
un tutorial (comme dans la doc de SPIP) avec en haut de chaque partie
du tutorial un lien vers l'article précédent, et en dessous vers
l'article suivant, etc.

Malheureusement, cela ne peut pas être fait simplement avec le
langage de boucles (en tout cas, je n'ai jamais trouvé de manière de
le faire).

En revanche, on peut s'en tirer en utilisant un peu de PHP dans le
squelette. Généralement, je ne suis pas trop fana de répondre à une
question simple avec du PHP sur la présente liste, mais comme cela
permet de contourner tout de même une limite importante de SPIP, il
vaut mieux filer un bout de code que rien du tout... Note: c'est du
PHP très simple, mais en revanche ça demande de très bien comprendre
le fonctionnement des boucles des squelettes de SPIP.

Voici donc deux boucles avec du PHP qui serviront d'exemple pour vos
propres besoins (à adapter en fonction de ce que vous souhaitez
réaliser)...

===========

Avant tout, pour l'exemple qui suit, les articles suivants et
précédents sont des articles _dans la même rubrique_ (c'est
généralement l'idée...). Pour faire simple, on va directement
numéroter les titres des articles, sous la forme:
1. Mon premier article
2. Mon deuxième article
3. Encore un titre d'article
4. Mon quatrième article
etc.
(notez bien: s'il y a plus de 9 articles, alors il faut commencer
votre numérotation avec "01" "02"...)

Ainsi, si on se trouve dans l'article "3. Encore un titre d'article",
il faudra que SPIP affiche l'article "2. Mon deuxième..." en article
précédent, et "4. Mon..." en suivant. Cette manière de procéder
permet d'avoir un code particulièrement simple ci-après. Il est
également simple de faire un classement par date de publication
(suivant et précédent signifiant alors "publié avant", "publié
après"...), mais le code devient un poil plus compliqué.

La première boucle:
----------------------------
<?
$titre_principal = "[(#TITRE|addslashes)]";
$premier_article = true;
?>
<BOUCLE_art_suivant(ARTICLES){id_rubrique}{par titre}>
<?
$titre_n = "[(#TITRE|addslashes)]";

if ($titre_n > $titre_principal AND $premier_article) {
$premier_article = false;
?>
<br> Article suivant : <a href="#URL_ARTICLE">#TITRE</a>
<?
}
?>
</BOUCLE_art_suivant>
----------------------------

IMPORTANT: cela se place à l'intérieur de la boucle de l'article
principal (celle qui affiche l'article que l'on est en train de
lire); vous pouvez par exemple insérer ce code juste après
l'affichage de #TEXTE dans la boucle principale.

Le principe général: il s'agit de récupérer la liste de tous les
articles contenus dans la même rubrique, de comparer les titres de
ces articles avec le titre de l'article principal, puis d'afficher
uniquement 1 article.

Explication détaillée:

(1) Avant la boucle: récupérer le titre de l'article principal, et
initialiser une variables. La syntaxe suivante:
"[(#TITRE|addslashes)]" est importante, car sinon on obtient un
message d'erreur quand le titre contient des guillemets.
L'initialisation de $premier_article permettra par la suite de
n'afficher qu'un seul article; pour afficher tous les articles
suivants, on pourra simplifier encore le code; si on veut afficher un
nombre déterminé d'articles suivants, on utilisera plutôt un compteur
"$i_suivants" par exemple, que l'on incrémentera à chaque affichage
d'un article, jusqu'à un nombre déterminé d'articles affichés.

(2) La boucle elle-même est sans difficulté:
<BOUCLE...(ARTICLES){id_rubrique}...
permet d'afficher les articles contenus dans la même rubrique, le
classement {par titre} classe les articles dans l'ordre de leur titre
(d'où l'intérêt de numéroter les titres, mais ça n'est pas
obligatoire). Pour un affichage de l'article "publié avant", "publié
après", on aurait préféré faire une classement {par date}...

(3) L'intérieur de la boucle
On voit que, ici, l'intérieur de la boucle est du code PHP. En effet,
il va falloir traiter les résultats de la boucle pour savoir quoi
afficher. Si on affiche directement le résultat de la boucle, on
obtiendrait la liste complète des articles de cette rubrique:
1. Mon premier article
2. Mon deuxième article
3. Encore un titre d'article
4. Mon quatrième article...

Si nous sommes actuellement dans l'article "2. Mon deuxième article",
on veut donc n'afficher que l'article "3. Encore un titre d'article".

Le code PHP est alors relativement simple à comprendre, si on sait
selon quel critère on fonctionne:
- on veut afficher un article dont le titre est "supérieur" au titre
de l'article principal (attention, ce "supérieur" est une comparaison
alphabétique, considérant que "3. Encore..." est "supérieur" à "2.
Mon...");
- on veut afficher le premier article qui suit l'article principal,
mais pas les suivants.
Ainsi le critère double du "if...".

L'intérieur du "if..." ne s'effectue donc que si les deux critères
sont remplis. Cela effectue deux actions:
- fixer la variables $premier_article à "false", ainsi on affiche un
article et un seul (lorsqu'on arrivera à l'article "4. Mon...",
certes le titre sera bien "supérieur" à "2. Mon...", mais
$premier_article ne sera plus "true", donc le "if..." ne donnera
aucun affichage);
- afficher le lien hypertexte qui va bien. Ici, je ne m'embête pas
avec un "echo...", avec la gestion un peu chiante des guillemets
éventuels dans le titre, je sors de PHP (?>....<?) et je balance du
code code HTML/SPIP directement.

Voilà, c'est tout...

================

La boucle suivante affiche l'article précédent. C'est le même
principe qui ci-dessus, il faut placer cela dans la boucle principale
de votre article (cette fois, par exemple avant #CHAPO). La
différence est à deux endroits:
- la boucle (ARTICLES) est affichée à l'envers {inverse}, de façon à
ce que l'article "1. Mon..." soit traité après "2. Mon deuxième...";
- on affiche le premier article dont le titre "inférieur" au titre de
l'article principal.

-------------------
<?
$titre_principal = "[(#TITRE|addslashes)]";
$premier_article = true;
?>
<BOUCLE_art_prec(ARTICLES){id_rubrique}{par titre}{inverse}>
<?
$titre_n = "[(#TITRE|addslashes)]";

if ($titre_n < $titre_principal AND $premier_article) {
$premier_article = false;
?>
<br> Article précédent : <a href="#URL_ARTICLE">#TITRE</a>
<?
}
?>
</BOUCLE_art_prec>
-------------------

Amicalement,
ARNO*

le 25/11/01 12:17, S.KHELIF à S.KHELIF@WANADOO.FR a écrit :

question un peu idiote peut etre mais…

je cherche a mettre un lien suivant et p^recedent dans le bas de chaque paque de spip
si quelqu’una une idée elle est la bienvenue .

merci

SAM

Préférer Linux à Micro$oft, c’est préférer la méritocratie à la féodalité.

P. Jarillon

MMh désolé j’ai fait un lien pour monter la fonction suivant - précédent dans mon mail précédent mais il était faux (& au lieu de ?). Méa coulpa çà m’apprendra à écrire des liens trop vite.

http://www.thysmethode.net/article.php3?id_article=34
Ça c’est le bon lien

contenu du mail d’arno :

Ta question correspond à une difficulté fréquente avec SPIP: afficher
sur la page d'un article un lien vers un "article précédent", et vers
un "article suivant". Cela permettrait comme dans ton cas de découper
(à la main) un article en plusieurs parties, et de faire des liens
automatiques en chaque partie; cela permettrait par exemple de faire
un tutorial (comme dans la doc de SPIP) avec en haut de chaque partie
du tutorial un lien vers l'article précédent, et en dessous vers
l'article suivant, etc.

Malheureusement, cela ne peut pas être fait simplement avec le
langage de boucles (en tout cas, je n'ai jamais trouvé de manière de
le faire).

En revanche, on peut s'en tirer en utilisant un peu de PHP dans le
squelette. Généralement, je ne suis pas trop fana de répondre à une
question simple avec du PHP sur la présente liste, mais comme cela
permet de contourner tout de même une limite importante de SPIP, il
vaut mieux filer un bout de code que rien du tout... Note: c'est du
PHP très simple, mais en revanche ça demande de très bien comprendre
le fonctionnement des boucles des squelettes de SPIP.

Voici donc deux boucles avec du PHP qui serviront d'exemple pour vos
propres besoins (à adapter en fonction de ce que vous souhaitez
réaliser)...

===========

Avant tout, pour l'exemple qui suit, les articles suivants et
précédents sont des articles _dans la même rubrique_ (c'est
généralement l'idée...). Pour faire simple, on va directement
numéroter les titres des articles, sous la forme:
1. Mon premier article
2. Mon deuxième article
3. Encore un titre d'article
4. Mon quatrième article
etc.
(notez bien: s'il y a plus de 9 articles, alors il faut commencer
votre numérotation avec "01" "02"...)

Ainsi, si on se trouve dans l'article "3. Encore un titre d'article",
il faudra que SPIP affiche l'article "2. Mon deuxième..." en article
précédent, et "4. Mon..." en suivant. Cette manière de procéder
permet d'avoir un code particulièrement simple ci-après. Il est
également simple de faire un classement par date de publication
(suivant et précédent signifiant alors "publié avant", "publié
après"...), mais le code devient un poil plus compliqué.

La première boucle:
----------------------------
<?
$titre_principal = "[(#TITRE|addslashes)]";
$premier_article = true;
?>
<BOUCLE_art_suivant(ARTICLES){id_rubrique}{par titre}>
<?
$titre_n = "[(#TITRE|addslashes)]";

if ($titre_n > $titre_principal AND $premier_article) {
$premier_article = false;
?>
<br> Article suivant : <a href="#URL_ARTICLE">#TITRE</a>
<?
}
?>
</BOUCLE_art_suivant>
----------------------------

IMPORTANT: cela se place à l'intérieur de la boucle de l'article
principal (celle qui affiche l'article que l'on est en train de
lire); vous pouvez par exemple insérer ce code juste après
l'affichage de #TEXTE dans la boucle principale.

Le principe général: il s'agit de récupérer la liste de tous les
articles contenus dans la même rubrique, de comparer les titres de
ces articles avec le titre de l'article principal, puis d'afficher
uniquement 1 article.

Explication détaillée:

(1) Avant la boucle: récupérer le titre de l'article principal, et
initialiser une variables. La syntaxe suivante:
"[(#TITRE|addslashes)]" est importante, car sinon on obtient un
message d'erreur quand le titre contient des guillemets.
L'initialisation de $premier_article permettra par la suite de
n'afficher qu'un seul article; pour afficher tous les articles
suivants, on pourra simplifier encore le code; si on veut afficher un
nombre déterminé d'articles suivants, on utilisera plutôt un compteur
"$i_suivants" par exemple, que l'on incrémentera à chaque affichage
d'un article, jusqu'à un nombre déterminé d'articles affichés.

(2) La boucle elle-même est sans difficulté:
<BOUCLE...(ARTICLES){id_rubrique}...
permet d'afficher les articles contenus dans la même rubrique, le
classement {par titre} classe les articles dans l'ordre de leur titre
(d'où l'intérêt de numéroter les titres, mais ça n'est pas
obligatoire). Pour un affichage de l'article "publié avant", "publié
après", on aurait préféré faire une classement {par date}...

(3) L'intérieur de la boucle
On voit que, ici, l'intérieur de la boucle est du code PHP. En effet,
il va falloir traiter les résultats de la boucle pour savoir quoi
afficher. Si on affiche directement le résultat de la boucle, on
obtiendrait la liste complète des articles de cette rubrique:
1. Mon premier article
2. Mon deuxième article
3. Encore un titre d'article
4. Mon quatrième article...

Si nous sommes actuellement dans l'article "2. Mon deuxième article",
on veut donc n'afficher que l'article "3. Encore un titre d'article".

Le code PHP est alors relativement simple à comprendre, si on sait
selon quel critère on fonctionne:
- on veut afficher un article dont le titre est "supérieur" au titre
de l'article principal (attention, ce "supérieur" est une comparaison
alphabétique, considérant que "3. Encore..." est "supérieur" à "2.
Mon...");
- on veut afficher le premier article qui suit l'article principal,
mais pas les suivants.
Ainsi le critère double du "if...".

L'intérieur du "if..." ne s'effectue donc que si les deux critères
sont remplis. Cela effectue deux actions:
- fixer la variables $premier_article à "false", ainsi on affiche un
article et un seul (lorsqu'on arrivera à l'article "4. Mon...",
certes le titre sera bien "supérieur" à "2. Mon...", mais
$premier_article ne sera plus "true", donc le "if..." ne donnera
aucun affichage);
- afficher le lien hypertexte qui va bien. Ici, je ne m'embête pas
avec un "echo...", avec la gestion un peu chiante des guillemets
éventuels dans le titre, je sors de PHP (?>....<?) et je balance du
code code HTML/SPIP directement.

Voilà, c'est tout...

================

La boucle suivante affiche l'article précédent. C'est le même
principe qui ci-dessus, il faut placer cela dans la boucle principale
de votre article (cette fois, par exemple avant #CHAPO). La
différence est à deux endroits:
- la boucle (ARTICLES) est affichée à l'envers {inverse}, de façon à
ce que l'article "1. Mon..." soit traité après "2. Mon deuxième...";
- on affiche le premier article dont le titre "inférieur" au titre de
l'article principal.

-------------------
<?
$titre_principal = "[(#TITRE|addslashes)]";
$premier_article = true;
?>
<BOUCLE_art_prec(ARTICLES){id_rubrique}{par titre}{inverse}>
<?
$titre_n = "[(#TITRE|addslashes)]";

if ($titre_n < $titre_principal AND $premier_article) {
$premier_article = false;
?>
<br> Article précédent : <a href="#URL_ARTICLE">#TITRE</a>
<?
}
?>
</BOUCLE_art_prec>
-------------------

Amicalement,
ARNO*

le 25/11/01 12:17, S.KHELIF à S.KHELIF@WANADOO.FR a écrit :

question un peu idiote peut etre mais…

je cherche a mettre un lien suivant et p^recedent dans le bas de chaque paque de spip
si quelqu’una une idée elle est la bienvenue .

merci

SAM


Si le concombre ne chante pas,
Et ceci en aucune saison,
Il faut croire que, par la volonté du ciel,
Probablement, il ne le peut pas.
Dzielá, I, 2
Galczylnski, Konstantyn Ildefons 1905-1953 (Polonais)