[Résolut] Système de menu vertical déroulant automatique

Mammouth du PHP | 19672 Messages

14 sept. 2011, 07:21

Il faut bien comprendre un truc : ce que tu prends pour des doublons est rien de moins que normal parce que ce ne sont pas des doublons : il y a deux fois menu 1, normal, tu as autant de fois menu 1 qu'il y a de sous-menus qui s'y rattachent, ici 2 sous menus. Il n'y a donc pas lieu de les retirer.

Par contre ça va t'obliger à un effort intellectuel minimum pour construire ton menu de navigation sans répéter le titre de ton menu 1. Je n'en dirai pas davantage pour le moment, je te laisse y penser et faire des essais : encore une fois, il va te falloir de la logique et tu vas réaliser qu'en fin de compte, c'est très simple.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 07:35

Je pense en fait que l’énoncé est:

J'ai plusieurs Menu attaché à SousMenu, je dois afficher les SousMenu et leur Menu parent, sans pour autant afficher plusieurs fois les Menu.

je ne vois pas comment translittérer la condition, pour que je puisse mieux comprendre comment ça fonctionne.

Je vais voir comment agencer des menus simples, et je vais essayer d'y rajouter la clause des multiples Menu.

Peux tu me donner un indice afin de m'aider à comprendre stp, sans pour autant le faire, c'est vrai que j'ai pas mal appris du fait de ta façon de m'expliquer.

Merci

Ps: en fait, j'essaye de faire comme en maths à l'époque, lorsqu’on avais un problème, mais ça fait longtemps ^^.

Mammouth du PHP | 19672 Messages

14 sept. 2011, 07:45

Ça fait très longtemps pour moi aussi ;)

Comment vas-tu traiter les données recueillies ? Dans une boucle. Or à chaque tour de boucle, tu vas avoir le sous-menu bien entendu, mais éventuellement une nouvelle fois un menu déjà traité dans le tour précédent, il faudrait donc pouvoir traiter le sous-menu en sautant le menu-parent déjà traité une fois. Tu vas donc avoir besoin de mettre en place un point de repère avant même de commencer le traitement et ajuster ce point de repère à chaque tour. Mijote un peu ça en te demandant qu'est-ce que tu pourrais utiliser comme point de repère...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 07:53

je pense que ça dois être un repaire du style $=0;

Sauf que ici on mettrais comme repaire $menu='',

et une fois dans la boucle on initialise $menu par $result['Menu'].

Mais c'est dans l'idée, je ne vois que ça comme repaire, en fait je connais que ça ^^

je vais essayer

Suis-je sur la bonne voie?

Merci

Mammouth du PHP | 19672 Messages

14 sept. 2011, 07:58

Fais déjà des essais et vois si le résultat correspond à ce que tu veux obtenir, je ne vais pas tout te mâcher d'avance, ce serait trop simple et tu n'y apprendrais certainement pas autant. :roll:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 08:13

En fait il me manque je pense, le fait de savoir combien de Menu existe dans la table Menu.

Je pense que ça devrais aider pour avancer non? (mais ça je vois pas comment faire, mis à part refaire la requête)

Sans quoi, le fait de faire ce que j'ai dit plus haut est caduque, car ça reviens au même ^^, a moins que comme d'habitude, je sois tellement quiche que j'ai mal vu ce que je pouvais faire, vivement que j'y arrive, mais bon, déjà il y a de l'avancement, même si je galère ^^.

Merci

Mammouth du PHP | 19672 Messages

14 sept. 2011, 08:21

Commence par la fin : à quoi doit ressembler le code de ton menu une fois que tu auras terminé ? Tu y verras des constantes dans la structure, donc quelque chose de mathématique que tu peux justement traiter de façon logique par programmation.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 08:31

Le code faut qu'il affiche:

Code : Tout sélectionner

Menu 1 SousMenu 1 Menu 1 SousMenu 2 Menu 1 SousMenu 3 Menu 1 ...... Menu 2 SousMenu 1 Menu 1 SousMenu 2 Menu 1 ...... Menu 3 ......
Les ..... disant qu'il affiche autant de SousMenu qu'il en existe, mais seulement une fois les Menus.

Après niveau maths, franchement je suis pas le genre de gars qui serais expliquer à un élève de CM2 comment faire ses cours de maths.

J'ai vraiment oublier le peu que j'avais oublier, c'est certainement ça qui me donne du fil à retordre sans ce code ^^

Mammouth du PHP | 19672 Messages

14 sept. 2011, 08:39

Réfléchis un peu : à chaque tour de boucle, tu as l'information sur le menu et sur le sous-menu.

À chaque tour : dois-tu ou non afficher le menu ? Il faut en être certain. Comment en être certain ? Tu peux parfaitement initialiser une variable qui va te servir de point de repère. Avant la boucle, tu lui affectes la valeur « null » : à chaque tour, tu la compares avec une des valeurs de ta ligne de données te permettant d'identifier le menu. S'il y a différence, alors c'est que ce menu n'a pas été traité, donc tu l'affiche et tu mets à jour ton point de repère. Que va-t-il se passer au tour suivant : la même chose, comparaison entre ton identifiant et le point de repère : s'il y a correspondance, tu saute les informations sur le menu et tu ne traites que le sous-menu...

Je ne te donne pas tous les petits détails, mais schématiquement, tu devrais t'y retrouver, essaye de visualiser la logique générale et fais des essais.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 08:46

j'y vois déjà mieux ce que je dois faire, je vais tester.

Merci ^^

Eléphant du PHP | 418 Messages

14 sept. 2011, 09:00

J'ai réussit je pense

J'ai suivit à la lettre ce que tu m'as dit

Vois le résultat obtenu:

Code : Tout sélectionner

Menu 1 testmenu 2 testmenu 1 Menu 2 testmenu 1 Menu 3
Voici mes condition utilisées.

Peux être il y a une erreur, peux être peut on l'optimsée, mais elle fonctionne en état:
	$sql = "SELECT * FROM `Menu` AS p LEFT OUTER JOIN `SousMenu` AS t ON p.Id = t.MenuId ORDER BY p.Id, t.Id DESC;";
	$res = mysql_query($sql);
	$menu=NULL;
	while ($result = mysql_fetch_assoc ($res))
	{
		if ($menu!=$result['Menu'])
		{
			$menu = $result['Menu'];
			echo $menu.'<br />';
		}
		if ($menu==$result['Menu'])
		{
			if ($menu==$result['MenuMenu'])
			{
				echo $result['SousMenu'].'<br />';
			}
		}
	}
?>
En tout cas, MERCI c'est super sympa de ta part d'avoir pris le temps de m'aider.

Merci

Mammouth du PHP | 19672 Messages

14 sept. 2011, 09:11

Le début est très bien, le point de repère est là, et le premier if() dans la boucle WHILE tout à fait à sa place.

Mais le second if() avec un autre if() imbriqué a moins de sens : tous les sous-menus sont différents, et si tu as bien mis la clause ORDER BY, tu sais que le sous-menu est bien rattaché au menu en cours, donc... :roll:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 09:15

Oups, oui, c'est vrai, pas encore pris l’habitude de ce genre de requête.

donc... on n'en met pas, et on peux ainsi les afficher sereinement ^^.

Code : Tout sélectionner

Menu 1 - testmenu 2 - testmenu 1 Menu 2 - testmenu 1 Menu 3 -
EDIT:

J'ai rajouter dans la dernière condition, afin de n'afficher les futures <ul> que si il y a un SousMenu.

			if (isset($result['SousMenu']))
			{
				$sousmenu=$result['SousMenu'];
				echo '<ul><li>'.$sousmenu.'</li></ul>';
			}
Ca donne:

Code : Tout sélectionner

Menu 1 - testmenu 2 - testmenu 1 Menu 2 - testmenu 1 Menu 3
Modifié en dernier par Fre3z69 le 14 sept. 2011, 09:21, modifié 1 fois.

Mammouth du PHP | 19672 Messages

14 sept. 2011, 09:20

ça ne répond pas tout à fait à la question. par ailleurs, quand tu arrives au menu 3, il se trouve que tu n'as pas de sous-menu, donc ton second if devrait tester autre chose. Tu devrais explorer la doc sur is_null()
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 418 Messages

14 sept. 2011, 09:47

j'y comprend rien, on l'agence comment??

Dans une condition comme isset() ou autrement?