动态创建动态导航

时间:2011-11-22 20:55:05

标签: php mysql navigation

我正在寻找动态创建复杂导航元素的最佳方法。我拥有数据库中的所有元素(title,id,parentId),我想有效地将​​它们从数据库中取出并正确显示它们。我还想要折叠所有非活动的导航元素。因此,如果我浏览“沙发”,我不会看到“枝形吊灯”或灯光下的任何类别,但我会看到“照明”。

这就是我希望最终产品的样子:

  • 家具
    • 客厅
      • 沙发
      • 椅子
      • 脚垫
    • 卧室
      • 床头
  • 照明
    • 吊灯
    • 落地灯
    • 壁灯
  • 地毯&纺织品
    • 当代
    • 老式

我目前的方法是

  1. 编写一个SQL查询,下拉所有类别名称,ID和父ID
  2. 遍历这些类别并放入一个排序的多维数组中,子类别存储在其父项下。
  3. 遍历新数组并添加另一个条目以将相应类别标记为已打开(默认情况下所有类别均已关闭)
  4. 遍历数组并编写HTML
  5. 我正在尝试尽可能少的互动,我确信我现在的代码效率低下。特别是第2步,我多次遍历数组。这个(常见的)问题必须有一个通用的解决方案。

2 个答案:

答案 0 :(得分:2)

考虑在数据库表中添加新字段:level 主要类别将level 0。
子类别将level 1 子类别将有level 2.

这个技巧将帮助您了解在没有第二次迭代的情况下禁用哪些子类别。

答案 1 :(得分:0)

我相信这是使用递归生成html代码的最佳位置。 我刚才使用过这个功能。它正在使用多维数组(树)

function buildMenu($menu_array, $is_sub=FALSE) {
      $attr = (!$is_sub) ? 'id="menu"' : 'class="submenu"';
      $menu = "<ul $attr>\n"; 
      foreach($menu_array as $id => $elements) {
          foreach($elements as $key => $val) {
              if(is_array($val)) {
                  $sub = buildMenu($val, TRUE);
              }
              else {
                  $sub = NULL;
                  $$key = $val;
              }
          }
          if(!isset($url)) {
              $url = $id;
          }
          $menu .= "<li><a href=\"$url\">$display</a>$sub</li>\n";
          unset($url, $display, $sub);
      }
      return $menu . "</ul>\n";
  }
  echo buildMenu($menu_array);  

这也增加了css属性。如果您希望标记当前活动的页面,可以使用strpos()功能查找当前的网址。如果您需要更多功能,可以轻松将其添加到buildMenu()

使用上面答案中提到的级别也会有所帮助。如果你在数据库中使用嵌套集模型,我也可以帮助你查询,这是一个选择返回整个菜单数据。