熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

函數遞歸實現php和MySQL動態樹型菜單

2013-11-23 20:59:15  來源: MySQL 

  樹型菜單在很多桌面應用系統中都有非常廣泛的應用其主要優點是結構清晰利於使用者非常清楚的知道目前自己所在的位置但在web上樹型菜單的應用因為沒有理想的現成組件可以拿過來直接使用所以一般的情況下程序員主要是通過JavaScript來實現一些簡單的樹型結構菜單但這些菜單往往都是事先定好各菜單項目以及各菜單項目之間的層次關系不利於擴充一旦需要另一個菜單結構時往往還需要重新編寫因此使用起來不是很方便
  
  經過對函數遞歸的研究我發現這種樹型菜單可以通過遞歸函數使樹型菜單的顯示實現動態變化並沒有級數的限制下面就是我用phpMySQLJavaScript寫的一個動態樹型菜單的處理代碼如果大家有興趣的話就和我一起來看看我是如何實現的吧
  
  首先我們需要一個數據庫在這個數據庫中我們建立以下一張表
  
  CREATE TABLE menu (
  id tinyint() NOT NULL auto_increment
  parent_id tinyint() DEFAULT NOT NULL
  name varchar()
  url varchar()
  PRIMARY KEY (id)
  );
  
  這張表中 id 為索引
  parent_id 用來保存上一級菜單的id號如果是一級菜單則為
  name 為菜單的名稱也就是要在頁面上顯示的菜單內容
  url 如果某菜單為末級菜單則需要指定該連接的url地址這個字段就是用來保存此地址的其他非末級菜單該字段為空
  
  好了數據庫有了你就可以添加一些記錄了下面是我做測試的時候使用的一些記錄
  INSERT INTO menu VALUES ( 人事管理 );
  INSERT INTO menu VALUES ( 通訊交流 );
  INSERT INTO menu VALUES ( 檔案管理 );
  INSERT INTO menu VALUES ( 考勤管理 );
  INSERT INTO menu VALUES ( 通訊錄 );
  INSERT INTO menu VALUES ( 網絡會議 );
  INSERT INTO menu VALUES ( 新增檔案 );
  INSERT INTO menu VALUES ( 查詢檔案 );
  INSERT INTO menu VALUES ( 刪除檔案 );
  INSERT INTO menu VALUES ( 新增通訊記錄);
  INSERT INTO menu VALUES ( 查詢通訊記錄 );
  INSERT INTO menu VALUES ( 刪除通訊記錄 );
  INSERT INTO menu VALUES ( 召開會議 );
  INSERT INTO menu VALUES ( 會議查詢 );
  
  在添加記錄的時候一定要注意非一級菜單的parent_id一定要指定為上級菜單的ID號否則你的菜單是不會顯示出來的
  
  好了!有了數據庫下面就是通過phpJavaScript把菜單從數據庫中讀出來並顯示出來了
  
  JavaScript腳本
  function ShowMenu(MenuID)
  {
  if(MenuIDstyledisplay==none)
  {
  MenuIDstyledisplay=;
  }
  else
  {
  MenuIDstyledisplay=none;
  }
  }
  這個腳本很簡單就是用來響應點擊某個菜單被點擊的事件的
  
  CSS文件 <! 表格樣式 >
  TD {
  FONTFAMILY: Verdana 宋體; FONTSIZE: px; LINEHEIGHT: %; letterspacing:px
  }
  
  <! 超級連接樣式 >
  A:link {
  COLOR: #; FONTFAMILY: Verdana 宋體; FONTSIZE: px; TEXTDECORATION: none; letterspacing:px
  }
  A:visited {
  COLOR: #; FONTFAMILY: Verdana 宋體; FONTSIZE: px; TEXTDECORATION: none; letterspacing:px
  }
  A:active {
  COLOR: #; FONTFAMILY: Verdana 宋體; FONTSIZE: px; TEXTDECORATION: none; letterspacing:px
  }
  A:hover {
  COLOR: #ff; FONTFAMILY: Verdana 宋體; FONTSIZE: px; TEXTDECORATION: underline; letterspacing:px
  }
  
  <! 其他樣式 >
  Menu {
  COLOR:#; FONTFAMILY: Verdana 宋體; FONTSIZE: px; CURSOR: hand
  }
  
  定義了一些基本的樣式信息比如字體顏色超級連接的樣式等如果你想改變樣式的話只要修改這裡就行了!
  
  下面就是我的php頁面了!
  <html>
  <head>
  <link rel=stylesheet>
  <script language=JavaScript src=TreeMenujs></script>
  </head>
  <body>
  <?php
  //基本變量設置
  $GLOBALS[ID] =; //用來跟蹤下拉菜單的ID號
  $layer=; //用來跟蹤當前菜單的級數
  
  //連接數據庫
  $Con=mysql_connect(localhostroot);
  mysql_select_db(work);
  
  //提取一級菜單
  $sql=select * from menu where parent_id=;
  $result=mysql_query($sql$Con);
  
  //如果一級菜單存在則開始菜單的顯示
  if(mysql_num_rows($result)>) ShowTreeMenu($Con$result$layer$ID);
  
  //=============================================
  //顯示樹型菜單函數 ShowTreeMenu($con$result$layer)
  //$con數據庫連接
  //$result需要顯示的菜單記錄集
  //layer需要顯示的菜單的級數
  //=============================================
  function ShowTreeMenu($Con$result$layer)
  {
  //取得需要顯示的菜單的項目數
  $numrows=mysql_num_rows($result);
  
  //開始顯示菜單每個子菜單都用一個表格來表示
  echo <table cellpadding= cellspacing= border=>;
  
  for($rows=;$rows<$numrows;$rows++)
  {
  //將當前菜單項目的內容導入數組
  $menu=mysql_fetch_array($result);
  
  //提取菜單項目的子菜單記錄集
  $sql=select * from menu where parent_id=$menu[id];
  $result_sub=mysql_query($sql$Con);
  
  echo <tr>;
  //如果該菜單項目有子菜單則添加JavaScript onClick語句
  if(mysql_num_rows($result_sub)>)
  {
  echo <td width=><img src=foldergif border=></td>;
  echo <td class=Menu onClick=javascript:ShowMenu(Menu$GLOBALS[ID]);>;
  }
  else
  {
  echo <td width=><img src=filegif border=></td>;
  echo <td class=Menu>;
  }
  //如果該菜單項目沒有子菜單並指定了超級連接地址則指定為超級連接
  //否則只顯示菜單名稱
  if($menu[url]!=)
  echo <a $menu[url]>$menu[name]</a>;
  else
  echo $menu[name];
  echo
  </td>
  </tr>
  ;
  
  //如果該菜單項目有子菜單則顯示子菜單
  if(mysql_num_rows($result_sub)>)
  {
  //指定該子菜單的ID和style以便和onClick語句相對應
  echo <tr id=Menu$GLOBALS[ID]++ style=display:none>;
  echo <td width=> </td>;
  echo <td>;
  //將級數加
  $layer++;
  //遞歸調用ShowTreeMenu()函數生成子菜單
  ShowTreeMenu($Con$result_sub$layer);
  //子菜單處理完成返回到遞歸的上一層將級數減
  $layer;
  echo </td></tr>;
  }
  //繼續顯示下一個菜單項目
  }
  echo </table>;
  }
  ?>
  </body>
  </html>
  
  在上面的php頁面裡面我定義了一個函數ShowTreeMenu()通過這個函數的調用會從數據庫中遞歸的調出每個菜單項目並顯示在頁面上了

From:http://tw.wingwit.com/Article/program/MySQL/201311/29410.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.