Stocker un nombre de sous niveaux variables

IkariWarrior
Invité n'ayant pas de compte PHPfrance

06 août 2005, 17:33

Bonjour tout le monde !!

Alors attention problème ardu...

Je suis en train de créer un site marchand, et chaque objet est repertorié dans un rayon. Jusque là rien de compliqué. Le problème est que chaque rayon possède un nombre indeterminé de sous rayons. Par exemple, j'ai cette structure :

Code : Tout sélectionner

CD + Rock +- Metal +- Pop _+- Brit Pop _+- Variété française +- Rock and roll + Rap + Techno _+- House _+- Garage
Il faut pouvoir ajouter et retirer facilement une sous-catégorie...

Conceptuellement, je ne vois pas du tout comment faire et je suis bien embêté... J'ai pensé stocker un chemin sous forme de tableau dans un champs de ma BDD, mais je viens de lire sur ce site que faire ça signifie qu'il y a une erreur de conception de la BDD...

Quelqu'un peut m'aider je suis un peu perdu là :(

Merci !!

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

06 août 2005, 17:52

La structure :
Table RAYONS
- rayon_id : numéro identifiant auto-incrémenté
- rayon_nom : libellé
- rayon_niveau : niveau du sous-rayon
- rayon_père : rayon_id du rayon père
Les données :
1  CD        1     NULL
2  Rock      2     1
3  Metal     2     1
4  Pop       2     1
5  Brit-Pop  3     4
6 ...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

09 août 2005, 13:42

Alors ?... :?:

IkariWarrior
Invité n'ayant pas de compte PHPfrance

10 août 2005, 13:03

J'ai essayé pas mal de script pour accéder à mes objets avec cette technique puisqu'en fait c'est celle à laquelle j'avais pensé au départ, mais c'est dur dur de scripter ça...

En fait je vois pas trop comment...

Et je peux même aller plus loin, ça fait trois jours que j'essaie d'apprendre le foreach (qui je pense est indispensable ici...) mais IMPOSSIBLE DE COMPRENDRE :oops:

Vraiment le foreach j'y arrive pas.

Invité
Invité n'ayant pas de compte PHPfrance

12 août 2005, 16:37

Hello !!

Je reviens vers vous (en ce moment décisif, comme dirait un vieux pote...) car j'essaie en vain avec ce système de retracer le chemin pour parvenir à un objet.

Je n'arrive pas à conceptualiser la manière de faire pour réussir, en ayant un rayon_id qui est stocké dans la table des articles, à retracer le chemin...

J'ai essayé plusieurs solutions, faire une requête pour commencer par le dernier niveau puis tant que le rayon_père n'est pas null en faire une autre, etc... Mais ça ne marche pas...

J'ai essayé de rapatrier tous mes rayons et de faire un foreach (tant bien que mal) mais vu qu'il faut parcourir plusieurs fois le tableau j'ai pas réussi...

Bref, je patauge et si quelqu'un pouvait ml'aider, je lui en serai infiniment reconnaissant !!

Merci !

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

12 août 2005, 16:42

il faut parcourir plusieurs fois le tableau
Là, tu as pointé le doigt dessus ! Il te faut une fonction qui parcoure un tableau de façon récursive...qui va au plus profond du tableau = voir PHPDebutant
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

ViPHP
ViPHP | 1024 Messages

12 août 2005, 17:08

le + top est d'utiliser une représentation arborescente par intervalles :-"

http://sqlpro.developpez.com/cours/arborescence/

A+

Pascal

Eléphant du PHP | 199 Messages

12 août 2005, 18:32

La structure :
Table RAYONS
- rayon_id : numéro identifiant auto-incrémenté
- rayon_nom : libellé
- rayon_niveau : niveau du sous-rayon
- rayon_père : rayon_id du rayon père
Les données :
1  CD        1     NULL
2  Rock      2     1
3  Metal     2     1
4  Pop       2     1
5  Brit-Pop  3     4
6 ...
rayon_niveau n'est pas nécessaire, il suffit de chercher si il a un père ou nom :wink:
Les 2 font la paire : coder ET commenter :wink:

Invité
Invité n'ayant pas de compte PHPfrance

13 août 2005, 11:28

rayon_niveau n'est pas nécessaire, il suffit de chercher si il a un père ou nom :wink:
Je pense que si malhaureusement et je m'explique...

J'ai actuellement cette fonction récursive qui me determine le chemin jusqu'à un objet :

Code : Tout sélectionner

// Le chemin $id_niveau = $res['id_niveau']; $chemin = array(); $c = 0; $sql_chem = "SELECT niveaux_lg.niveau, niveaux.id_niveau, niveaux.niveau_parent FROM niveaux INNER JOIN niveaux_lg ON (niveaux.id_niveau = niveaux_lg.id_niveau) WHERE niveaux.id_rayon = '$id_rayon' AND niveaux_lg.id_lg = '$id_lg'"; $req_chem = mysql_query($sql_chem); // En récupérant la requête je créé un tableau while ($res_chem = mysql_fetch_array($req_chem)) { $chemins[$c]['nom'] = $res_chem['niveau']; $chemins[$c]['id'] = $res_chem['id_niveau']; $chemins[$c]['parent'] = $res_chem['niveau_parent']; $c++; } // Ma fonction récursive function look ($id, $chemins) { $i = 0; global $chemin; $chemin = array(); for ($c=sizeof($chemins)-1; $c >= 0; $c--) { // echo 'Je regarde le niveau '.$chemins[$c]['nom']; if ($chemins[$c]['id'] == $id) { // echo ' : c\'est celui que je cherche !!<br>'; $chemin[$i]['id'] = $chemins[$c]['id']; $chemin[$i]['nom'] = $chemins[$c]['nom']; $id = $chemins[$c]['parent']; $i++; } else { // echo '<br>'; } } if ($id == 0) { // echo 'Fin de la recherche'; return $chemin; } else { look ($id, $chemins); } } echo '<A HREF="rayon_'.$id_rayon.'_0.html">Rayon '.$res['rayon_lg'].'</A> <img src="img_interface/chevron.gif" width="13" height="7" /> '; for ($f = sizeof(look ($id_niveau, $chemins))-1; $f >= 0; $f--) { echo '<A HREF="rayon_'.$id_rayon.'_'.$chemin[$f]['id'].'.html">'.$chemin[$f]['nom'].'</A>'; if ($f != 0) { echo ' <img src="img_interface/chevron.gif" width="13" height="7" /> '; } }
Donc pour ceux qui ont la flemme de décortiquer la fonction, je créé un tableau qui contient tous les chemins possibles, puis je parcoure le nombre de fois nécessaire ce tableau pour determiner le chemin de mon article. J'ai donc un tableau qui contient n entrées sachant que 0 est le niveau dans lequel se situe mon objet et 1 le niveau sup, etc... Je n'ai plus qu'à inverser mon tableau et voilà mon chemin...

Attention : $chemins contient tous les chemins possibles et $chemin LE bon chemin. Les deux sont des tableaux, bien sûr.

Je suis assez content de ma fonction je pense qu'elle est optimisée (relativement) mais le problème c'est que je voudrais par exemple determiner pour tel niveau tous les objets contenus dans les niveaux inférieurs. Dans mon exemple, si j'accède au niveau Pop, je veux tous les CD dont le niveau est Pop mais aussi BritPop...

Vous voyez mon problème ? :p

Quelqu'un peut m'aider ?

Merci !