IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Casse tête Php, pour ceux qui aiment les problèmes de logique


Sujet :

Langage PHP

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 22
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre émérite Avatar de Atomya Rise
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Février 2009
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2009
    Messages : 443
    Par défaut
    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 !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 97
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <%function pages_UL(parent)
     
    <div style="margin-left:40px">set a=getRS("select * from articles where art_type='P' and rub_id=" & parent &  " order by rub_pos")	
    	if not a.eof then%></div><ul>
      <%while not a.eof%>
      <li>
    <div style="margin-left:40px"><a href="?page=<%=a("art_id")%>"><%=a("art_titre")%></a>
    <%pages_UL a("art_id")%></div></li>
      <%a.movenext:wend%>
    </ul>
    <%end function%>
    ...remarquer l'appel à la fonction pages_UL dans pages_UL...

    laurent

  4. #4
    Membre émérite Avatar de Atomya Rise
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Février 2009
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2009
    Messages : 443
    Par défaut
    Alors, en php, j'ai une petite solution que je t'ai écrite rapidement...

    En ce qui concerne la table sql :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

Discussions similaires

  1. Pour ceux qui aiment les vidéos stupides !
    Par Lyche dans le forum La taverne du Club : Humour et divers
    Réponses: 5
    Dernier message: 21/04/2011, 12h06
  2. Réponses: 5
    Dernier message: 31/08/2009, 10h46
  3. [TV] A voir pour ceux qui n'ont pas encore vu :p (Les lascars)
    Par Interruption13h dans le forum Films & TV
    Réponses: 7
    Dernier message: 26/06/2007, 15h29
  4. Réponses: 21
    Dernier message: 13/10/2006, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo