Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/12/2011, 19h50   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 19
Points : 3
Points : 3
Par défaut Casse tête Php, pour ceux qui aiment les problèmes de logique

Bonjour,

Je cherche à créer un menu hierarchisé pour mon site e-commerce dans lequel sont affiché les catégories des articles mis en ventes de manière dynamique afin que, si l'administrateur crée une nouvelle catégorie, celle ci apparaisse automatiquement dans le menu sans l'aide d'un developpeur.

Alors voila, j'ai des catégories de trois rangs différents.

Par exemple:
Premier rang: Informatique[id=1] mobilier[2] vêtements[3] Hifi ..
Deuxieme rang: Hardware[parent_key=1][id=10] software[parent_key=1][id=11] Hommes[parent_key=3][id=30] ..
Troisième rang: carte mère[parent_key=10][id=100] processeur[parent_key=10][id=101] Windows7[parent_key=11][id=110] chaussures[parent_key=30][id=300] ..

Voila, vous aurez compris que le parent key réfère à l'id de la catégorie mère/parente et que donc, pour chaque catégorie de niveau 1 il y a plusieurs catégories de niveau 2 et pour chaque catégories de niveau 2 il y en plusieurs de niveau 3

J'ai mis en place et hardcodé pour l'instant un menu de ce genre :
Code html :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<div id="main_menu">
		<ul id="nav">
			<li class="current"><a href="<?php echo base_url();?>">Home</a></li>
			<li><a href="#">Vêtements</a>
				<ul>
					<li><a href="#">Hommes</a>
						<ul>
							<li><a href="#">Chaussures</a></li>
							<li><a href="#">T-Shirt</a></li>
							<li><a href="#">Pantalon</a></li>
							<li><a href="#">Sous-Vêtements</a></li>
						</ul>
					</li>
					<li><a href="#">Femmes</a>
						<ul>
							<li><a href="#">Chaussures</a></li>
							<li><a href="#">T-Shirt</a></li>
							<li><a href="#">Pantalon</a></li>
							<li><a href="#">Sous-Vêtements</a></li>
						</ul>
					</li>
				</ul>
			</li>
			<li><a href="#">High Tech</a>
				<ul>
					<li><a href="#">Informatique</a>
						<ul>
							<li><a href="#">Hardware</a></li>
							<li><a href="#">Ecrans</a></li>
							<li><a href="#">Clavier</a></li>
							<li><a href="#">Souris</a></li>
							<li><a href="#">Imprimantes</a></li>
 
						</ul>
					</li>
					<li><a href="#">TV</a>
						<ul>
							<li><a href="#">LCD</a></li>
							<li><a href="#">Plasma</a></li>
							<li><a href="#">3D</a></li>
						</ul>
					</li>
					<li><a href="#">Appareils Photos</a></li>
					<li><a href="#">GPS</a></li>
					<li><a href="#">Smartphones</a></li>
					<li><a href="#">Lecteur MP3</a></li>
					<li><a href="#">Hi-Fi</a>
						<ul>
							<li><a href="#">Amplificateurs</a></li>
							<li><a href="#">Enceintes</a></li>
							<li><a href="#">Cables</a></li>
							<li><a href="#">Autres</a></li>
						</ul>
					</li>
				</ul>
			</li>
			<li><a href="#">Electroménager</a>
				<ul>
					<li><a href="#">Gros Electroménager</a>
						<ul>
							<li><a href="#">Machine à Vaisselle</a></li>
							<li><a href="#">Lave Vaisselle</a></li>
						</ul>
					</li>
					<li><a href="#">Petit Electroménager</a>
						<ul>
							<li><a href="#">Machine à Café</a></li>
							<li><a href="#">Grille Pain</a></li>
						</ul>
					</li>
				</ul>
			</li>
			<li><a href="#">Accessoires</a>
				<ul>
					<li><a href="#">Sèche Cheveux</a></li>
					<li><a href="#">Lisseur</a></li>
					<li><a href="#">Rallonges</a></li>
					<li><a href="#">Autres</a></li>
				</ul>
			</li>
			<li><a href="#">Loisirs</a>
				<ul>
					<li><a href="#">Voyages</a></li>
					<li><a href="#">Gadgets</a></li>
					<li><a href="#">Autres</a></li>
				</ul>
			</li>
			<li><a href="#">Livres</a>
				<ul>
					<li><a href="#">Policiers</a></li>
					<li><a href="#">Drames</a></li>
					<li><a href="#">Comédie</a></li>
					<li><a href="#">Roman</a></li>
					<li><a href="#">Histoire</a></li>
				</ul>
			</li>
		</ul>
 
 
		<br class="clear" />
	</div>
 
</div>

Je code en MVC, donc je ne sais pas trop ou ni comment dire dans le model quelque chose du genre GET*WHERE CAT_ORDER =1 puis pour chaque catégorie de rang 1 (cat_order=1 dans ma base) GET * WHERE CAT_ORDER =2 AND id = parent_key ou quelque chose du genre, j'avoue que question logique je m'y perd un peu, donc voila si ya des codeur/matheux qui kiffent se prendre un peu la tête, il seront les bienvenus pour m'aider J'imagine que je vais devoir faire des for each et des while mais bon .. jblok

Merci !

Dekker
dekker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 00h20   #2
Membre Expert
 
Avatar de Atomya Rise
 
Femme Emilie Lefol
En recherche d'emploi
Inscription : février 2009
Messages : 411
Détails du profil
Informations personnelles :
Nom : Femme Emilie Lefol
Âge : 26
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : En recherche d'emploi
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2009
Messages : 411
Points : 1 277
Points : 1 277
Au niveau php, as-tu déjà fait quelques choses ?

As-tu déjà la structure de ta table sql de définis ? Si oui, peux-tu nous mettre la structure s'il te plaît ?

Merci !
__________________

Si un message vous a aidé, pensez à voter positivement pour lui ! Merci
Pas de question technique en privé
- Si on criait sur la place publique les fautes de tout le monde, on ne pourrait plus fréquenter personne ! (Marcel Pagnol)
- Technocrates, c’est les mecs que, quand tu leur poses une question, une fois qu’ils ont fini de répondre, tu comprends plus la question que t’as posée. (Coluche)
Atomya Rise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 21h18   #3
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 29
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2006
Messages : 29
Points : 25
Points : 25
Par défaut il faut monter une fonction récursive...

Bonjour,

je fais peu de PHP mais plutôt de l'ASP (on ne refait pas !) mais j'ai résolu le même problème avec une fonction récursive :
en VB/ASP ça donne :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
<%function pages_UL(parent)
<blockquote>set a=getRS("select * from articles where art_type='P' and rub_id=" & parent &  " order by rub_pos")	
	if not a.eof then%></blockquote><ul>
  <%while not a.eof%>
  <li><blockquote><a href="?page=<%=a("art_id")%>"><%=a("art_titre")%></a>
<%pages_UL a("art_id")%>
</blockquote></li>
  <%a.movenext:wend%>
</ul>
<%end function%>
...remarquer l'appel à la fonction pages_UL dans pages_UL...

laurent
oxedet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 12h17   #4
Membre Expert
 
Avatar de Atomya Rise
 
Femme Emilie Lefol
En recherche d'emploi
Inscription : février 2009
Messages : 411
Détails du profil
Informations personnelles :
Nom : Femme Emilie Lefol
Âge : 26
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : En recherche d'emploi
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2009
Messages : 411
Points : 1 277
Points : 1 277
Alors, en php, j'ai une petite solution que je t'ai écrite rapidement...

En ce qui concerne la table sql :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `categorie` varchar(40) NOT NULL,
  `detail` varchar(40) NOT NULL,
  `lien` varchar(255) NOT NULL DEFAULT '#',
  `titre` varchar(40) NOT NULL,
  `position` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;
 
INSERT INTO `articles` (`id`, `categorie`, `detail`, `lien`, `titre`, `position`) VALUES
(1, 'Homme', 'Chaussures', '#', 'Vêtements', 1),
(2, 'Homme', 'T-Shirt', '#', 'Vêtements', 2),
(3, 'Homme', 'Pantalon', '#', 'Vêtements', 3),
(4, 'Homme', 'Sous-Vêtements', '#', 'Vêtements', 4),
(5, 'Femmes', 'Chaussures', '#', 'Vêtements', 5),
(6, 'Femmes', 'T-Shirt', '#', 'Vêtements', 6),
(7, 'Femmes', 'Pantalon', '#', 'Vêtements', 7),
(8, 'Femmes', 'Sous-Vêtements', '#', 'Vêtements', 8),
(9, 'Livres', 'Policiers', '#', '', 9),
(10, 'Livres', 'Drames', '#', '', 10),
(11, 'Livres', 'Comédie', '#', '', 11),
(12, 'Livres', 'Roman', '#', '', 12),
(13, 'Livres', 'Histoire', '#', '', 13);

Pour le code php :
Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// On sélectionne les titres de la table article qui sont distinct et on boucle le résultat
$req = mysql_query("SELECT DISTINCT titre FROM articles ORDER BY position ASC") or die (mysql_error());
while ($res = mysql_fetch_assoc($req)) {
 
	// On déclare la variable $titre qui comportera les titres généraux du menu
	$titre = $res["titre"];
 
	// Si il y a un titre général pour le menu, on ouvre ul et li
	if ($titre != "") {
		echo "<li><a href='#'>" . $titre . "</a>";
		echo "<ul>";
	}
 
	// On sélectionne les infos d'une catégorie distinct puis on boucle le résultat
	$req2 = mysql_query("SELECT DISTINCT categorie FROM articles WHERE titre = '" . $titre . "' ORDER BY position ASC") or die (mysql_error());
	while ($res2 = mysql_fetch_assoc($req2)) {
 
		// On affiche le titre de la catégorie / On ouvre li et ul
		echo "<li><a href='#'>" . $res2["categorie"] . "</a>";
		echo "<ul>";
 
		// On va construire notre tableau pour l'affichage des détails de cette catégorie pui on boucle le résultat pour obtenir les éléments de la catégorie
		$req3 = mysql_query("SELECT detail, lien FROM articles WHERE categorie = '" . $res2["categorie"] . "' ORDER BY position ASC") or die (mysql_error());		while ($res3 = mysql_fetch_assoc($req3))			
			echo "<li><a href='" . $res3["lien"] . "'>" . $res3["detail"] . "</a></li>";
 
		// On referme ul et li
		echo "</ul>";
		echo "</li>";
	}
 
	// Si il y a un titre général pour le menu, on ferme ul et li
	if ($titre != "") {
		echo "</ul>";
		echo "</li>";
	}
 
}

Voilà donc une solution... bien sur, c'est encore à travailler car d'une part, mon exemple est établi pour seulement une partie de ton menu, et d'autre part, j'utilise 3 requêtes mais en travaillant d'avantage, on peut en utiliser qu'une seule afin d'optimiser le code...
__________________

Si un message vous a aidé, pensez à voter positivement pour lui ! Merci
Pas de question technique en privé
- Si on criait sur la place publique les fautes de tout le monde, on ne pourrait plus fréquenter personne ! (Marcel Pagnol)
- Technocrates, c’est les mecs que, quand tu leur poses une question, une fois qu’ils ont fini de répondre, tu comprends plus la question que t’as posée. (Coluche)
Atomya Rise est déconnecté   Envoyer un message privé Réponse avec citation 21
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h39.


 
 
 
 
Partenaires

Hébergement Web