【问题标题】:Dynamic menu php bootstrap mysql动态菜单 php bootstrap mysql
【发布时间】:2016-11-01 18:06:06
【问题描述】:

我的代码有问题,我可以有第一级,在第二级我有一个 id 号和 3eme 级什么都没有。

我需要查找 4 个深度级别的信息

代码也产生错误:Illegal string offset 'label' 在这一行:

foreach($menu_sub[$submenus['sub_menu']] as $sub2_key => $submenus2) {

结果

index
---- 8
--------- not appear
--------- not appear
---- 3
---- 2
---- I

Configuration
---- 9
--------- not appear
--------- not appear
----1
----1
----M
----1

Catalogue

数据库

CREATE TABLE `administrator_menu` (
  `id` int(11) NOT NULL,
  `link` mediumtext NOT NULL,
  `parent_id` int(11) NOT NULL,
  `sort_order` int(11) NOT NULL,
  `class` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `administrator_menu`
--

INSERT INTO `administrator_menu` (`id`, `link`, `parent_id`, `sort_order`, `class`) VALUES
(1, '', 0, 2, ''),
(3, '', 0, 1, ''),
(5, '', 0, 3, ''),
(6, '', 0, 4, ''),
(7, '', 3, 1, ''),
(8, '', 3, 2, ''),
(9, '', 1, 1, ''),
(10, '', 9, 0, '');

ALTER TABLE `administrator_menu`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `administrator_menu`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;    

CREATE TABLE `administrator_menu_description` (
  `id` int(11) NOT NULL,
  `label` varchar(255) NOT NULL,
  `language_id` int(11) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `administrator_menu_description`
--

INSERT INTO `administrator_menu_description` (`id`, `label`, `language_id`) VALUES
(3, 'Accueil', 1),
(7, 'Administration', 1),
(7, 'Administration', 2),
(5, 'Catalog', 2),
(5, 'Catalogue', 1),
(1, 'Configuration', 1),
(1, 'Configuration', 2),
(10, 'Configuration générale', 1),
(10, 'general Configuration', 2),
(3, 'Index', 2),
(8, 'Index Catalogue', 1),
(8, 'Index Shop', 2),
(9, 'Ma boutique', 1),
(9, 'My shop', 2);    

ALTER TABLE `administrator_menu_description`
  ADD PRIMARY KEY (`id`,`language_id`),
  ADD KEY `label` (`label`);

ALTER TABLE `administrator_menu_description`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;

脚本

sql请求结果

table administrator_menu

     id     parent_id   sort_order  class
        1       0            2  
        3       0            1  
        5       0            3  
        6       0            4  
        7       3            1  
        8       3            2  
        9       1            1  
        10      9            0 

注意: parent_id 是为创建分层菜单而选择的 id 数量 例如 id = 10 和 parent_id = 9 ,我们在 3em 级别
例如 id = 9 和 parent_id = 1 ,我们在 2em 级别
例如 id = 1 和 parent_id = 0 ,我们在第一层

table description menu

     id  lable            language_id
        1   Configuration   1
        1   Configuration   2
        3   Accueil         1
        3   Index           2
        5   Catalogue       1
        5   Catalog         2
        7   Administration  1
        7   Administration  2
        8   Index Catalogue 1
        8   Index Shop      2
        9   Ma boutique     1
        9   My shop         2
        10  Configuration générale  1
        10  general Configuration   2

<?php
  // Select all entries from the menu table
  $Qmenus = $Db->prepare('SELECT a.id, 
                                        a.link, 
                                        a.parent_id, 
                                        a.class,
                                        a.sort_order,
                                        amd.label 
                                  FROM :table_administrator_menu a,
                                      :table_administrator_menu_description amd
                                  where a.id = amd.id
                                  and amd.language_id = :language_id
                                  ORDER BY a.parent_id, 
                                           a.sort_order
                                  ');

  $Qmenus->bindInt(':language_id', $Language->getId());
  $Qmenus->execute();

  $Qmenus = $Qmenus->fetchAll();
?>
<!-- Navigation -->
<nav class="navbar navbar-default navbar-static-top" role="navigation" style="margin-bottom: 0">
  <div class="navbar-default sidebar" role="navigation">
    <div class="sidebar-nav navbar-collapse">
      <ul class="nav" id="side-menu">

<?php
  $menu_parent = array();
  $menu_sub = array();
  foreach ($Qmenus as $menus) {
    if ($menus['parent_id'] == 0) {
      $menu_parent[$menus['id']] = $menus;
    } else {
      if (isset($menu_parent[ $menus['parent_id']])) {
        $menu_parent[$menus['parent_id']]['sub_menu'] = $menus['id'];
        $menu_sub[$menus['id']] = $menus;
      } else if (isset($menu_sub[$menus['parent_id']])) {
        $menu_sub[$menus['parent_id']]['sub_menu'] = $menus['id'];
        $menu_sub[$menus['id']] = $menus;
      }
    }
  }

  foreach($menu_parent as $key => $menus) {
    echo '<li><a href="#"><i class="fa fa-sitemap fa-fw"></i>' . $menus['label'] . '<span class="fa arrow"></span></a>';

    if (!empty($menus['sub_menu'])) {
      echo '<ul class="nav nav-second-level">';
        foreach($menu_sub[$menus['sub_menu']] as $sub_key => $submenus) {
          echo '<li><a href="#">' . $submenus['label'] . '</a>';
          if (!empty($submenus['sub_menu'])) {

            foreach($menu_sub[$submenus['sub_menu']] as $sub2_key => $submenus2) {

              echo '<li><a href="#">' . $submenus2['label'] . '</a>';

              if (!empty($submenus2['sub_menu'])) {

                foreach($menu_sub[$submenus2['sub_menu']] as $sub3_key => $submenus3) {
                  echo '<li><a href="#">' . $submenus3['label'] . '</a></li>';
                }
              }
              echo '</li>';
            }
          }
          echo '</li>';
        }
      echo '</ul>';
    }
    echo '</li>';
  }
?>
      </ul>
    </div>
    <!-- /.sidebar-collapse -->
  </div>
  <!-- /.navbar-static-side -->
</nav>

【问题讨论】:

  • 发布完整的表格结构和示例数据
  • 在解释中添加db信息,tk

标签: php mysql twitter-bootstrap


【解决方案1】:

您的代码只会生成两级菜单,如果您需要通过任何您想要的级别,我认为您需要使用递归。

这是一个基于您的数据库结构和示例的示例。在示例中,我们将生成一个不同级别的菜单,英文标签用于菜单项名称。

<?php
$db = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');



function drawMenu($db, $parent, $level = null){
    $m = $db->prepare(" SELECT * FROM 
                        administrator_menu, administrator_menu_description
                        where administrator_menu.id = administrator_menu_description.id
                        and language_id = 2
                        and parent_id = $parent");
    $m->execute();


    foreach ($m->fetchAll() as $menu_row) {
        $m = $db->prepare("SELECT count(*) FROM administrator_menu where parent_id = $menu_row[id]");
        $m->execute();
        // The item is parent, so do recursion again
        if($m->fetchAll()[0][0] !== '0' && $level !== 0){ 
            echo "<li>" . $menu_row['label']."<ul>";
            drawMenu($db, $menu_row[0], $level - 1);
            echo "</ul></li>";
        }else{ // The item is a leaf or we reach the end level, i.e. base case, so do print the item label 
            echo "<li>" . $menu_row['label'] . "</li>";
        }

    }

}
?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<?php
echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 0); // level 0
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 1); // level 1
echo "</ul></div>";
echo "--------------------------------------------------------";
echo "<div> <ul>";
drawMenu($db, 0, 2); // level 2
echo "</ul></div>";
?>
</body>
</html>

绘制所有级别:

echo "<div> <ul>";
drawMenu($db, 0, null); // all levels
echo "</ul></div>";

drawMenu 函数的工作原理如下:

  • 首先,我们传递一个$db 对象来进行数据库查询,$parent 是树的开头,$level 是树的级别。
  • 该函数将首先选择给定$parent 的子代,然后循环遍历每个foreach ($m-&gt;fetchAll() as $menu_row) {...}。
  • 在循环中我们有两种情况:

    1. 该项目是叶子,即不是其他项目的父项,或者我们到达树的最后一层。这种情况称为基本情况,其中递归将停止并返回值echo "&lt;li&gt;" . $menu_row['label'] . "&lt;/li&gt;";

    2. 项目是父项,在这种情况下,我们再次调用drawMenu 函数,并将项目ID $menu_row[0] 作为父项,$level - 1 确保在到达关卡结束时停止。

测试代码并根据需要进行更改。

【讨论】:

  • 我也在尝试通过 PHP 制作引导菜单,您能否解释一下 $level 的设置位置/方式?我必须在我的数据库中添加一行吗?我的问题在这里,但我认为这是我的问题的解决方案。 stackoverflow.com/questions/49732477/… 编辑:没关系,它是在函数中设置的,我只是过度使用它!
猜你喜欢
  • 1970-01-01
  • 2012-01-20
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 2019-07-10
  • 2013-06-27
  • 1970-01-01
  • 2017-09-24
相关资源
最近更新 更多