2011-06-11 57 views
1

任何人都可以幫助我如何重建動態?動態菜單與數組從mysql

<?php 
    error_reporting (E_ALL); 
    $menu = array 
    (
     1 => array 
       (
        'text'  => 'Articles', 
        'class'  => 'articles', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 0 
       ), 
     2 => array 
       (
        'text'  => 'Users', 
        'class'  => 'users', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 0 
       ), 
     3 => array 
       (
        'text'  => 'Groups', 
        'class'  => 'groups', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 0 
       ), 
     4 => array 
       (
        'text'  => 'Settings', 
        'class'  => 'settings', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 0 
       ), 
     5 => array 
       (
        'text'  => 'Add new', 
        'class'  => 'add_article', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 1 
       ), 
     6 => array 
       (
        'text'  => 'Categories', 
        'class'  => 'categories', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 1 
       ), 
     7 => array 
       (
        'text'  => 'Add new', 
        'class'  => 'add_user', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 2 
       ), 
     8 => array 
       (
        'text'  => 'Delete', 
        'class'  => 'delete', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 1 
       ), 
     9 => array 
       (
        'text'  => 'Show', 
        'class'  => 'show', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 2 
       ), 
     10 => array 
       (
        'text'  => 'Last created', 
        'class'  => 'last', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 9 
       ), 
     11 => array 
       (
        'text'  => 'First created', 
        'class'  => 'first', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 9 
       ), 
     12 => array 
       (
        'text'  => 'All', 
        'class'  => 'all', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 9 
       ), 
     13 => array 
       (
        'text'  => 'None', 
        'class'  => 'none', 
        'link'  => '#', 
        'show_condition'=> TRUE, 
        'parent' => 9 
       ) 
    ); 

    function build_menu ($menu) 
    { 
     $out = '<div class="container4">' . "\n"; 
     $out .= ' <div class="menu4">' . "\n"; 
     $out .= "\n".'<ul>' . "\n"; 

     for ($i = 1; $i <= count ($menu); $i++) 
     { 
      if (is_array ($menu [ $i ])) 
        {  //must be by construction but let's keep the errors home 
      if ($menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == 0)     {  //are we allowed to see this menu? 

          $out .= '<li class="' . $menu [ $i ] [ 'class' ] . '"><a href="' . $menu [ $i ] [ 'link' ] . '">'; 
          $out .= $menu [ $i ] [ 'text' ]; 
          $out .= '</a>'; 
          $out .= get_childs ($menu, $i); 
          $out .= '</li>' . "\n"; 
         } 
        } 
        else 
        { 
         die (sprintf ('menu nr %s must be an array', $i)); 
        } 
        } 

     $out .= '</ul>'."\n"; 
     $out .= "\n\t" . '</div>'; 
     return $out . "\n\t" . '</div>'; 
    } 

    function get_childs ($menu, $el_id) 
    { 
     $has_subcats = FALSE; 
     $out = ''; 
     $out .= "\n".' <ul>' . "\n"; 
     for ($i = 1; $i <= count ($menu); $i++) 
     { 
        if ($menu [ $i ] [ 'show_condition' ] && $menu [ $i ] [ 'parent' ] == $el_id) 
        {  //are we allowed to see this menu? 
         $has_subcats = TRUE; 
         $add_class = (get_childs ($menu, $i) != FALSE) ? ' subsubl' : ''; 
         $out .= '<li class="' . $menu [ $i ] [ 'class' ] . $add_class . '"><a href="' . $menu [ $i ] [ 'link' ] . '">'; 
         $out .= $menu [ $i ] [ 'text' ]; 
         $out .= '</a>'; 
         $out .= get_childs ($menu, $i); 
         $out .= '</li>' . "\n"; 
        } 
       } 

     $out .= ' </ul>'."\n"; 
     return ($has_subcats) ? $out : FALSE; 
    } 

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Dynamic PHP/CSS menu by roScripts</title> 
    <link href="css/styles.css" rel="stylesheet" type="text/css" /> 
</head> 
<body> 
    <div style="width:700px;margin:100px auto"> 

     <h2>Dynamic PHP/CSS menu by <a href="http://www.roscripts.com" title="programming articles and tutorials" target="_blank">roScripts</a></h2> 
     <?= build_menu ($menu) ?> 
    </div> 
</body> 
</html> 

我的數據庫:

mysql> describe menuSystem; 
+-----------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-----------+--------------+------+-----+---------+-------+ 
| id  | int(11)  | NO | PRI | NULL |  | 
| title  | varchar(50) | NO |  | NULL |  | 
| class  | varchar(30) | NO |  | NULL |  | 
| link_url | varchar(100) | NO |  | NULL |  | 
| parent_id | int(11)  | NO |  | 0  |  | 
| show  | varchar(6) | NO |  | NULL |  | 
+-----------+--------------+------+-----+---------+-------+ 
6 rows in set (0.00 sec) 

我試試這個,但不工作:

$sql = "SELECT * FROM menuSystem ORDER BY id ASC"; 
    $res = mysql_query($sql) or die (mysql_error()); 

      if(mysql_num_rows($res) != 0) { 
        while($row = mysql_fetch_assoc($res)) { 
          $id = mysql_real_escape_string ($row['id']); 
          $title = mysql_real_escape_string ($row['title']); 
          $class = mysql_real_escape_string ($row['class']); 
          $link_url = mysql_real_escape_string ($row['link_url']); 
          $parent_id = mysql_real_escape_string ($row['parent_id']); 
          $show = mysql_real_escape_string ($row['show']); 
    $menu = array (
      "$id" =>  array 
          (
            'text'   =>  "$title", 
            'class'   =>  "$class", 
            'link'   =>  "$link_url", 
            'show_condition'=>  "$show", 
            'parent'  =>  "$parent_id" 
          ) 
        ); 

        } 

      } 
+0

你能解釋「動態」是什麼意思嗎? *請*重新格式化您的代碼。你可以使用'{}'按鈕來格式化一些文件,或者閱讀:http://stackoverflow.com/editing-help。刪除不需要的額外換行符和全部。你可以看到你的問題看起來如何。 – Nanne 2011-06-11 12:29:54

+0

我需要顯示數據庫中的所有菜單項。 我試着這個,但失敗(http://pastebin.com/Z7fRftiJ),雖然聲明只是回聲從數據庫最後resoult。 – Stefan 2011-06-11 12:46:07

回答

1

您好,這可能不是確切的回答你的問題,但我以前做過類似的事情,所以可能會有所幫助!基本上它是一個recurssive循環來構建基於初始父ID的網站樹,所以也許你可以考慮一下,並修改了一點

/** 
* build_site_tree 
* 
* @return void 
* @author Mike Waites 
**/ 
public function build_site_tree($parent_id) 
{ 
    return $this->find_children($parent_id); 
} 

/** end build_site_tree **/ 

// ----------------------------------------------------------------------- 

/** 
* find_children 
* Recursive loop to find parent=>child relationships 
* 
* @return array $children 
* @author Mike Waites 
**/ 
public function find_children($parent_id) 
{ 
    $this->benchmark->mark('find_children_start'); 

    if(!class_exists('Account_model')) 
     $this->load->model('Account_model'); 

    $children = $this->Account_model->get_children($parent_id); 

    /** Recursively Loop over the results to build the site tree **/ 
    foreach($children as $key => $child) 
    { 
     $childs = $this->find_children($child['id']); 

     if (count($childs) > 0) 
      $children[$key]['children'] = $childs; 
    } 

    return $children; 

    $this->benchmark->mark('find_children_end'); 
} 

/** end find_children **/ 

正如你可以看到它的非常基本只是爲了驗證這個想法