Page 1 sur 1

Probleme de tableau

Posté : 08 sept. 2006, 03:31
par lucluc
J'aimerai afficher un chemin de fer du type :
Accueil >> Page 1 >> Page 1-2 >> Page 1-2-1

Pour cela j'ai une table (pages) dans laquelle chaque page possede son id unique (Id_page), son nom (Nom_lien) ainsi que l'id de sa page parent (Id_parent)

Voici le script que j'ai réalisé :
fnction breadcrumb ($id_page)
{
$req_page = mysql_query("SELECT Nom_lien, Id_parent FROM pages WHERE Id_page='".$id_page."'") or die(mysql_error());
$tabl_result = mysql_fetch_array($req_page);
$nom_lien = $tabl_result['Nom_lien'];

$i = $tabl_result['Id_parent'];

while ($i != 0)
  {
   $req_parent = mysql_query(" SELECT Nom_lien, Id_parent FROM pages WHERE Id_page = '".$i."' ") or die(mysql_error());
  $tabl_result = mysql_fetch_array($req_parent);
  $nom_lien_parent = $tabl_result['Nom_lien'];
  $chemin_url = '<a href=\"#\">'.$nom_lien_parent.'</a> >> ';
  // Incrementation du compteur
  $i = $tabl_result['Id_parent'];
  echo $chemin_url;
  } 
}
La boucle while fonctionne bien sauf que les résultats s'affichent sous cette forme.
Page 1-2-1 >> Page 1-2 >> Page 1 >> Accueil
A l'envers... normal en partant de l'id le plus élévé... (et puis je prense que preg_replace() ne peut rien pour moi)

J'ai tenté de remplacer ma variable $chemin_url par un tableau
  $tab []= array("nom_lien" => "<a href=\"#\">".$nom_lien_parent."</a> >> ", "id_parent" => $tabl_result['Id_parent']);
Mais arrivé là je cale! Je n'arrive ni a interpreter les resultats, ni a les afficher dans l'ordre

Posté : 08 sept. 2006, 04:26
par SAEVEAS
La boucle while fonctionne bien sauf que les résultats s'affichent sous cette forme.
Page 1-2-1 >> Page 1-2 >> Page 1 >> Accueil
A l'envers... normal en partant de l'id le plus élévé... (et puis je prense que preg_replace() ne peut rien pour moi)
Tu peux utiliser la fonction array_reverse() pour inverser l'ordre de ton tableau ;)

Posté : 08 sept. 2006, 09:07
par sadeq
Effectivement, au lieu de mémoriser dans une chaine et l'afficher dans la boucle while, tu aurais dù mémoriser dans un simple tableau à 1 dimension et une fois sorti de la boucle while tu fais un array_reverse() pour inverser le tableau et en suite tu l'affiches.

Exemple :
<?php
$i = 10;
while ( $i >= 1) 
  { 
     $tableau[] = "valeur $i"; //remplir le tableau de 10 à 1
     $i--;
  }  
$tableau = array_reverse($tableau); //inversion du tableau
echo implode(" >> " , $tableau); //afficher le tableau sous forme de chaine dont les valeurs sont séparées par >>

?>

Posté : 09 sept. 2006, 11:47
par lucluc
Formidable, merci à vous deux.

Posté : 11 sept. 2006, 15:13
par lucluc
Je donne mon bout de script, il interressera peut etre quelqu'un.

Je me base sur une table pages qui contient, entre autre le nom de la page et le nom du fichier ( <a href="nom du fichier">nom de la page</a> ) l'identifiant de la page, de son dossier et de sa page parent.
|-----------|--------------|---------------|--------------|------------| ... |
| Id_page | Nom_page | Nom_fichier | Id_dossier |Id_parent | ... |
|-----------|--------------|---------------|--------------|------------| ... |
L'index du site a pour id:1 et pour id_parent:0

Dans le "breabcrumb", seule les pages parentes s'affichent comme en hyperlien.
// Creation du "breadcrumb" (chemin de fer ou fil d'ariane)
function breadcrumb ($id_page)
{
// Si la page est l'index du site, on affiche "Accueil"
if ( $id_page <= 1) 
  {
  echo 'Position&nbsp;:&nbsp;&nbsp;<i>Accueil</i>';
  }
// Sinon on recupere les infos de la page courrante
else 
  {
  $sql_page = mysql_query("SELECT Nom_page, Id_dossier, Id_parent FROM pages WHERE Id_page='".$id_page."'") or die(mysql_error());
  $req_page = mysql_fetch_array($sql_page);
  $nom_page_courrante = ' >> <i>'.$req_page['Nom_page'].'</i>';
  $id_dossier = $req_page['Id_dossier'];
  $i = $req_page['Id_parent'];
  $retour = '';
  // Tant que la page n'est pas l'index du site
  while ($i != 0) 
    {
    // on récupère les informations de la page parent dans la DB
    $sql_parent = mysql_query(" SELECT Nom_page, Nom_fichier, Id_dossier, Id_parent FROM pages WHERE  Id_page = '".$i."' ") or die(mysql_error());
    $req_parent = mysql_fetch_array($sql_parent);
    $nom_page_parent = $req_parent['Nom_page'];
    $nom_fichier = $req_parent['Nom_fichier'].'.php';
	$id_parent = $req_parent['Id_parent'];
    $id_dossier_parent = $req_parent['Id_dossier'];
	// Si la page et son parent sont dans le meme dossier on ne modifie pas le chemin
	if ($id_dossier == $id_dossier_parent) { $retour .= ''; }
	// Sinon on place " ../ " devant le nom du fichier
	else { $retour .= '../'; }
	$tab_page [] = "<a href=\"".$retour.$nom_fichier."\">".$nom_page_parent."</a>";
    // On incremente le compteur
    $i = $id_parent;
    }
  // Recuperation des valeurs
  $tab_result = array_reverse($tab_page);
  // Construction du chemin de fer
  $chemin_lien = implode(" >> " , $tab_result);
  // Affichage
  echo 'Position&nbsp;:&nbsp;&nbsp;'.$chemin_lien.$nom_page_courrante;
  }
}
Ensuite dans les pages du site placer
breadcrumb($id_page)
L'ideal etant de placer le code de la fonction dans un fichier à inclure (mesfonctions.php), ce qui donnera
$id_page= ... ;
include ("mesfonctions.php");
breadcrumb($id_page);
?>