我正在尝试在我的电子商务网站中开发一个分级菜单,其中我的类别会动态显示,以便添加更多类别而无需触摸代码。
所以我组织了这样的数据库,我的类别有3个不同的等级:
我有3个不同的级别:
第一级:信息学[id = 1]附件[2]vêtements[3] Hifi ..
第二等级:硬件[parent_key = 1] [id = 10]软件[parent_key = 1] [id = 11]男子[parent_key = 3] [id = 30]。
第三等级:主板[parent_key = 10] [id = 100]处理器[parent_key = 10] [id = 101] Windows7 [parent_key = 11] [id = 110]鞋子[parent_key = 30] [id = 300] ..
所以你已经明白“parent_key”指的是我的类别abd的父ID,每个等级1的类别我有几个等级2等等等。
现在,我已经用这样的方式对我的菜单进行了硬编码:
<div id="main_menu">
<ul id="nav">
<li class="current"><a href="<?php echo base_url();?>">Home</a></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>
</ul>
<br class="clear" />
</div>
我在MVC编码,我不知道如何构建我的模型,我的控制器和我的视图。我想我必须做一些if / else和foreach循环,但我不能自己搞清楚。
如果有人想帮助解决这个问题,他非常欢迎:)
答案 0 :(得分:1)
好的,感谢所有发帖,但我找到了解决问题的方法,这是我的个人解决方案:
所以我首先检索一个数组中的所有类别:“allCategories”
然后,当我构建菜单时,使用while循环和条件,我得到我想要的东西:
所以我们为每个类别
类别['cat_id'],是类别的ID
类别['cat_title']猫的名字
类别['cat_order']类别的排名
类别['cat_parentkey']我的类别之母的id(motherboad的父级:硬件)
$token1=TRUE;
$token2=TRUE;
foreach($allCategories as $Categories1){ //we are going to check all the cats :: on fait defiler toutes les catégories
if($Categories1['cat_order']==1){ // if its rank 1 :: si le rang de la categorie est 1
$key = $Categories1['cat_id']; // we save its ID
echo '<li><a href="#">';
echo $Categories1['cat_title'];
echo '</a>'; // this is the loyaout to print the list, the /li comes further :: on fait la mise en page pour afficher la liste, le /li venant plus bas
foreach($allCategories as $Categories2test){ // We gonna check if there is AT LEAST ONE categorie with an inferior rank, otherwise we do not print the <ul> which produce an ugly bar next to the menu :: on va tester si il existe AU MOINS UNE catégorie de rang inférieur, sinon on n'affiche pas de ul afin d'éviter une barre moche dans le menu
if($Categories2test['cat_order']==2 AND $Categories2test['cat_parentkey']==$key AND $token1==TRUE){ // We do a test with a token which, once we do 1 loop inside, tell us there is at least one cat with an inferior rank :: on fait donc un test avec un token qui, une fois qu'on passe dedans 1 fois, nous dis qu'i'il y a donc au moins un rang inféireur
echo '<ul>'; // layout of our menu, is printed only if there is inferioir cats :: mise en forme du sous menu, ne s'affiche donc qu si il ya une categorie de ranf inferieur.
foreach ($allCategories as $Categories2){ // One again, we check all the cats :: on fait défiler les catégories
if($Categories2['cat_order']==2 AND $Categories2['cat_parentkey']==$key){ // If there is at least one of rank 2 so .... :: si il y en a 1 de rang 2 alors ...
$key2 = $Categories2['cat_id'];
echo '<li><a href="#">';
echo $Categories2['cat_title'];
echo '</a>';
foreach($allCategories as $Categories3test){
if($Categories3test['cat_order']==3 AND $Categories3test['cat_parentkey']==$key2 AND $token2==TRUE){
echo "<ul>"; foreach ($allCategories as $Categories3){
if($Categories3['cat_order']==3 AND $Categories3['cat_parentkey']==$key2){
$key3 = $Categories3['cat_id'];
echo '<li><a href="#">';
echo $Categories3['cat_title'];
echo '</a>';
echo "</li>";
}
}
echo "</ul>";
$token2=FALSE;
}
}
echo"</li>";
}
$token2=TRUE;
}
echo'</ul>';
$token1=FALSE; // We put our token to FALSE in order to avoid that loop for that particular rank1 category :: on met notre token à FALSE afin de ne plus refaire cette boucle pour cette catégorie de rang1
}
}
echo "</li>";
}
$token1=TRUE; // We put the token to TRUE in order to do that loop again for the other rank 1 categorie :: on remet le token à 0 afin de repasser dans la boucle pour la catégorie de rang 1 suivante
}
&GT;
答案 1 :(得分:0)
关于将数据存储到数据库的方式(不是MVC部分,因为我不倾向于使用框架,而且我经常自己构建)我会推荐这篇非常好的文章:
http://www.sitepoint.com/hierarchical-data-database/
它讨论了在拥有分层数据时将数据存储到数据库的方法。我的首选方法,取决于输出是邻接列表或遍历方法。由你决定你认为最好的那个:)