Script PHP : fil d'Ariane

WRInaute passionné
Bonjour;

aujourd'hui sur tous mes sites en HTML j'intègre un fil d'Ariane. Un fil d'Ariane c'est le rappel de l'arborescence parcourue :
"accueil > rubrique 3 > article 2"
Aujourd'hui, je fais ça à la main sur toutes les pages du site. :cry:

J'aurais aimé savoir si on pouvait tous ensemble créer une petite fonction PHP pour intégrer ça automatiquement (via un include par exemple).


Je pensait qu'on pouvait récupérer l'arborescence jusqu'au fichier actuellement utilisé (basename($_SERVER['PHP_SELF']) ???) et s'en servir pour afficher ce résultat.
Mais voilà, je suis pas développeur PHP... je sais pas faire ça tout seul. Mais si vous voulez, je m'occupe de la CSS !
 
WRInaute passionné
Le code généré par le script pour une URL : -http://www.lesite.com/rubrique3/article2.php serait :

Code:
<span class="ariane"><a href="http://www.lesite.com/index.php">accueil</a> > <a href="http://www.lesite.com/rubrique3/">rubrique 2</a> > <a href="http://www.lesite.com/rubrique3/article2.php">article 2</a></span>
 
WRInaute passionné
Ta fait une petite erreur dans ton code:
Code:
<a href="http://www.lesite.com/rubrique3/">rubrique 2</a> >
ecrie plutot :
Code:
<a href="http://www.lesite.com/rubrique2/">rubrique 2</a>

C'est null ce que je dis, mais en tous cas je suis interressé par ce post.
Si vous trouvez comment faire c'est genial.
 
Nouveau WRInaute
Je suppose que tu cherches quelque chose comme ca
Code:
<?php
$ndd="http://www.example.com/";
$niv = $_SERVER['PHP_SELF'];
$explo = explode("/",$niv);
echo "<a href=\"".$ndd."\">Accueil</a> &gt; \n";
echo "<a href=\"".$ndd.$explo[1]."/\">".$explo[1]."</a> &gt; \n";
echo "<a href=\"".$ndd.$explo[2]."/\">".$explo[2]."</a>\n";
?>
 
WRInaute impliqué
oops

$explo[1].$explo[2] non pour le deuxieme niveau

et pas ajouter de / au dernier niveau...

laissez moi deux minutes sinon, je code un truc comme ca en vitesse
 
Nouveau WRInaute
Autant pour moi je suis allé trop vite et sans verif
Code:
<?php
$ndd="http://www.example.com/";
$niv = $_SERVER['PHP_SELF'];
$explo = explode("/",$niv);
echo "<a href=\"".$ndd."\">Accueil</a> &gt; \n";
echo "<a href=\"".$ndd.$explo[1]."/\">".$explo[1]."</a> &gt; \n";
echo "<a href=\"".$ndd.$explo[1]."/".$explo[2]."\">".$explo[2]."</a>\n";
?>
 
WRInaute impliqué
j'ai pas teste, et avec ca tout est en lien, alors qu'on pourrait faire un truc ou l'article courant est pas affiche sous forme de lien, mais bon, ca compliquerait le code pour pas grand chose je trouve..

Code:
function fildarianise(&$titres, $separateur=' > ')
{
	/*
	* $titres est un tableau associatif du genre :
	* $titres = array(0=>'Accueil', 'cat1'=>'Catégorie 1', 'cat2'=>'Categorie 2', 'contact.html'=>'Contact', 'index.html'=>false);
	*/

	$baseUrl = 'http://' . . $_SERVER['HTTP_HOST'];
	$retour = "<a href=\"$baseUrl\">" . $titres[0] . '</a>';

	$chemin = explode(substr($_SERVER['PHP_SELF'], 1), '/');

	if (is_array($chemin)) foreach ($chemin as $k=>$v) if ($titres[$v] !== false)
	{
		$baseUrl .= "/$v";
		$titre = isset($titres[$v]) ? $titres[$v] : $v;
		$retour .= $separateur . "<a href=\"$baseUrl\">$titre</a>";	
	}

	return $retour;
}
 
WRInaute passionné
Oauh ! ça m'a l'air pas mal tout ça ! :D
La fonction de "le ster" est plus simple à lire pour moi, mais si j'ai bien compris, le nombre de niveaux dans l'URL est limité à 2, non ?

Je vais tester tout ça.
Merci en tout cas !!
 
WRInaute passionné
@fbparis : J'ai quelques soucis avec ta fonction...
Elle ne me renvoie aucun code et aucun message d'erreur !

J'ai modifié la syntaxe de base de $retour, mais je pense que c'est correct. Quelqu'un pourrait m'aider à débugger ?

Code:
function fildarianise(&$titres, $separateur=' > ')
{
   /*
   * $titres est un tableau associatif du genre :
   * $titres = array(0=>'Accueil', 'cat1'=>'Catégorie 1', 'cat2'=>'Categorie 2', 'contact.html'=>'Contact', 'index.html'=>false);
   */

   $baseUrl = 'http://'.$_SERVER['HTTP_HOST'];
   $retour = '<span class=\"ariane\"><a href=\"'.$baseUrl.'\">'.$titres[0].'</a></span>';
   $chemin = explode(substr($_SERVER['PHP_SELF'], 1), '/');

   
   
   if (is_array($chemin)) foreach ($chemin as $k=>$v) if ($titres[$v] !== false)
   {
      $baseUrl .= "/$v";
      $titre = isset($titres[$v]) ? $titres[$v] : $v;
      $retour .= $separateur . "<a href=\"$baseUrl\">$titre</a>";   
   }

   return $retour;
}
 
WRInaute impliqué
tu fais bien un

echo $fildarianise($titres);

?

sinon pourquoi tu fais pas une classe ariane pour les a plutot que de mettre dans un span : <a class="ariane" href="..."> ?

je vais tester ma fonction en vitesse si tu dis que ca marche pas..
 
WRInaute passionné
J'ai simplement comme résultat affiché :
avec un lien vers la racine sur le "/".

En ce qui concerne la classe sur le span, cela me permet de définir :
Code:
.ariane {font-family: Arial;font-size: 0.75em; letter-spacing:0.1em; color: #999999;}
.ariane A:link, .ariane A:visited {text-decoration: none; color: #999999;}
.ariane A:hover {text-decoration: underline; color: #333333; }
Et ainsi, même les séparateurs sont mis en forme.
 
WRInaute occasionnel
Bonsoir,

Intéressante cette petite fonction !
Je me suis permi d'apporter quelques petites corrections à la version de MagicYoyo afin de la rendre un peu plus ... fonctionnelle ;)
Merci pour le script fbparis.

Code:
<?php

// Fonction fildarianise
function fildarianise(&$titres, $separateur=' > ')
{
	/*
	* $titres est un tableau associatif du genre :
	* $titres = array(0=>'Accueil', 'cat1'=>'Catégorie 1', 'cat2'=>'Categorie 2', 'contact.html'=>'Contact', 'index.html'=>false);
	*/

	$baseUrl = 'http://'.$_SERVER['HTTP_HOST'];
	$retour = '<span class="ariane"><a href=' . $baseUrl . '>' . $titres[0] . '</a></span>';
	$chemin = explode("/", substr($_SERVER['PHP_SELF'], 1));
	
	if (is_array($chemin)) foreach ($chemin as $k=>$v) if ($titres[$v] !== false)
	{
		$baseUrl .= "/$v";
		$titre = isset($titres[$v]) ? $titres[$v] : $v;
		$retour .= $separateur . '<a href=' . $baseUrl . '>' . $titre . '</a>';   
	}
	
	return $retour;
}

// Un essai...
$titres = array(0=>'Accueil', 'cat1'=>'Catégorie 1', 'cat2'=>'Categorie 2', 'contact.html'=>'Contact', 'index.html'=>false);
echo fildarianise($titres);

?>
 
WRInaute passionné
A mon tour de faire des modifs !

J'ai enlevé le </span> de la 1ere déclaration de $retour et le rajoute en après la boucle.

Dans le tableau associatif, j'ai remplacé les extensions .html par .php, puisque on utilise un script PHP.

Code:
<?php

// Fonction fildarianise
function fildarianise(&$titres, $separateur=' > ')
{
   /*
   * $titres est un tableau associatif du genre :
   * $titres = array(0=>'Accueil', 'cat1'=>'Catégorie 1', 'cat2'=>'Categorie 2', 'contact.html'=>'Contact', 'index.html'=>false);
   */

   $baseUrl = 'http://'.$_SERVER['HTTP_HOST'];
   $retour = '<span class="ariane"><a href=' . $baseUrl . '>' . $titres[0] . '</a>';
   $chemin = explode("/", substr($_SERVER['PHP_SELF'], 1));
   
   if (is_array($chemin)) foreach ($chemin as $k=>$v) if ($titres[$v] !== false)
   {
      $baseUrl .= "/$v";
      $titre = isset($titres[$v]) ? $titres[$v] : $v;
      $retour .= $separateur . '<a href=' . $baseUrl . '>' . $titre . '</a>';   
   }
   $retour .= '</span>';
   return $retour;
}

// Un essai...
$titres = array(0=>'accueil', 'cat1'=>'Catégorie 1', 'cat2'=>'Categorie 2', 'contact.php'=>'Contact', 'index.php'=>false);
echo fildarianise($titres);

?>
 
WRInaute passionné
Merci à fbParis et à le ster et à Cayus pour leur contribution !
Je trouve ce script très interessant pour les sites HTML. La définition du tableau $titres est un peu fastidieux, mais c'est vraiment sympa.
 
Nouveau WRInaute
script inopérant avec includes

Bonjour à tous,
Débutant en php, je suis très heureux d'avoir lu le fil de votre discussion sur la réalisation d'un chemin de fer (ou fil d'ariane ou breadscrumb).
J'ai donc essayé d'abord de le comprendre...ca peut aller ^^
Mais mon site est basé sur un système d'includes de la page centrale. Aussi, je n'arrive pas à faire apparaître correctement le fil d'ariane.
Voici un extrait de mon fichier include :
Code:
<?php
// Ici on indique les noms de lien associés au titre qui va s'incrire dans la barre du navigateur...
$titre_pages = array(
'contact' => 'contactez Meuble en Ligne'
);

// Ici sont indiqués les noms de liens associés à l'URL relative de chaque fichier correspondant...
$url_pages = array(
'contact' => 'contact.html'
);

if(!empty($_GET['p']))
{
	if(array_key_exists($_GET['p'], $url_pages))
	{
		$page = $url_pages[$_GET['p']];
		$titre = $titre_pages[$_GET['p']];
	}
	else
	{
		$page = 'erreur.html';
		$titre = 'En cours de réalisation';
	}
}
else
{
$page = 'accueil.html';
$titre = 'Accueil';
}
?>
Et dans mon index.php, je n'ai plus qu'à afficher :
Code:
<?php include($page) ?>
Il faudrait donc que je puisse adapter ce script à mon système d'includes, sachant que je peux parfois avoir des pages du style : http://www.example.com/index.php?p=meub ... ntemporain
Comment récupérer "meubles" et "contemporain"...
Merci à vous de me guider, sans oublier que je débute ;)
Cordialement,
ratdelabo




edit dd32 : example.com pour les exemples d'url merci ;)
 
Nouveau WRInaute
Bonjour à tous,
Je sais que ce post est très ancien mais c'est un des meilleur sur les fil d'ariane que j'ai trouvé.

Voila mon problème. Je suis en train de créer un site internet assez gros pour me faire la main en php.
J'ai mis en place la fonction fil d'ariane de MagicYoyo comme défini dans les post précédent.

Code:
function fildarianise(&$titres, $separateur='&nbsp;&nbsp;&nbsp;>&nbsp;&nbsp;&nbsp;')
{
   $baseUrl = 'http://'.$_SERVER['HTTP_HOST'];
   $retour = '<span>Vous &ecirc;tes ici :&nbsp;&nbsp;&nbsp;</span><span><a href="' . $baseUrl . '">' . $titres[0] . '</a>';
   $chemin = explode("/", substr($_SERVER['PHP_SELF'], 1));
   
   if (is_array($chemin)) foreach ($chemin as $k=>$v) if ($titres[$v] !== false)
   {
      $baseUrl .= "/$v";
      $titre = isset($titres[$v]) ? $titres[$v] : $v;
      $retour .= $separateur . '<a href="' . $baseUrl . '">' . $titre . '</a>';   
   }
   $retour .= '</span>';
   return $retour;
}

$titres = array(
	0=>'<div class="icone_accueil">&nbsp;</div>', 
	'equipage_pirate_one_piece.php?spoiler=oui'=>'Les pirates oui',
	'equipage_pirate_one_piece.php?spoiler=non'=>'Les pirates non',
	'index.php'=>false);
echo fildarianise($titres);
?>

Le problème c'est que pour certaines de mes pages, j'ai l'url qui va changer en fonction de diverses variables intégrés dans l'url comme par ex "equipage_pirate_one_piece.php?spoiler=oui".
Et la fonction ne prend pas en compte le changement d'url.
Je me dit que c'est parce que la variable $titre ne prend pas en compte l'url exacte mais j'en sais trop rien en fait.
Je fait divers tests de modification de la fonction mais comme ça ne fait pas longtemps que je me suis mis au PHP je teste un peu au hasard.
Pouvez-vous m'aider à résoudre ce problème svp ?

Merci d'avance
 
WRInaute accro
Site internet "assez gros" sans base pour gérer le contenu ?
La fonction qui a été écrite en 2005 était faite pour des sites html (donc sans base de contenu), il est beaucoup plus simple de partir de la base de données, non ?
 
Nouveau WRInaute
Bien sur que j'ai une base de données.
Pour un code propre et des mises à jour facile c'est essentiel.
J'ai pas fait attention que la fonction concernait seulement des sites html sans bdd.

Après je ne sais pas comment marche un fil d'ariane avec base de données. Je vais regarder dans ce sens.
Peux-tu juste m'indiquer une direction à prendre ou un point à regarder plus précisément.

Voila le site en question. http://www.manga-onepiece.com
Après mon but est d'apprendre. Je me doute qu'il est loin d'être parfait mais je me dois de m'améliorer et faire un site aussi ambitieux (pour moi) est le meilleur moyen de toucher à tout et de m'améliorer.
J'ai fini mes études il y a 6 mois et mon boulot me demande des connaissances que je ne possède pas encore. Je bosse donc en dehors pour combler mes lacunes.

Merci de ton aide rapide en tout cas.
 
WRInaute accro
C'est "simple", ta base de données structure normalement tes contenus, en leur assignant une place dans le menu, non ?
Donc c'est ces données là qu'il faut reprendre, pour générer ton fil d'ariane. Après tout dépend de la façon dont tu structures ta base
 
WRInaute accro
Kerlon a dit:
Je sais que ce post est très ancien mais c'est un des meilleur sur les fil d'ariane que j'ai trouvé.
Pourtant c'est loin d'être le meilleur, un breadcrumb c'est sémantiquement mieux des <ul><li> imbriqués.

Code:
<div id="fil">
<ul>
    <li class="first">Accueil
    <ul>
        <li>&#187; Produits
        <ul>
            <li>&#187; Ordinateurs
            <ul>
                <li>&#187; Logiciels</li>
            </ul></li>
        </ul></li>
    </ul></li>
</ul>
</div>
Source: http://www.pompage.net/pompe/listes/
 
WRInaute accro
Excuses moi, mais pourquoi imbriquer les ul de cette façon ? Ca me parait totalement injustifié, une simple liste est largement suffisante pour un fil d'ariane, non ?
 
WRInaute accro
Etant donné que le breadcrumb représente une hierarchie, les listes imbriquées semblent convenir le mieux (cfr. article pompage). Sans le CSS, on voit très bien la hierarchie.
 
WRInaute accro
Euh... je ne voudrais pas insister lourdement, mais il me semble que c'est une surcharge de marquage totalement inutile. L'article emploie d'ailleurs le conditionnel
Si vous vouliez vraiment avoir un balisage significatif

En plus, il n'est pas évident de dire que le fil d'ariane est une hiérarchie. C'est un chemin, et quand on donne un itinéraire de A à B, la première et la deuxième rue ne sont pas hiérarchisée.

Bref, sur ce coup là, je suis partisane du faire simple ^^
 
Nouveau WRInaute
Je crois qu'il faut que j'améliore ma bdd car ma base de données structure les contenus mais leur assigne pas une place dans le menu automatiquement.
La hiérarchisation des données se fait par les relations entre les tables. Sur le coup j'ai pas plus approfondi.
Par exemples un personnages aura comme parent un équipage.

Donc le but serai d'indiquer dans la bdd la catégorie parente de chaque partie du site si j'ai bien tout compris...?
 
Nouveau WRInaute
J'ai donc fait un nouveau fil d'ariane avec appel de mes pages via base de données.
J'ai réussi à tout faire afficher mais le pb c'est que ça s'affiche à l'envers. Vu le code c'est normal mais je sais pas comment inverser les données récoltés. Voici mon code

Code:
while($numero_page !=1){
	$req_fil_ariane = "SELECT * FROM fil_ariane WHERE id_page = ".$numero_page;
	$result_fil_ariane = mysql_query($req_fil_ariane); 
	$donnee_fil_ariane = mysql_fetch_assoc($result_fil_ariane); ?>
    
	&nbsp;&nbsp;>&nbsp;&nbsp;<a href="<?php echo $donnee_fil_ariane['url_page'] ?> "><?php echo $donnee_fil_ariane['nom_page'] ?></a> <?php	
	$numero_page = $donnee_fil_ariane['id_page_parent'];
    
 }

$numero_page correspond a la page actuelle défini par cette variable.
Et la table "fil_ariane" contient 4 champs "id_page", "nom_page", "url_page" et "id_page_parent".

En clair ca m'affiche : "Catégorie enfant > Catégorie Parent > Index"

Et il faudrai que ce soit l'inverse. Pouvez-vous m'aidez svp ?
 
WRInaute accro
Je pense qu'il faut d'abord que tu stockes tes données dans un tableau (et donc toutes tes pages parents), avant de les afficher.
 
Discussions similaires
Haut