navigation hiérarchique textuelle

Laurent1
Invité n'ayant pas de compte PHPfrance

18 juil. 2005, 19:28

bonjour,


Comment allez-vous?

Je souhaiterais savoir comment fait-on pour réaliser une navigation textuelle hiérarchique qui permet de savoir où on se situe par rapport à notre navigation, c'est à dire que plus on va loin dans la hiérarchie et plus la navigation est longue permettant ainsi de remonter d'un niveau dans la navigation , EXEMPLE :

Accueil > Catégorie1 > Rubrique1 > Sous rubrique1 > ...


En plus ,"Accueil","Catégorie1","Rubrique1" sont tous des liens internet me permettant de revenir sur mes pas. On trouve ce genre de navigation dans les forums par exemple PHPBB ou sur votre forum avec :


PHPFrance Index du Forum -> Débuter en PHP -> ...

je ne sais pas comment faire ni par où commencer.

Si quelqu'un pourrait m'aider de façon claire car je suis débutant, je vous remercie par avance de votre patience et de votre aide.

Laurent1 (j'attends avec impatience votre réponse,merci encore !!)

Mammouth du PHP | 19672 Messages

19 juil. 2005, 08:20

Principe très sommaire pour une méthode possible :

tous tes menus sont dans une base de données, comme le contenu des pages du reste. Il ta faudrait une table "menu" qui contient entre autres informations le lien lui-même et un champ indiquant le lien parent.

- Donc par exemple, un ligne dans ta table indique le lien "sous-rubrique 1" et le lie parent "rubrique 2".
- La ligne ou menu est "rubrique 2" a dans le champ lien parent "catégorie 1". La ligne du lien "categorie 1" indique dans le lien parent "Accueil".
- La ligne "Accueil" a un champ "lien parent" avec la veleur "NULL" puisque il n'y a pas de page avant ce niveau.

Donc en affichant n'importe quelle page, tu récupère avec une boucle récursive la suite des liens qui mènent de la page Accueil jusqu'au lien de cette page toutes les pages intermédiaire avec une requête SQL et une auto-jointure (jointure d'une table sur elle-même)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Laurent1
Invité n'ayant pas de compte PHPfrance

19 juil. 2005, 09:37

merci Cyrano pour ta réponse rapide MAIS je suis complètement perdu...excuse moi, je suis vraiment débutant.


Oki, il faut créer une table "menu" contenant deux champs ? comme cela ?
CREATE TABLE (
lien_actuel VARCHAR (100),
lien_parent VARCHAR (100)
)

1/ Dois-je créer une clé-primaire et si c'est le cas,sur quel champ ?

2/ Lorsque je remplis ces champs de lien,quel est le format que je dois adopter? Est-ce :

http://www.nomDoamine.com/sous_rubrique.php (chemin absolu) ?

ou bien ../index.php ou /description/sous_sous_rubrique.php ? (chemin relatif)


3/ Et c'est quoi cette boucle récursive avec une auto-jointure dont tu me parles ?? C'est à dire,comment faire pour afficher cette navigation hiérarchique ?

4/ Et sur quelle page dois-je insérer ce code SACHANT que j'utilise des include ( include "menu.php"; ) sur ma page index.php et que j'affiche les autres pages en utilisant des variables passés dans l'URL du style index?page=forum...



Je suis un peu perdu,je sais pertinemment que tu es très débordé dans ton travail mais pourais-tu me guider un peu plus s'il te plaît ?


J'ai vraiment besoin de cette naviagation pour la réalisation de mon projet.


Je te remercie par avance de ton aide précieuse.


Laurent1

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

19 juil. 2005, 10:47

Ce sujet a déjà été traité (et résolu) :

http://www.phpfrance.com/forums/voir_su ... +++fer.php
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 19672 Messages

19 juil. 2005, 10:55

Pour travailler avec des clés, ce qui sera effectivement plus simple, il te faut un total de 4 champs:
- un champ de clé primaire: id_lien INT NOT NULL Auto_increment;
- un champ clé étrangère: id_lien_parent INT NULL;
- Un champ titre lien: titre_lien VARCHAR(32);
- Un champ url du lien : url_lien VARCHAR(255);

Quand tu ajoutes un lien, la clé primaire est automatique, donc tu n'as pas à l'ajouter, mais tu rajoutes le titre et l'url correspondante. Si ce lien n'est pas la page d'accueil, tu dois récupérer la clé primaire da la page supérieure.

Si donc on dit que la ligne accueil correspond à la clé primaire "1", la ligne "Categorie 1" aura par exemple la clé primaire "2" et en clé étrangère la clé primiare de la page supérieure, donc de "Accueil" qui est "1". Mais la page "Rubrique 3" avec la clé primaire "12" aura en clé étrangère "2" correspondant à la "Catégorie 1" dont elle descend directement.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

19 juil. 2005, 11:37

Heu...sans BDD c'est possible aussi :)
http://blog.alsacreations.com/billets/n ... /index.php

Puisque personne ne m'écoute, je me barre...
Modifié en dernier par mere-teresa le 19 juil. 2005, 11:52, modifié 1 fois.

Laurent1
Invité n'ayant pas de compte PHPfrance

19 juil. 2005, 11:49

j'ai un peu compris ton raisonnement :


Si donc on dit que la ligne accueil correspond à la clé primaire "1", la ligne "Categorie 1" aura par exemple la clé primaire "2" et en clé étrangère la clé primiare de la page supérieure, donc de "Accueil" qui est "1". Mais la page "Rubrique 3" avec la clé primaire "12" aura en clé étrangère "2" correspondant à la "Catégorie 1" dont elle descend directement


1/ MAIS alors après avoir rempli mes différents sous-rubriques dans ma table,j'ai constaté que j'ai oublié la Catégorie3 ( qui est au meme niveau que Catégorie1 )et pourtant j'en suis à l'enregistrement 25 car mon champ id_lien est auto_incrémenté, il faudrait que je donne 25 au champs id_lien_parent pour les sous-rubriques issus de cette Catégorie3 alors ?

2/ Ensuite, comment faire s'il te plaît pour afficher la navigation hiérarchique une fois que j'ai rempli dans ma table Mysql tous les liens concernés ?


Laurent1

Laurent1
Invité n'ayant pas de compte PHPfrance

19 juil. 2005, 12:02

salut Mère-Térésa,


je connais déjà ce lien mais :


il faut que les cookies soient actifs pour que l'Historique de Navigation fonctionne


C'est pourquoi j'ai opté pour la solution de Cyrano d'autant PLUS qu'il s'est donné du mal pour m'expliquer clairement et je le remercie d'ailleurs !!


Laurent1

Mammouth du PHP | 19672 Messages

19 juil. 2005, 12:08

2/ Ensuite, comment faire s'il te plaît pour afficher la navigation hiérarchique une fois que j'ai rempli dans ma table Mysql tous les liens concernés ?
Je crois que la réponse à cette question va couvrir les deux : en récupérant le lien parent, tu récupère également la clé étrangère de ce lien parent et tu peux donc avoir le lien "grand-parent" etc... Donc tu peux reconstruire assez facilement la hiérarchie.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Laurent1
Invité n'ayant pas de compte PHPfrance

19 juil. 2005, 14:27

Cyrano,je n'arrive toujours pas à afficher la navigation hiérarchique, pourrais-tu s'il te plaît corriger mon code sachant ma base est "navigation" et ma table "menu" :


<?php

$connexion=mysqli_connect('localhost','root','','navigation');

$requete="SELECT menu1.titre_lien, menu2.titre_lien FROM menu menu1, menu menu2 WHERE menu1.id_lien=menu2.id_lien_parent";

$resultat=mysqli_query($connexion,$requete);

if($resultat){
$afficher=mysqli_fetch_assoc($resultat);
echo $afficher['titre_lien'], " > " ,$afficher['titre_lien'] ;

?>

Je ne sais pas trop si mon auto-jointure est bonne et ce qu'il faut récuperer dans la table pour afficher toute l'arborescence... je suis complètement perdu là...

Laurent1

Mammouth du PHP | 19672 Messages

19 juil. 2005, 15:16

Le problème est que tu demandes deux fois le même champ alors que tu cherches deux chmpas techniquement différents: aliase les champs et essaye comme ceci:
<?php

$connexion=mysqli_connect('localhost','root','','navigation');

$requete="SELECT menu1.titre_lien as titre1, menu2.titre_lien as titre2 FROM menu menu1, menu menu2 WHERE menu1.id_lien=menu2.id_lien_parent";

$resultat=mysqli_query($connexion,$requete);

if($resultat)
{
    $afficher=mysqli_fetch_assoc($resultat);
    echo $afficher['titre2'], " > " ,$afficher['titre1'] ;
}
?>
Note : utilises ">" au lieu de ">" pour éviter des surprises avec les balises de lien lors de l'affichage.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Laurent1
Invité n'ayant pas de compte PHPfrance

19 juil. 2005, 16:33

Cyrano,


J'ai mis les liens sur ton dernier code, c'est cela qu'il fallait faire ou pas du tout?

<?php
 
$connexion=mysqli_connect('localhost','root','','navigation'); 

$requete="SELECT menu1.titre_lien as titre1, menu1.url_lien as lien1, menu2.titre_lien as titre2, menu2.url_lien as lien2, menu3.titre_lien as titre3, menu3.url_lien as lien3 FROM menu menu1, menu menu2, menu menu3 WHERE menu1.id_lien=menu2.id_lien_parent AND menu2.id_lien=menu3.id_lien_parent"; 

$resultat=mysqli_query($connexion,$requete); 

if($resultat) 
{ 
    $afficher=mysqli_fetch_assoc($resultat); 
    echo "<a href=\"".$afficher['lien1']."\">".$afficher['titre1']."</a>"." > "."<a href=\"".$afficher['lien2']."\">".$afficher['titre2']."</a>"." > "."<a href=\"".$afficher['lien3']."\">".$afficher['titre3']."</a>" ; 
} 

?>

1/ Si mon site doit avoir,on va dire 10 sous-rubriques, il faudrait que dans la requete SQL lors de mon auto-jointure que je crée 10 alias de table,c cela?

2/ Par ailleurs, si je recopie le meme morceau de code comportant les 10 sous-rubriques de la requete sur toute mes pages, j'aurai alors la même navigation hiérarchique sur toutes mes pages.

Or je souhaiterais seulement afficher (si je suis à la sous-rubrique 5)l'arborescence de Accueil jusqu'à 5 et non pas l'arborescence complète de Accueil à sous-rubrique 10 !!!
Je ne sais pas trop si je me suis bien exprimé... :lol:

Quie dois-je faire s'il te plaît?


Laurent1

Mammouth du PHP | 19672 Messages

19 juil. 2005, 17:52

Non, rien de tout ça. Le principe de cette requête, c'est de récupérer les liens classés hiérarchiquement. Ensuite tu mets tout ça dans un tableau.

Mais ce que tu dois faire au préalable, c'est imaginer la manière de faire ta requête à partir de la page en cours parce que tu ne veux pas tous les liens mais ceux en rapport direct avec la page en cours. Ce n'est pas LA solution que je t'ai donné mais la manière sommaire d'y parvenir. Tout ce qui te manque, c'est de la logique et ça, personne ne peut t'en donner.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: