Bonjour,
je cherche à me perfectionner en php avant de me lancer dans la programmation objet.
J'ai suivi le très bon tuto "Débutant : Créer un portfolio de A à Z" en php procédural mais pleinement adapté aux nouvelles versions de php.
Je suis en train de me faire un petit cms pour mes clients et pour des associations sur cette base mais je rencontre un petit souci.
Je souhaite afficher des menus dynamiques avec sous menus mais je ne parviens pas à filtrer mes sous menus.
le resultat serait classiquement :
Menu 1
Menu 2
Menu 2.1
Menu 2.2
Menu 3
Menu 3.1
Voici mon code :
<?php
$auth = 0;
include 'lib/includes.php';
include 'lib/image.php';
$select = $db->query("SELECT id, parent_id, nom FROM menu WHERE parent_id='0' ORDER BY nom ASC");
$menus = $select->fetchAll();
$select = $db->query("SELECT * FROM menu WHERE parent_id!='0' ORDER BY nom ASC");
$sousmenus = $select->fetchAll();
$title = "Bienvenue sur mon cms";
include 'modeles/header.php';
?>
<div class="row">
<div class="col-sm-12 menu">
<ul>
<?php foreach ($menus as $m => $menu): ?>
<li>
<a href="#">
<?= $menu['nom']; ?>
</a>
<ul class="sousmenu">
<?php foreach ($sousmenus as $sm => $sousmenu): ?>
<li>
<a href="#">
<?= $sousmenu['nom']; ?>
</a>
</li>
<?php endforeach ?>
</ul>
</li>
<?php endforeach ?>
</ul>
</div>
</div>
<?php include 'modeles/footer.php'; ?>
Le souci est que ce code ne m'affiche que ceci :
Menu 1
Menu 2.1
Menu 2.2
Menu 3.1
Menu 2
Menu 2.1
Menu 2.2
Menu 3.1
Menu 3
Menu 2.1
Menu 2.2
Menu 3.1
Comme vous pouvez le voir, je ne filtre pas les sous menus et donc cela ne correspond pas au contenu réel de la base puisqu'il m'affiche tous les sous-menus existants sous chaque menu principal.
Je vous remercie par avance pour votre aide.
Hello,
au niveau de ton foreach qui parcourt ton tableau $sousmenus, avant de faire ton li, ajoute une condition qui vient vérifier si le parent-id de ton sousmenu est égale à l'id du menu que t'es en train de parcourir et dans ce cas tu affiches ton li et ton lien.
Bonsoir et merci pour vos réponses.
Seenok, j'ai essayé de faire ce que tu me donnais comme piste.
<div class="row">
<div class="col-sm-12 menu">
<ul>
<?php foreach ($menus as $m => $menu): ?>
<li>
<a href="#">
<?= $menu['nom']; ?>
</a>
<ul class="sousmenu">
<?php if ($sousmenu['parent_id'] = $menu['id']) : ?>
<?php foreach ($sousmenus as $sm => $sousmenu): ?>
<li>
<a href="#">
<?= $sousmenu['nom']; ?>
</a>
</li>
<?php endforeach ?>
<?php endif?>
</ul>
</li>
<?php endforeach ?>
</ul>
</div>
</div>
En revanche, qu'ai-je fait comme grosse boulette pour que cela ne fonctionne pas ?
Encore merci pour l'appui technique.
Nico41, merci pour le lien mais trop complexe pour mon besoin et pour mon niveau actuelle de prog.
Bonjour,
ne parvenant pas à mes fins avec mon code, je me suis inspiré d'un code trouvé sur openclassroom :
Cela pourrait se rapprocher de mon besoin mais j'ai encore une petite question.
Voici le code que j'ai adapté (le modèle est basé sur plusieurs tables mais je trouve cela étrange et donc je l'ai modifié avec juste une seule et une clé parent).
<ul class="nav">
<?php
$reponse = $db->query('SELECT * FROM menu WHERE parent_id = 0 ORDER BY nom');
while ($donnees = $reponse->fetch())
{
echo '<li class="dropdown-submenu">';
echo '<a href="#">' . $donnees['nom'] . '</a>';
echo '<ul class="dropdown-menu">';
$req = $db->prepare('SELECT * FROM menu WHERE parent_id = ? ORDER BY nom');
$req->execute(array($donnees['id']));
while ($donnees2 = $req->fetch())
{
echo '<li class="dropdown-submenu">';
echo'<a href="#">' . $donnees2['nom'] . '</a>';
}
echo '</ul>';
}
$reponse->closeCursor();
$req->closeCursor();
?>
</ul>
Comment faire pour avoir plus de 1 niveau de sous-menu. D'avance merci.
Si toutefois, vous pensez que ma première approche est meilleure, merci de me le dire et m'aider à le corriger pour parvenir au même résultat, c'est à dire plusieurs niveaux de sous-menus.
Salut @jpcreation
Je te propose ceci =>
// fonction qui permet de recupperer les menus.
function getMenus($db, $parent = 0)
{
$menus = $db->query("SELECT * FROM menu WHERE parent_id = $parent ORDER BY nom")->fetchAll();
foreach ($menus as $cle => $menu) {
$menus[$cle]['enfants'] = getMenus($db, $menu['id']);
}
return $menus;
}
// dans ta vue
<html>
....
<body>
...
<?php
$menus = getMenus($db);
include 'menu-partial.php';
?>
</body>
</html>
// Cree un fichier menu-partial.php (T'es libre de donner le nom que tu veux .)
<?php if (!empty($menus)): ?>
<?php $items = $menus; ?>
<ul class="<?= (isset($class) ? $class : 'nav') ?>">
<?php foreach($items as $menu): ?>
<li class="dropdown-menu">
<a href="#"> <?= $menu['nom'] ?></a>
$menus = $menu['enfants'];
$class = 'dropdown-menu';
include __FILE__;
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
Bonjour Balbert,
Je te remercie pour proposition.
cela me construit bien le menu arborescent, reste plus qu'a résoudre le css pour que cela déroules sous menus.
De mon côté j'avais aussi trouvé une solution en continuant de fouiller dans ce forum et en adaptant la version de lien
Je ne sais pas laquelle est la meilleure (en terme de performance surtout et de portage par la suite en POO car je compte m'y mettre un jour aussi !!) mise à part que pour cette version, le css fonctionne parfaitement.
En tout cas merci pour toutes vos contributions.