Головоломка: Как организовать динамическое иерархическое меню категорий - PullRequest
0 голосов
/ 30 декабря 2011

Я пытаюсь разработать иерархическое меню на моем веб-сайте электронной торговли, в котором мои категории отображаются динамически, чтобы добавлять дополнительные категории без необходимости касаться кода.

Итак, я организовал свою базу данных таким образом, с 3 различными рангами для моих категорий:

Я получил 3 разных ранга:

  • Первое место: Информатика [id = 1] Аксессуары [2] инструкции [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] Обувь [id = 110] parent_key = 30] [id = 300] ..

Итак, вы поняли, что "parent_key" относится к родительскому идентификатору моей категории abd для каждой категории ранга 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 ]

1 голос
/ 31 декабря 2011

Хорошо, спасибо за все, что вы опубликовали, но я нашел способ решить мою проблему, вот мое личное решение:

Итак, сначала я получу все категории в массиве: «allCategories»

Затем, пока я создаю меню, используя циклы while и условия, я получаю то, что хочу:

Итак, для каждой категории

  • Категория ['cat_id'], которая является идентификатором категории

  • Категория ['cat_title'] имя кота

  • Категория ['cat_order'] ранг категории

  • Category ['cat_parentkey'] идентификатор родителя моей категории (Parent of motherboad: Hardware)

    $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
    }
    

    ?>

0 голосов
/ 30 декабря 2011

Что касается способа хранения данных в базе данных (не в части MVC, так как я не склонен использовать фреймворки и часто строю свои собственные), я бы порекомендовал эту очень хорошую статью:

http://www.sitepoint.com/hierarchical-data-database/

В нем говорится о способах хранения данных в базе данных, когда у вас есть иерархические данные. Мои предпочтительные методы, в зависимости от вывода, это список смежности или метод обхода. Вы можете выбрать тот, который, по вашему мнению, работает лучше всего:)

...