duansaoguan7955 2019-04-12 16:18
浏览 69
已采纳

我无法提升下一个级别

I found this code to implement a dynamic recursive menu, but I would like increment the levels, for example:

Level 1: Item 1
 Level 2: Item 1.1
Level 1: Item 2
 Level 2: Item 2.1
  Level 3: Item 2.1.1
 Level 2: Item 2.2
Level 1: Item 3
<?php
require_once __DIR__ . '/../conn/conn.php';
?>
<html>
<head>
    <meta charset="utf-8">
    <title>Title</title>

    <!-- Bootstrap Core CSS -->
    <link href="../vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

    <!-- MetisMenu CSS -->
    <link href="../vendor/metisMenu/metisMenu.min.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link href="../dist/css/sb-admin-2.css" rel="stylesheet">

    <!-- Custom Fonts -->
    <link href="../vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">

</head>

<body>
    <div class="navbar-default sidebar" role="navigation">
        <div class="sidebar-nav navbar-collapse">

            <?php
            //Recursive php function
            class MenuItem {
                /** @var int */
                public $idmenu;
                /** @var int */
                public $idmenu_parent;
                /** @var string */
                public $desc_menu;
                /** @var string */
                public $url_menu;
                /** @var int */
                public $ordem;
                /** @var array */
                public $sons = array();

                /**
                 * HTML.
                 */

                public

                function getHtml() { 

                    $html = '<li><a href="' . $this->url_menu . '"><i class="' . $this->icone_menu . '"></i> ' . $this->desc_menu;

                    if ( !empty( $this->sons ) ) {
                        $html .= '<span class="fa arrow"></span>';

                    }
                    $html .= '</a>';

                    if ( !empty( $this->sons ) ) {

                        $html .= '<ul class="nav nav-second-level" ' . $i . '>';

                        foreach ( $this->sons as $son ) {

                            $html .= $son->getHtml();
                        }
                        $html .= '</ul>'; 

                    } 
                    $html .= '</li>';
                    return $html;
                }
            }

            $pdo = new PDO( 'mysql:dbname=pbl;host=localhost', 'root', '' );

            // menu items
            $rs = $pdo->query( "SELECT * FROM menu ORDER BY idmenu" );
            // temp list
            $menu_tmp = array();
            // class
            $rs->setFetchMode( PDO::FETCH_CLASS, 'MenuItem' );
            // item menu
            while ( $row = $rs->fetch() ) {
                // temp list
                // index id menu
                $menu_tmp[ $row->idmenu ] = $row;

            }
            // indexed list
            // sons in parents
            foreach ( $menu_tmp as $item ) {
                // id parent
                if ( !empty( $item->idmenu_parent ) ) {
                    // sons in parent
                    $menu_tmp[ $item->idmenu_parent ]->sons[] = $item;
                }
            }

            // final list
            $menu_final = array();
            // only parent
            foreach ( $menu_tmp as $menu ) {
                if ( empty( $menu->idmenu_parent ) ) {
                    $menu_final[] = $menu;
                }
            }

            // result
            echo '<ul class="nav" id="side-menu">';
            foreach ( $menu_final as $menu ) {              
                echo $menu->getHtml();
            }
            echo '</ul>';
            ?>
        </div>
    </div>

    <!-- jQuery -->
    <script src="../vendor/jquery/jquery.min.js"></script>

    <!-- Bootstrap Core JavaScript -->
    <script src="../vendor/bootstrap/js/bootstrap.min.js"></script>

    <!-- Metis Menu Plugin JavaScript -->
    <script src="../vendor/metisMenu/metisMenu.min.js"></script>

    <!-- Custom Theme JavaScript -->
    <script src="../dist/js/sb-admin-2.js"></script>

</body>
</html>

But the result is this:

<html>
<head>
<meta charset="utf-8">
<title>Title</title>

<!-- Bootstrap Core CSS -->
<link href="../vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

<!-- MetisMenu CSS -->
<link href="../vendor/metisMenu/metisMenu.min.css" rel="stylesheet">

<!-- Custom CSS -->
<link href="../dist/css/sb-admin-2.css" rel="stylesheet">

<!-- Custom Fonts -->
<link href="../vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">
</head>

<body>
<div class="navbar-default sidebar" role="navigation">
  <div class="sidebar-nav navbar-collapse">
    <ul class="nav" id="side-menu">
      <li><a href="#"><i class="fa fa-wrench fa-fw"></i> Item 1<span class="fa arrow"></span></a>
        <ul class="nav nav-second-level">
          <li><a href="menu.php"><i class="fa fa-bars fa-fw"></i> Item 1.1</a></li>
        </ul>
      </li>
      <li><a href="#"><i class="fa fa-table fa-fw"></i> Item 2<span class="fa arrow"></span></a>
        <ul class="nav nav-second-level">
          <li><a href="#"><i class=""></i> Item 2.1<span class="fa arrow"></span></a>
            <ul class="nav nav-second-level">
              <li><a href="bom.php"><i class=""></i> Item 2.1.1</a></li>
              <li><a href="mirgor.php"><i class=""></i> Item 2.1.2</a></li>
            </ul>
          </li>
          <li><a href="#"><i class=""></i> Item 2.2<span class="fa arrow"></span></a>
            <ul class="nav nav-second-level">
              <li><a href="etd2.php"><i class=""></i> Item 2.2.1</a></li>
            </ul>
          </li>
        </ul>
      </li>
      <li><a href="http://brmns066:9191/"><i class="fa fa-print fa-fw"></i> Item</a></li>
      </li>
    </ul>
  </div>
</div>

<!-- jQuery --> 
<script src="../vendor/jquery/jquery.min.js"></script> 

<!-- Bootstrap Core JavaScript --> 
<script src="../vendor/bootstrap/js/bootstrap.min.js"></script> 

<!-- Metis Menu Plugin JavaScript --> 
<script src="../vendor/metisMenu/metisMenu.min.js"></script> 

<!-- Custom Theme JavaScript --> 
<script src="../dist/js/sb-admin-2.js"></script>
</body>
</html>

I would like increment this code:

<ul class="nav nav-second-level">
              <li><a href="bom.php"><i class=""></i> Item 2.1.1</a></li>
              <li><a href="mirgor.php"><i class=""></i> Item 2.1.2</a></li>
            </ul>

to:

<ul class="nav nav-third-level">
              <li><a href="bom.php"><i class=""></i> Item 2.1.1</a></li>
              <li><a href="mirgor.php"><i class=""></i> Item 2.1.2</a></li>
            </ul>

</div>
  • 写回答

1条回答 默认 最新

  • duanmangxie7131 2019-04-12 21:56
    关注

    Add an '$order' property to your class (Or perhaps is it already the purpose of this '$ordem' property that is already defined but not used.)

    Give $order a default value of 1 then, for every son of a MenuItem, increment 1 to this value :

    // sons in parents
    foreach ( $menu_tmp as $item ) {
        // id parent
        if ( !empty( $item->idmenu_parent ) ) {
            // sons in parent
            $item->order = $menu_tmp[ $item->idmenu_parent ]->order + 1;
            $menu_tmp[ $item->idmenu_parent ]->sons[] = $item;
        }
    }
    

    Then, you have to check the value of $order and choose the nav class accordingly :

    if ( !empty( $this->sons ) ) {
        switch($this->order) {
            case 1:
                $html .= '<ul class="nav nav-second-level" ' . $i . '>';
            case 2:
                $html .= '<ul class="nav nav-third-level" ' . $i . '>';
            case 3:
                $html .= '<ul class="nav nav-fourth-level" ' . $i . '>';
            default:
                $html .= '<ul class="nav nav-'.($this->order + 1).'-level" ' . $i . '>';
        }
    
        foreach ( $this->sons as $son ) {
    
            $html .= $son->getHtml();
        }
        $html .= '</ul>'; 
    
    }
    

    If you can choose freely the name of your nav classes, I suggest you replace all the switch by the expression I write in the 'default' case (But that is a matter of personnal taste.)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了