使用PHP类构建菜单系统

时间:2013-11-28 16:38:18

标签: php oop

更新2 ::

这是我现在从该功能获得的输出:

 <nav>
  <ul> //UL 1
       <ul> //UL 2
        <a href="/">menu link 1</a>

        <li><a href="/login">login</a></li>
        <li>
            <ul><a href="/sub3">sublink3</a></ul>
        </li>
        <li><a>menu link 3</a></li>

        <li>
            <ul>
                <a href="/sub1">sublink1</a>
                    <li><a href="/sub2">sublink2</a></li>
            </ul>
        </li>
        <li><a href="/path4">menu link 4</a></li>
        <li><a href="/path5">menu link 5</a></li>
        <li>
            <ul>
                <a href="/sub5a">sublink5a</a>
                <li><a href="/sub5b">sublink5b</a></li>
                <li><a href="/sub5c">sublink5c</a></li>
                <li><a href="/sub5d">sublink5d</a></li>
            </ul>
        </li>
    </ul> //End of UL 2

    <ul></ul> //dont not why this is here?
  </ul> //End of UL 1
</nav>

更新的 好的,我已经重新移动了构造,这就是我尝试显示菜单的方式:

     <?php include('./includes/menu.php'); ?>

     <h1>HEADER FILE TITLE TEST</h1>

     <?php  

       $build = new Menu;
       var_dump($build->DisplayMenu());

     ?>

我主要只使用CakePHP来构建网站,但我正在努力将我的PHP技能提升到一个新的水平。所以我正在研究其他框架和OOP(我之前从未在PHP中使用过)。所以我为自己设置了一个构建菜单系统的小任务,可以从数据库中控制,例如标题和路径链接来自我的数据库。

当我刚刚构建它有一个函数将我的所有菜单系统项目放在一个数组中然后使用打印调用来显示菜单,然后我只是在我需要该文件的页面上调用该函数时,这工作正常。

但我认为这不是最好的方法,所以我想把它变成一个类,所以我在我的函数周围调用一个类,然后将print调用更改为return。当我转换它时,我从类/函数得到的是一个NULL答案。所以我做了一些研究,并重新阅读了很多关于如何在魔术'构造'函数中声明一个数组。

但现在我很困惑,这应该在我的菜单功能内还是在外面?只是通过添加构造函数,它开始显示'string(9)' - 我不知道为什么?这是我的代码:

 //Menu Include file
 class Menu {
   public $testforme = "dfdfdfdf"; //Just a test to see how to call somedata

   public function DisplayMenu() {
     $DBConn = getConnection(); //Set new database connection
     $SQLMainMenu = "SELECT * FROM menu"; //Get Menu setting from database
   //$MenuBuild[] = NULL; //Open array for menu to save data into

function __construct($MenuBuild = array()) {
 //not sure what to put here??? 

}

try {
    $MenuBuild[] = '<nav><ul>';

    //Foreach loop for all main menu links
    foreach ($DBConn->query($SQLMainMenu) as $MainMenu) {
        $MainMenuID = $MainMenu['id'];
        $MainMenuPath = $MainMenu['linkpath'];
        $MainMenuSublinkCounts = $MainMenu['sublinks'];
        $SQLSubMenu = "SELECT * FROM submenu WHERE menu_id = $MainMenuID";          

        if ($MainMenuPath == 'NULL') {
            $MenuBuild[] =  '<li><a>' .$MainMenu['name'] .'</a>';
        } else {
            $MenuBuild[] =  '<li><a href="'.$MainMenuPath.'">' .$MainMenu['name'] .'</a>';
        }

        if ($MainMenuSublinkCounts >=1) { $MenuBuild[] = '<ul>'; }

        //Foreach loop to build all inner links for menu
        foreach ($DBConn->query($SQLSubMenu) as $SubMenu) {
            $SubLinkMenuIDs = $SubMenu['menu_id'];
            $SubLinkTitles = $SubMenu['name'];
            $SubLinkPaths = $SubMenu['linkpath'];

            if ($SubLinkMenuIDs == $MainMenuID) { 
                                    $MenuBuild[] = '<li><a href="'.$SubLinkPaths.'">'. $SubLinkTitles . '</a></li>'; }
        } //End of inner foreach loop

        if ($MainMenuSublinkCounts >=1) { 
                               $MenuBuild[] = '</ul>'; 
                     }

        $MenuBuild[] = '</li>';

    } //End of foreach loop 

    $MenuBuild[] = '</ul></nav>';

    //Print the Array that holds the menu.
    foreach ($MenuBuild as $MenuKey => $MenuData) { 
                 $MenuSystem = $MenuBuild[$MenuKey]; return $MenuSystem; 
            }

 } catch(PDOException $e) {
    echo $e->getMessage();
 }

   } //End of function DisplayMenu

  } //end of class

现在我使用PDO连接到我的数据库,它工作正常,它在另一个文件中都包含在内。

请告诉我任何好的帮助网站,我在这里阅读了很多问题/答案。

还请你放轻松吗?这是我第一次使用OOP PHP。

如果我没有做正确的事情,按照我建立菜单的方式,请指出任何问题:)。

感谢格伦。

1 个答案:

答案 0 :(得分:0)

好的,这是给你的,但你真的需要做更多的研究才能做出类似的事情

我的方法封装了一些功能,但看起来非常清楚它只是通过查看它的方向。请随时提出任何问题

(REREedited)包含/ menu.php

<?php
class Menu {
  private $db;
  private $main;
  public function __construct($db=null) {
    $this->db = $db ? $db : getConnection();
    $q = 'SELECT id,name,linkpath,sublinks FROM menu';
    $this->main = $this->db->query($q);
  }
  public function displayMenu() {
    $items = array();
    foreach ($this->main as $row) {
      $path = $row['linkpath'];
      $link = self::link($row['name'],$path==='NULL'?null:$path);
      // if there is a submenu, concatenate to with the "parent" into the same "item"
      if ($row['sublinks'] > 0) $link .= $this->subMenu($row['id']);
      $items[] = $link;
    }
    // returns the whole nav menu.
    return '<nav>'.self::lists(array_filter($items)).'</nav>';
  }
  private function subMenu($id) {
    $q = 'SELECT name,linkpath FROM submenu WHERE menu_id = ';
    $sub = array();
    foreach ($this->db->query($q.$id) as $row) {
      $sub[] = self::link($row['name'],$row['linkpath']);
    }
    return self::lists(array_filter($sub));
  }
  static function link($content, $href) {
    return '<a '.($href?'href="'.$href.'"':'').'>' .$content.'</a>';
  }
  static function lists(array $items) {
    if (!$items) return null;
    return '<ul><li>'.implode('</li><li>',$items).'</li></ul>';
  }
}

test.php的

<?php include('./includes/menu.php'); ?>
<h1>HEADER FILE TITLE TEST</h1>
<?php
try {
  $build = new Menu;
  echo $build->displayMenu();
} catch (Exception $e) {
  echo $e->getMessage().PHP_EOL.$e->getTraceAsString();
}
?>