拼图:如何组织动态分层类别菜单

时间:2011-12-30 19:06:59

标签: php model-view-controller menu categories

我正在尝试在我的电子商务网站中开发一个分级菜单,其中我的类别会动态显示,以便添加更多类别而无需触摸代码。

所以我组织了这样的数据库,我的类别有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循环,但我不能自己搞清楚。

如果有人想帮助解决这个问题,他非常欢迎:)

2 个答案:

答案 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/

它讨论了在拥有分层数据时将数据存储到数据库的方法。我的首选方法,取决于输出是邻接列表或遍历方法。由你决定你认为最好的那个:)