bonjour à tous,
je suis actuellement sur un système de menu et de distribution de page qui marche en liaison avec une BD.
Pas de soucis, tous ce met en place gentiment mais j'aimerai votre avis sur ce bout de code savoir si c'est propre et ce que l'on peu améliorer
<nav class="navbar navbar-inverse" role="navigation">
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<?php
$data = $DBPDO1->prepare("SELECT DISTINCT (colone) FROM site_menu");
$ncn=count(($data->execute()));
$data = $DBPDO1->prepare("SELECT DISTINCT (colone_id) FROM site_menu");
$nci=count(($data->execute()));
if ($ncn!=$nci) {echo "<pre> erreur dans la rentré des menus. Différence entre le nombre de colones et le nombre d'appelations</pre><br>";}
else
{
$data = $DBPDO1->prepare("SELECT * FROM site_menu ORDER BY colone_id");
$data->execute();
while($menu=$data->fetch(PDO::FETCH_OBJ))
{
if ($menu->colone_mod=="simple") {echo "<li><a href='".$menu->lien."'>".$menu->colone."</a></li>";}
elseif ($menu->colone_mod=="multi")
{
if ($last!=$menu->colone)
{
?>
<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown"><?php echo $menu->colone;?> <span id="tot_forum"></span><b class="caret"></b></a>
<ul class="dropdown-menu">
<?php
$data2 = $DBPDO1->prepare("SELECT * FROM site_menu WHERE colone ='$menu->colone' and colone_mod='dep' ORDER BY position");
$data2->execute();
while($menu2=$data2->fetch(PDO::FETCH_OBJ))
{
if ($menu2->type =="divider") {echo "<li class='divider'></li>";}
else{
if ($menu2->type =="href")
{echo "<li ><a href='".$menu2->lien."' target='".$menu2->cible."' >".$menu2->nom."</a></li>".$menu2->option1." ".$menu2->option2." ".$menu2->option3;}
if ($menu2->type =="onclick")
{echo "<li ><a href='#' onclick='".$menu2->lien."' target='".$menu2->cible."' >".$menu2->nom."</a></li>".$menu2->option1." ".$menu2->option2." ".$menu2->option3;}
}
}
?>
</ul>
</li>
<?php
}
$last=$menu->colone;
}
elseif ($menu->colone_mod=="dep"){}
else { ?><pre> <?php var_dump($menu); ?></pre><br> <?php }
}
}
?>
</ul>
</div>
</nav>
et la table de bd qui va avec
l'écriture de cette table ne se fait que par php my admin
certes pour un simple menu, c'est quelque peu complexe, mais il y a d'autre chose qui viennent se greffer, un dispatche pour les get par exemple. Le but est de tout centralisé sur ma bd plutot que de devoir éditer plusieurs fichiers à chaque fois
Une bdd est faite pour des requtes, plus ou moins complexe dans un ensemble complexe de données, et/ou des mises a jour frequentes, elle n'est pas particulièrement appropriée pour ce que tu veux faire ici.
Si tu veux tout centraliser dans un seul fichier, ce qui n'est pas stupide au demeurant, je te conseille plutot un fichier de config, qui sera plus econome en ressources et sans doute aussi plus facile a maintenir.
Pusieurs format sont possible (yml, xml, txt, json ...) mais le plus simple esf sans doute encore du php.
je reviens sur ce le sujet car malgré ce que dit Vallyan qui pour une fois trouve que je ne suis pas totalement dans le faux, je préfére passer par une BD car une recherche avec critères est beaucoup plus souple en MYSQL, enfin avec les armes que je connais car yml, xml, txt, json je ne les ai utilisé quasiment jamais et donc je ne connais pas les possibilité de recherche et ne sais comment organiser la chose autrement. Mauvais point pour moi.
Mais une question me titille
dans la colone client je souhaiterai mettre
$variable==1
et faire ceci
if ($req->client){echo "oui";}
équivalent à ça donc
if ($variable==1){echo "oui";}
je sens que certain vont me traiter de barbare je le sens, mais es ce possible?
Merci d'avance pour vos réponse
@+ Flo
Bonjour.
Tu peux également faire comme ceci :
<?= ($req->client)?'oui':'non'; ?>
Dans le cas bien sûr où tu veux la contrepartie dans le cas ou le champ client n'a aucune valeur.
Si tu ne veux pas de retour pour la contrepartie, tu mets du vide dans le second guillemet, comme ceci :
($req->client)?'oui':'';
Sinon ton approche est correcte.
Bonjour,
je trouve qu'il y a trop de requêtes dans ton code (4) pour un simple menu 1 suffit, je tes fait une petite fonction menu(),
elle n'est pas difficile à comprendre je ne l'ai pas testé, donc il y a surement quelques erreurs, à toi de finaliser...
tu peut par la suite l’appeler en php pour ne pas faire "fouillis".
<?php
function Menu(){
$HTML = '';
// une seul requête
$d = $DBPDO1->prepare("SELECT * FROM site_menu ORDER BY colone_id");
$d->execute();
$datas = $d->fetchAll();
$i = 0; $o = 0;
foreach ($datas as $d) {
if ($d'colone']) { $i++; }
if ($d'colone_id']) { $o++; }
}
if ($i!=$o) {
return "<pre> erreur dans la rentré des menus. Différence entre le nombre de colones et le nombre d'appelations</pre><br>";
}else{
foreach ($datas as $menu) {
if ($menu'colone_mod'] == "simple") {
$HTML .= "<li><a href='".$menu'lien']."'>".$menu'colone']."</a></li>";
}elseif ($menu'colone_mod'] == "multi") {
// attention la variable $last n'est pas déclarée
if ($last!=$menu'colone']) {
$HTML .= '<li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">'.$menu'colone'].' <span id="tot_forum"></span><b class="caret"></b></a><ul class="dropdown-menu">';
// ici on stock tout dans la variable $juge pour trier ensuite (requête ORDER BY position)
$juge = array();
foreach ($datas as $menu2) {
$a = '';
if ($menu2'colone'] == $menu'colone'] && $menu2'colone_mod'] == 'dep') {
if ($menu2'type'] == "divider") {
$a .= "<li class='divider'></li>";
}else{
if ($menu2'type'] == "href") {
$a .= "<li ><a href='".$menu2'lien']."' target='".$menu2'cible']."'>".$menu2'nom']."</a></li>".$menu2'option1']." ".$menu2'option2']." ".$menu2'option3'];
}
if ($menu2'type'] == "onclick") {
$a .= "<li ><a href='#' onclick='".$menu2'lien']."' target='".$menu2'cible']."' >".$menu2'nom']."</a></li>".$menu2'option1']." ".$menu2'option2']." ".$menu2'option3'];
}
}
}
$juge$menu2'position']] = $a;
}
// Ksort pour classer par clée
ksort($juge);
// Et on l'ajoute à notre variable $HTML
foreach ($juge as $key => $value) {
$HTML .= $value;
}
$HTML .= '</ul></li>';
}
$last = $menu'colone']; // ??????
}elseif ($menu'colone_mod']=="dep"){
//
}else {
$HTML .= '<pre>'.var_dump($menu).'</pre><br>';
}
}
}
// return tous le code html
return $HTML;
}
?>
<nav class="navbar navbar-inverse" role="navigation">
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<?php echo menu(); ?>
</ul>
</div>
</nav>