Remarque : cette contrib est le produit d’un stage de formation à la création de boucles et plus précisément à leur intégration en fichier externe. Les explications sont reproduites ’in-extenso’ même si cela alourdit l’article, l’idée c’est qu’elle puisse aussi servir de tutoriel (?).
(Pour les lecteurs pressés, voir la fin de la partie 2 pour récupérer le zip contenant inc-chemin.php3 et inc-chemin.html)
1) La synthèse de l’existant :
En mélangeant les différentes boucles proposées dans les commentaires on pourrait synthétiser le tout avec cette boucle :
<!-- Chemin du site -->
<div>
<BOUCLE_rubrique_hierarchie(RUBRIQUES){id_rubrique}>
<a href="#URL_SITE_SPIP">#NOM_SITE_SPIP</a>
<BOUCLE_chemin(HIERARCHIE){id_article}> <!-- OU {id_rubrique} voir explication ci-dessous -->
<strong> >> </strong>
<a href="#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>
[(#TITRE|supprimer_numero)]
</a>
</BOUCLE_chemin>
</BOUCLE_rubrique_hierarchie>
</div>
<!-- fin chemin du site -->
La subtilité c’est d’adapter la définition de BOUCLE_rubrique_hierarchie en fonction du type de page qui contient cette boucle :
- si c’est un article le paramètre sera id_article
- si c’est une rubrique, ce sera id_rubrique
- pour les brèves, on triche un peu (puisque HIERARCHIE ne peut utiliser id_breve) mais ça fonctionne en utilisant id_article (j’imagine que <BOUCLE_chemin(HIERARCHIE){id_article} sort un chemin correspondant à un article stocké dans la rubrique explorée ???)
Quoiqu'il en soit, ces 2 boucles appliquées aux pages rubriques, brèves et articles permettent d'avoir le résultat suivant (on suppose par exemple l'arborescence suivante /partie1/partie1.1/partie1.1.1/ pour l'article id=25) :
- sur la page de la rubrique de la partie1.1.1 (rubrique.php3?id_rubrique=7) on obtient :
Nom_site_SPIP >> partie1 >> partie1.1
- sur la page de l’article 25 (article.php3 ?id_article=25) on obtient :
Nom_site_SPIP >> partie1 >> partie1.1 >> partie1.1.1
La logique de l’affichage est donc respectée : le chemin indiqué correspond bien toujours exactement au chemin de la rubrique parent de la page affichée :)
Mais si l’on souhaite au contraire que sur la page de la rubrique1.1.1 il soit affiché :
Nom_site_SPIP >> partie1 >> partie1.1 >> partie1.1.1
(même si ce n’est pas la logique courante au niveau du chemin affiché, chacun fait ce qu’il lui plait :) alors on utilise id_article dans les pages rubriques (on profite donc du même genre « d’effet de bord » que pour les brèves)
2) L’optimisation proposée : une seule boucle valide pour les 3 types de pages (articles, rubriques, breves)
la démo de cette version est visible ici :
http://www.aix-mrs.iufm.fr/formatio...
L’idée c’est, bien-sûr, d’arriver à fabriquer la paire de fichiers inc-chemin.html + inc-chemin.php3 que l’on pourrait INCLURE dans le squelette des pages article.html, rubrique.html et breve.html ce qui facilitera grandement la maintenance, l’habillage et les évolutions du code de cette boucle
Il suffit donc de créer 3 boucles sur le modèle de la boucle élémentaire vue dans le 1) et de les imbriquer selon le schéma suivant :
<BOUCLE_elementaire_pour_une_breve(BREVES){id_breve}>
[code boucle elementaire 1]{id_article}
</BOUCLE_elementaire_pour_une_breve>
<BOUCLE_elementaire_pour_un_article(ARTICLES){id_article}>
[code boucle elementaire 2]{id_article}
</BOUCLE_elementaire_pour_un_article>
<BOUCLE_elementaire_pour_une_rubrique(RUBRIQUES){id_rubrique}>
[code boucle elementaire 3]{id_rubrique}
</BOUCLE_elementaire_pour_une_breve>
<//B_elementaire_pour_un_article>
<//B_elementaire_pour_une_breve>
On obtient donc un résultat valide quelque soit le type de page dans laquelle va « tourner » cette boucle :
- si c’est une breve (breve.php3 ?id_breve=2) la boucle [code boucle elementaire 1]id_article retourne le chemin du secteur qui contient la breve, les 2 autres boucles ne s’éxecutent pas donc résultat du style :
Nom_site_SPIP >> partie1
- si c’est un article (article.php3 ?id_article=25) la boucle BREVES initiale échoue, la boucle ARTICLES qui suit est éxécutée, la boucle RUBRIQUES n’est pas appellée ; on récupère donc le chemin de la rubrique qui stocke l’article :
Nom_site_SPIP >> partie1 >> partie1.1 >> partie1.1.1
- si c’est une rubrique (rubrique.php3 ?id_rubrique=7), les 2 premières boucles échouent, la boucle RUBRIQUES retourne alors le chemin de sa rubrique parent, ce qui donne :
Nom_site_SPIP >> partie1 >> partie1.1
Pour rendre le truc encore plus facilement configurable on va le doter d’une feuille de style simple mais efficace (qui pourra/devra être intégrée à la feuille de style du squelette), ce qui peut donner un code total du style :
<!--
/* fichier inc-chemin.html
*
* - à déposer dans le répertoire de squelette avec inc-chemin.php3
* - usage : . est prévu pour fonctionner à l'intérieur des boucles générales ARTICLES, BREVES et RUBRIQUES
* . pour insérer un menu copiez le code suivant dans un des fichiers article.html, breve.html, rubrique.html
* à l'endroit où vous souhaitez afficher le chemin de navigation
*
* <INCLURE(inc-chemin.php3) {id_article} {id_breve} {id_rubrique}>
*
* - configuration : . le séparateur est défini par la variable php $separateur ci dessous (par défaut ' >> ')
* . configurez les classes CSS .mon_style_de_chemin selon vos besoins
* - pour plus d'infos : http://www.spip-contrib.net/spikini/VarianteContribChemin-de-navigation
*
*/
-->
<!-- Début chemin du site -->
<?php // on défini le séparateur ici => tout HTML / javascript autorisé à condition de bien échapper les ' et les " !!!
$separateur = ' >> ';
?>
<style type="text/css">
.mon_style_de_chemin {
font-size: 75%;
font-weight: bold;
}
.mon_style_de_chemin a:visited {
color: #999
}
.mon_style_de_chemin a:hover {
background-color: #DDD;
color: #000;
}
.mon_style_de_chemin a {
font-family: verdana;
}
.mon_style_de_chemin span {
color: green;
font-size: 120%;
}
</style>
<div class="mon_style_de_chemin">
<BOUCLE_rubrique_hierarchie_breve(BREVES){id_breve}>
<a href="#URL_SITE_SPIP">#NOM_SITE_SPIP</a>
<BOUCLE_chemin_breve(HIERARCHIE){id_article}>
<span><?php echo $separateur; ?></span>
<a href="#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
</BOUCLE_chemin_breve>
</BOUCLE_rubrique_hierarchie_breve>
<BOUCLE_rubrique_hierarchie_article(ARTICLES){id_article}>
<a href="#URL_SITE_SPIP">#NOM_SITE_SPIP</a>
<BOUCLE_chemin_article(HIERARCHIE){id_article}>
<span><?php echo $separateur; ?></span>
<a href="#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
</BOUCLE_chemin_article>
</BOUCLE_rubrique_hierarchie_article>
<BOUCLE_rubrique_hierarchie(RUBRIQUES){id_rubrique}>
<a href="#URL_SITE_SPIP">#NOM_SITE_SPIP</a>
<BOUCLE_chemin(HIERARCHIE){id_rubrique}>
<span><?php echo $separateur; ?></span>
<a href="#URL_RUBRIQUE" [title="(#DESCRIPTIF|textebrut|entites_html)"]>[(#TITRE|supprimer_numero)]</a>
</BOUCLE_chemin>
</BOUCLE_rubrique_hierarchie>
<//B_rubrique_hierarchie_article>
<//B_rubrique_hierarchie_breve>
</div>
<!-- fin chemin du site -->
Utilisation :
A priori, dans les pages article.html, rubrique.html et breve.html, le plus simple est d’afficher le chemin juste avant le contenu principal de la page. Ce qui sur une 1.8.2 standard donne :
<div class="contenu" id="principal"> <!-- ce DIV repère l'ouverture du contenu principal des pages article.html, rubrique.html et breve.html -->
<!-- Chemin du site -->
<INCLURE(inc-chemin.php3) {id_article} {id_breve} {id_rubrique}>
<!-- fin chemin du site -->
- remarquez que le fait de passer les 3 paramètres id_article id_breve id_rubrique à INCLURE permet de le rendre fonctionnel quelque soit le type de page de squelette dans laquelle il est appellé.
3) To do :
- modification de la boucle élémentaire pour que le dernier élément (la rubrique qui contient la page en cours) puisse avoir un style particulier
4) Prospective : « Mortimérisation » de cette contrib : utilisation d’une balise #POSE
Cette contrib est également proposée comme un exemple de mise en pratique des concepts développés dans la contrib de Mortimer et noé de naama (numéro 817)
Vu le caractère expérimental de cette partie, vous la trouverez sur le spikini de spip-contrib : http://www.spip-contrib.net/spikini... [1]
Le fichier xml correspondant à cet exemple
Discussions par date d’activité
3 discussions
merci et avec les modifs de roland sur la 1.9 ca fonctionne parfaitement.
J’indique juste que sur les rubriques qui ne contiennent pas d’articles, le chemin ne s’affiche pas, il suffit d’ajouter tout aux boucles principales
Répondre à ce message
J’ai adapté la contrib ’Chemin de navigation en fichier à INCLURE’ pour spip 1.9 sans aucune difficulté malgré mon faible niveau en programmation.
la ligne d’appel est maintenant
<INCLURE{fond=inc/inc-chemin} {id_article} {id_breve} {id_rubrique}>
(Note : mes fichiers à inclure sont dans le sous-dossier inc/ du dossier des squelettes)
Les lignes de définition des boucles sont maintenant :
Pour les brèves :
Pour les articles :
Pour les rubriques :
Je signale aussi un petit oubli dans la définition de style .chemin a:visited : il manque le ; final.
Répondre à ce message
Ca marche niquel merci
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |