我正在嘗試使用PHP創建一個簡單的無序列表菜單。該列表從MySQL填充。我很難找到符合我特定需求的說明。簡單的PHP菜單與MPTTA層次
要求
- 我試圖避免自我參照的功能。
- 我想用一個查詢來提高性能。
- 我正在使用修改的預定樹遍歷算法來顯示菜單。
- 每行必須被列表項標記包圍。
- 列表必須打開和關閉,其中節點開始和結束
代碼:
CREATE TABLE IF NOT EXISTS `maj_topmenu` (
`menu_id` int(11) NOT NULL auto_increment,
`menu_title` varchar(100) NOT NULL default '',
`menu_url` varchar(200) NOT NULL default '',
`menu_level` int(10) NOT NULL default '0',
`parent_id` int(11) NOT NULL default '0',
`lft` int(10) NOT NULL,
`rgt` int(10) NOT NULL,
`displayorder` int(11) default NULL,
PRIMARY KEY (`menu_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
INSERT INTO `maj_topmenu` (`menu_id`, `menu_title`, `menu_url`, `menu_level`, `parent_id`, `lft`, `rgt`, `displayorder`) VALUES
(1, 'Home', '/home', 0, 0, 1, 2, 0),
(2, 'About Us', '/about', 0, 0, 5, 10, 10),
(3, 'News', '/news', 0, 0, 3, 4, 5),
(4, 'Blogs', '/viewblog', 0, 0, 11, 12, 15),
(5, 'Contact Us', '/contact', 0, 0, 13, 14, 20),
(6, 'Sub Menu 1', '/link1', 1, 2, 6, 9, 0),
(7, 'Sub Menu 2', '/link2', 2, 6, 7, 8, 0);
PHP部分
$topmenu = '';
$nodes=array();
$nlbr = "\n";
// Now, retrieve all descendants of the $root node
$sql="SELECT n.menu_title, n.menu_title, n.menu_url, n.parent_id, n.lft, n.rgt FROM maj_topmenu AS n, maj_topmenu AS p WHERE n.lft BETWEEN p.lft AND p.rgt AND p.parent_id = '0' ORDER BY n.lft";
$result = mysql_query($sql) or die(mysql_error());
$topmenu .= '<ul>' . $nlbr;
while ($row = mysql_fetch_array($result))
{
if (($row['rgt'] - $row['lft']) == 1)
{
// No child elements
if (sizeof($nodes) == 0)
{
// We're at the top with no children
$topmenu .= '<li>'.$row['lft'].' <a href="'.$row['menu_url'].'">'.$row['menu_title'].'</a> '.$row['rgt'].'</li>' . $nlbr;
continue;
}
else
{
// We're in the middle with no children; We'll need to end at least one branch
$topmenu .= '<li>'.$row['lft'].' <a href="'.$row['menu_url'].'">'.$row['menu_title'].'</a> '.$row['rgt'].'</li>' . $nlbr;
while ( ($row['rgt'] + 1) - end($nodes) == 0 )
{
$topmenu .= '</ul>' . $nlbr;
array_pop($nodes);
}
continue;
}
}
else
{
// Start a new branch
$topmenu .= '<li>'.$row['lft'].' <a href="'.$row['menu_url'].'">'.$row['menu_title'].'</a> '.$row['rgt'].'</li>' . $nlbr;
$topmenu .= '<ul>' . $nlbr;
// End leaf at this point later
$nodes[] = $row['rgt'];
}
}
$topmenu .= '</ul>';
我遇到的問題是,循環不會在適當的地方結束節點。如果我在三級分支上,它可能會結束太多或太少的列表。
此腳本稍後可用於廣泛的層次結構數據,這就是爲什麼我使用MPTTA進行此操作的原因,並且我試圖避免必須在多個級別進行查詢。
1.我試圖避免自引用函數。 ** 2。我試圖用一個查詢來提高性能效率。** ** 3。我正在使用修改的預定樹遍歷算法來顯示菜單。** ** 4。每行必須被列表項標籤包圍。** ** 5。列表必須在節點開始和結束時打開和關閉** – Tanoro 2011-06-06 14:58:42