Bonsoir,
Je suis en train de faire un menu pour un site qui est rangé en 3 catégories :
Ce que je voudrais faire, c'est gérer dynamiquement ces 3 parties, qui sont respectivement parent l'une de l'autre.
Par exemple :
Hors, aujoud'hui j'ai quelque choses de différent qui apparaît à l'écran!!
Voilà ce que j'ai :
Et ainsi de suite...
Mon code est le suivant :
<?php
require "class/config.php";
mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
mysql_select_db(DB_BDD);
$sql="SELECT * FROM cdu AS p LEFT JOIN categorie AS c ON p.cat_id = c.cid LEFT JOIN chapitre AS k ON p.chap_id = k.cid LEFT JOIN famille AS f ON p.fam_id = f.cid" ;
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
while($data=mysql_fetch_assoc($req)){
?>
<li class="icon icon-arrow-left">
<a href="#"><?php echo $data["chap_name"]; ?></a>
<div class="mp-level">
<h2><?php echo $data["chap_name"]; ?></h2>
<a class="mp-back" href="#">Retour</a>
<ul>
<li class="icon icon-arrow-left">
<a href="#"><?php echo $data["fam_name"]; ?></a>
<div class="mp-level">
<h2><?php echo $data["fam_name"]; ?></h2>
<a class="mp-back" href="#">Retour</a>
<ul>
<li><a href="produits.php?<?php echo "id={$data['id']}" ; ?>"><?php echo $data["produit"]; ?></a></li>
</ul>
</div>
</li>
</ul>
</div>
</li>
<?php } ?>
Je vois bien qu'il y a un problème de parents au troisième niveau puisque mes produits entrent dans toutes les familles du parent supérieur!!
J'ai essayé de mettre un SELECT DISTINCT sur le chap_name et fam_name, mais ça n'affiche pas toutes mes fiches!
Que pensez-vous de cela ?
Ok, je comprends pourquoi je n'ai pas compris. En fait product_id
faire référence à id dans la table cdu
? C'est bien ça ? Je pensais qu'il faisait référence à un id produit, c'est pour cela que j'ai appelé product_id
. Mais si c'est lié à un cdu, dans ce cas là tu peux l'appeler cdu_id
. Bref c'est de la mise en fore ça.
En fait ta ligne
<option value="<?php echo $data['produit']; ?>"><?php echo $data['produit']; ?>
Devrait plutôt être
<option value="<?php echo $data['id']; ?>"><?php echo $data['produit']; ?>
Du coup dans le traitement de ton formulaire, ta variable $_POST['name'] doit avoir la bonne id. Du coup tu peux aussi renommer ce select en product_id
ou bien cdu_id
, si tu fais le chagement cité plus haut.
Désolé si je ne suis pas claire, j'écris depuis le téléphone lool
Bonjour.
Étais-tu obligé de créer deux fois le même sujet ?
Tu aurais pu donner les précisions dans ton sujet précédent.
Tu ne crois pas ?
Oui, en effet, mais après une mauvaise manipulation, j'ai validé sur mon portable le sujet, et j'avais peur qu'on croit le sujet résolu.
Désolé!
Bonjour,
Est-ce que tu peux nous faire un dump (var_dump) de ta variable $data
?
Le plus simple serait de le formaté comme suit :
<?php
$data = [
'Chapitre 1' => [
'Famille 1' => [
[
'id' => 1,
'name' => 'Produit 1'
],
[
'id' => 2,
'name' => 'Produit 2'
],
[
'id' => 3,
'name' => 'Produit 3'
],
],
'Famille 2' => [
[
'id' => 4,
'name' => 'Produit 4'
],
[
'id' => 5,
'name' => 'Produit 5'
]
]
],
'Chapitre 2' => [
'Famille 3' => [
[
'id' => 6,
'name' => 'Produit 6'
],
],
'Famille 4' => [
[
'id' => 7,
'name' => 'Produit 7'
],
[
'id' => 8,
'name' => 'Produit 8'
]
]
]
];
?>
<?php foreach ($data as $chapter_name => $chapters): ?>
<h2><?= $chapter_name ?></h2>
<ul> <!-- start families list -->
<li> <!-- start one point in families list -->
<?php foreach ($chapters as $family_name => $families): ?>
<a href="#"><?= $family_name ?></a>
<ul> <!-- start products list -->
<?php foreach ($families as $product => $row): ?>
<li>
<a href="produits.php?<?= "id={$row['id']}" ; ?>">
<?= $row['name']; ?>
</a>
</li>
<?php endforeach ?>
</ul> <!-- end products list -->
<?php endforeach ?>
</li> <!-- end one point in families list -->
</ul> <!-- end families list -->
<?php endforeach ?>
Teste le code tel quel, ensuite tu pourras adapter ta requête SQL, pense à faire un ORDER BY
, dans l'ordre sur l'id du chapitre et de la famille.
PS : ce sont 3 boucles effectivement, mais 3 boucles sans accès à la base donc niveau perf tu n'y perds rien :)
Bon courage.
Je comprends bien le fait de le mettre dans un foreach
, mais je ne vois pas comment gérer dynamiquement le début de ton code! Est-ce-qu'il faut mettre dans une boucle```
while
Je suis un peu une quiche en php et je ne vois pas trop comment m'en tirer!
En fait je vais tout le temps ajouter des produits (environ un centaine), et je ne me vois pas les mettre une par une
Voilà comment je le vois :
<?php
$i = '0';
while($data=mysql_fetch_assoc($req)){
'$chap_name $i++' => [
'$fam_name $i++' => [
[
'id' => 1,
'name' => '$produi t $i++'
],
}
?>
Penses-tu que ça sera bon comme ceci ?
Merci de ton aide! :)
Je pense qu'il est plus judiciable pour toi de revoir le fonctionnement des boucles. Dans ton exemple de code ça ne peut pas fonctionner pour plusieurs raisons, voici les questions que tu dois te poser :
$chap_name
$fam_name
et $produit
?Est-ce que tu peux me donne le résultat de var_dump($data) ? Ne le fais pas dans la boucle :
<?php
require "class/config.php";
mysql_connect(DB_HOST,DB_LOGIN,DB_PASS);
mysql_select_db(DB_BDD);
$sql="SELECT * FROM cdu AS p LEFT JOIN categorie AS c ON p.cat_id = c.cid LEFT JOIN chapitre AS k ON p.chap_id = k.cid LEFT JOIN famille AS f ON p.fam_id = f.cid" ;
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
?>
<pre><?= var_dump($data) ?></pre>
Quand je fais un var_dump($data) ça me met "NULL"
• $chap_name : ça retourne tous les chapitres de ma table
• $fam_name : ça retourne toutes les familles de ma table
• $produit : ça retourne tous les produits de ma table
Si tu as teamviewer, je peux te montrer mon code et ma table si tu veux bien!
Oups, au temps pour moi j'ai oublié il faut que rajoute cette ligne avant de faire le var_dump :
$data=mysql_fetch_assoc($req);
• $chap_name : ça retourne tous les chapitres de ma table
• $fam_name : ça retourne toutes les familles de ma table
• $produit : ça retourne tous les produits de ma table
Tu es certains ? :)
Elle sont definies où ces valeurs du coup ?
Bon... ça m'affiche plus de choses :
mais j'ai un très long texte alors je vais t'épargner tout le texte!
array(13) {
["id"]=>
string(1) "1"
["produit"]=>
string(48) "6.1 Saucisson cuit, saucisson à l’ail (choix)"
["corps_1"]=>
string(1103) "Tout le premier corps de texte"
["corps_2"]=>
string(12212) " Tout le deuxième corps de texte"
["reference"]=>
string(3) "7,8"
["cat_id"]=>
string(1) "2"
["fam_id"]=>
string(1) "6"
["chap_id"]=>
string(1) "2"
["cid"]=>
string(1) "6"
["cat_name"]=>
string(8) "saucisse"
["lien"]=>
string(20) "http://www.google.fr"
["chap_name"]=>
string(8) "Produits"
["fam_name"]=>
string(28) "Saucisses et saucissons secs"
D'accord, ben comme je le disais plus haut il faut remettre ce tableau en ordre avant de l'afficher. Je te laisse avancer, et je t'aiderai par la suite si tu as des soucis.
Je craque je n'y arrive pas du tout... j'ai essayé de rechanger ma table, mais rien à faire je n'en peux plus de se menu!! Comme je ne connais pas bien le php, je me perds très facilement dans les explications et je n'arrive à adapter ce que les autres font!!
J'ai essayé de regrouper ma table pour faire la meme chose que ce tuto
Mais je n'y arrive vraiment pas... Ca fait 3 jours que je suis dessus et j'en suis toujours au même point!!!!
Je veux bien de l'aide franche car je suis en train de craquer!! :(
C'est pour cela que je pense que tu dois revoir les bases avant de te lancer la dedans, tu comprendras mieux, tu gagneras du temps et tu pourras adapter facilement le code. Je veux bien t'aider, mais pas faire tout le code.
Je pars en week-end, et serais disponible lundi.
J'espère que tu auras avancé d'ici là :) Le tuto est très clair franchement.
@connected : super c'est sympa de vouloir m'aider!! :) (j'ai acheté des bouquins sur le PHP / MySQL hier à la Fnac!! lol)
Alors sinon j'ai essayé de suivre le tutoriel que je t'ai montré, mais j'ai un problème pour faire un lien sur le troisième niveau. Donc j'ai refais ma table comme sur le tuto :
CREATE TABLE IF NOT EXISTS `drop_down` (
`menu_id` int(11) NOT NULL AUTO_INCREMENT,
`menu` varchar(255) NOT NULL,
`parent_id` int(11) NOT NULL,
PRIMARY KEY (`menu_id`)
Pour le coup, les sous-menus fonctionnent bien, mais vu que le deuxième niveau et le troisième niveau entrent dans la même fonction, je ne vois pas comment je peux faire mes liens vers mes pages dans ma table "cdu"!
Du coup, j'ai fais ma requête de cette façon :
try {
$sql = "SELECT menu_id,menu,parent_id,id,cid FROM drop_down AS d LEFT JOIN famille AS f ON d.parent_id = f.cid LEFT JOIN cdu AS c ON d.parent_id = c.id WHERE d.parent_id = c.id OR parent_id = 0";
$result = $DB->query($sql);
$row_count = $result->rowCount();
if($row_count){
$rows = $result->fetchAll(PDO::FETCH_ASSOC);
}
}catch(PDOException $e) {
echo $e->getMessage();
}
et pour le l'affichage j'ai repris quasiment le meme code que sur le tuto, en l'adaptant à mon design :
<nav id="mp-menu" class="mp-menu">
<div class="mp-level">
<a href="index.php"><img src="img/cdu_blanc.png" alt="logo du Code des Usages de la Charcuterie"></a>
<?php
$items = $rows;
$menu_id = '';
echo "<ul>";
foreach($items as $item){
if($item['parent_id'] == 0){
echo "<li class='icon icon-arrow-left'>";
echo "<a href='#'>".$item['menu']."</a>";
echo "<div class='mp-level'>";
echo "<h2>".$item['menu']."</h2>";
echo "<a class='mp-back' href='#'>Retour</a>";
$id = $item['menu_id'];
sub($items, $id);
echo "</li>";
}
}
echo "</ul>";
function sub($items, $id){
echo "<ul>";
foreach($items as $item){
if($item['parent_id'] == $id){
echo "<li class='icon icon-arrow-left'>";
echo "<a href='http://www.google.fr'>".$item['menu']."</a>";
echo "<div class='mp-level'>";
echo "<h2>".$item['menu']."</h2>";
echo "<a class='mp-back' href='#'>Retour</a>";
sub($items, $item['menu_id']);
echo "</div>";
echo "</li>";
}
}
echo "</ul>";
}
?>
</div>
</nav>
je te mets des captures de site sur ici pour que tu vois le truc :
http://www.michaelheilikman.com/capture1.png
http://www.michaelheilikman.com/capture2.png
http://www.michaelheilikman.com/capture3.png
Voilà voilà... toujours un problème, mais c'est presque ça! :)
Qu'en penses-tu ?
Hello !
Super !! tu as bien avancé, au passage superbe le menu :)
Pour ton soucis tu peux rajouter un champurl
dans ta table drop_down
peut avoir comme valeur, et est par defaut, null
.
Ensuite, pour les liens finaux, j'entends par là les entrées qui doivent renvoyer vers une page, tu renseignes cd champ url
.
Il ne te reste plus qu'a faire une condition dans ta fonction :
function sub($items, $id){
echo "<ul>";
foreach($items as $item){
if($item['parent_id'] == $id){
echo "<li class='icon icon-arrow-left'>";
if($item['url'] != null){ // si on a une url alors on affiche le lien vers la page
echo '<a href="'.$item['url'].'">'.$item['menu'].'</a>';
} else { // si non on affiche le lien vers le sous menu
echo "<a href='http://www.google.fr'>".$item['menu']."</a>";
}
echo "<div class='mp-level'>";
echo "<h2>".$item['menu']."</h2>";
echo "<a class='mp-back' href='#'>Retour</a>";
sub($items, $item['menu_id']);
echo "</div>";
echo "</li>";
}
}
echo "</ul>";
}
Merci pour le menu!! :)
Ah ok je vois...
Par contre, j'aurais aimé récupérer l'id de ma table cdu
pour générer automatiquement mes liens de type :
<a href="produits.php?<?php echo "id={$item['id']}" ; ?>">
Tu penses que je devrais faire un champ url=id de ma table cdu et donc faire une jointure entre mes deux tables ?
Puis j'appel l'id de cdu en champ caché dans mon administration pour
<input type="hidden" name="url" value="<?php echo $cdu["id"]; ?>"/>
Tu crois que je me lance comme ça ?
Effectivement ton approche est meilleure :)
Tu n'as qu'à rajouter le champ product_id
, à la place de url
. product_id
ferait reference à l'id produit. Il peut être à null
et ta condition porterai sur ce champ du coup. Ca t'évite d'avoir les url en dur dans ta base :)
Alors ça ne marche pas, mais j'ai l'impression que ça vient de la fonction sub($items, $sub_id)
!
Quoi que je mette dans mon lien comme adresse à la place des "#", ça m'ouvre un nouveau volet!! Donc quand je clique sur ce qu'il devrait être mon dernier niveau, ça ouvre un niveau vide!
Pourtant ça fonctionnait bien avant... j'vais le tester sans mon script du menu... mais, c'est bisarre!! lol
Je vais faire une autre fonction d'un autre sous menu sans la class icon icon-arrow-left
car ça appel l'ouverture d'un autre volet dans mon js... j'vais y arriver!! lol
Bon je vais encore te déranger un peu... Je n'arrive pas à récupérer l'id via un champ de type hidden car je choisi mes menu avec un select
.
En fait, je n'arrive pas à lier mon <select name ="menu">
avec un élément caché de name product_id qui serait égale à id.
Je te montre , ce que je fais :
<p>Choisisser les bonnes catégories correspondants à un produit</p>
<p> </p>
<?php
$sql="SELECT * FROM cdu";
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
while($data=mysql_fetch_assoc($req)){
?>
<input type="hidden" name="product_id" value="<?php echo $data["id"]; ?>"/>
<?php } ?>
<select name="menu">
<option select="selected">Choisissez un produit</option>
<?php
$sql="SELECT * FROM cdu";
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
while($data=mysql_fetch_assoc($req)){
?>
<option value="<?php echo $data['produit']; ?>"><?php echo $data['produit']; ?>
</option>
<?php } ?>
</select>
<span> dans </span>
<select name="parent_id">
<option select="selected">Choisissez une famille</option>
<?php
$sql="SELECT * FROM drop_down AS d LEFT JOIN famille AS c ON d.menu = c.fam_name WHERE menu = fam_name";
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
while($data=mysql_fetch_assoc($req)){
?>
<option value="<?php echo $data['menu_id']; ?>"><?php echo $data['menu']; ?></option>
<?php } ?>
</select>
Je vois bien que je fais 2 boucles while
et du coup ça ne peut pas être lié à mon name ="menu"
de mon select, mais là je ne vois pas comment dire autrement que $product_id = $id
Promis après ça, c'est la dernière fois que je t'embête! :)
Pas de soucis tu ne m'embête pas, et je ne suis pas le seul sur le forum :)
Euh, j'ai peur de ne pas avoir tout suivi (désolé lol), est-ce que tu peux réexpliquer un peu avec ce que tu souhaites faire et ce qui se passe actuellement comme erreur/problème.
En fait, j'essaie de d'ajouter l'id de cdu dans ma table drop_down correspondant à product_id.
Pour cela, j'avais pensé utiliser un input de type hidden. Mais, pour mes menus, j'utilise un select (voir post précédent).
Je n'arrive pas à dire que je veux récupérer l'id de cdu dans ma boucle while de mon select... je pourrai le faire avec deux select, mais je trouve que ce n'est pas beau d'avoir deux selections de produit pour avoir au final deux informations appartenant à la même table!
ma table cdu est comme ceci (je te mets juste les valeurs qui importent) :
CREATE TABLE IF NOT EXISTS `cdu`
`id` int(11) NOT NULL AUTO_INCREMENT,
`produit` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
donc pour le select je fais :
<select name="menu">
<option select="selected">Choisissez un produit</option>
<?php
$sql="SELECT * FROM cdu";
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
while($data=mysql_fetch_assoc($req)){
?>
<option value="<?php echo $data['produit']; ?>"><?php echo $data['produit']; ?>
</option>
<?php } ?>
</select>
Mais comment récupérer l'id de cdu pour lui dire qu'il est égale à product_id ?
Désolé, je dois-être fatigué ou pas, mais je ne comprends toujours pas :S
En fait, j'essaie de d'ajouter l'id de cdu dans ma table drop_down correspondant à product_id.
Il me faut un exmple concret je pense ... Désolé :S
Ok, alors je vais essayé de faire simple! :)
Comme tu le sais, j'ai une table cdu :
CREATE TABLE `cdu` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`produit` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`corps_1` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`corps_2` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`reference` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`cat_id` int(11) NOT NULL,
`fam_id` int(11) NOT NULL,
`chap_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;
et une table drop_down :
CREATE TABLE `drop_down` (
`menu_id` int(11) NOT NULL AUTO_INCREMENT,
`menu` varchar(255) NOT NULL,
`parent_id` int(11) NOT NULL,
`product_id` int(11) DEFAULT NULL,
PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=33 ;
Pour ajouter mes menus dans la table drop_down, j'utilise des <select>
qui vont chercher des informations dans ma table cdu.
voir photo : http://www.michaelheilikman.com/select_menu.png
<select name="menu">
<option select="selected">Choisissez un produit</option>
<?php
$sql="SELECT * FROM cdu";
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
while($data=mysql_fetch_assoc($req)){
?>
<option value="<?php echo $data['produit']; ?>"><?php echo $data['produit']; ?>
</option>
<?php } ?>
</select>
<span> dans </span>
<select name="parent_id">
<option select="selected">Choisissez une famille</option>
<?php
$sql="SELECT * FROM drop_down AS d LEFT JOIN famille AS c ON d.menu = c.fam_name WHERE menu = fam_name";
$req = mysql_query($sql) or die ('Erreur SQL !<br/>'.$sql.'<br/>'.mysql_error());
while($data=mysql_fetch_assoc($req)){
?>
<option value="<?php echo $data['menu_id']; ?>"><?php echo $data['menu']; ?></option>
<?php } ?>
</select>
ENSUITE,
Pour ajouter le product_id
dans ma table drop_down
, celui-ci doit être égale à l'id
de la table cdu
.
Cependant, je ne sais pas comment exprimer en php cette égalité dans un <select>
Au début de t'avais parlé d'un champ de type hidden, mais ça ne me prend pas le bon id
En gros, comment je peux, dans ce cas, appeler l'id
de cdu pour le récupérer dans la colonne product_id
dans drop_down sans ajouter un autre select ?
Est ce que tu vois mieux ce que je demande ?
Oui mais mon echo $data['produit']
me permettait de faire entrer le nom de mon produit dans la table drop_down.
On ne peut pas mettre dans la boucle que $product_id = $id
en caché comme avec un input ? ça me permettrai de faire entrer le produit, et l'id.
En fait, je me disais que c'était quand meme pas optimal mon code, parce que j'ai déjà toutes les données dans des tables différentes, et j'ai créé une table drop_down uniquement pour le menu... C'est pas possible de le générer à partir de mes différentes tables ?
Tu n'as pas besoin de name
avec l'id tu peux toujours facilement retouver le nom.
Après si tu veux vraiment faire ce que tu dis avec un champ hidden, il faut passer par du javascript. Créer un evenement sur le select, et dire lorsque cette valeur change tu (ton application) definie le champ product_id
à id