Chemin de navigation en fichier à INCLURE

Basée sur les contribs Chemin de navigation et Afficher le Chemin de navigation, cette contrib propose une solution sous forme d’un fichier à INCLURE dans les pages articles, breves ou rubriques pour avoir un chemin de navigation du style Sommaire >> Partie >> sous-partie >> ...

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> &gt;&gt; </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 -->
chemin_site.zip
fichiers inc-chemin.php3 et inc-chemin.html pour INCLURE dans vos squelettes

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

Notes

[1note spip contrib : déplacé depuis ici

Dernière modification de cette page le 21 mai 2007

Discussion

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 :

            <BOUCLE_rubrique_hierarchie_breve(BREVES){id_breve=#ENV{id_breve}}>

    Pour les articles :

                    <BOUCLE_rubrique_hierarchie_article(ARTICLES){id_article=#ENV{id_article}}>

    Pour les rubriques :

                            <BOUCLE_rubrique_hierarchie(RUBRIQUES){id_rubrique=#ENV{id_rubrique}}>

    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

Qui êtes-vous ?
  • [Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom