Dear Friends,
I want to create a dynamic database driven multilevel menu. i used the following class to do that. can any one help me reduce my codes and database queries?! my menu supports 5 levels.
*** my menu works now! but i think i used more queries?!
my SQL database:
CREATE TABLE `menus` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`LanguageID` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`LimitedTO` int(11) DEFAULT NULL,
`PageID` text COLLATE utf8_unicode_ci,
`TableName` text COLLATE utf8_unicode_ci,
`ParentID` int(11) NOT NULL DEFAULT '0',
`MenuTitle` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`MenuLink` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`SortOrder` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
//main menu Class
class mainmenu {
function display_children($parent) {
global $conn, $Security, $Language;
$sSqlWrk = "SELECT * from menus WHERE ParentID = ".$parent;
$rswrk =$conn->Execute($sSqlWrk);
$blockcontent = "<ul id=\"treemenu\" class=\"treeview\">";
while (!$rswrk->EOF) {
$child = ew_ExecuteScalar("SELECT COUNT(*) FROM menus WHERE ParentID = '".$rswrk->fields["ID"]."'");
if ($child == 0){
$blockcontent .= "<li><a href=\"".$rswrk->fields["MenuLink"]."\">".$rswrk->fields["MenuTitle"]."</a></li>";
}else{
$blockcontent .= "<li><a href=\"".$rswrk->fields["MenuLink"]."\">".$rswrk->fields["MenuTitle"]."</a><ul>";
//
$sSqlWrk2 = "SELECT * from menus WHERE ParentID = ".$rswrk->fields["ID"];
$rswrk2 =$conn->Execute($sSqlWrk2);
while (!$rswrk2->EOF) {
$child2 = ew_ExecuteScalar("SELECT COUNT(*) FROM menus WHERE ParentID = '".$rswrk2->fields["ID"]."'");
if ($child2 == 0){
$blockcontent .= "<li><a href=\"".$rswrk2->fields["MenuLink"]."\">".$rswrk2->fields["MenuTitle"]."</a></li>";
}else{
$blockcontent .= "<li><a href=\"".$rswrk2->fields["MenuLink"]."\">".$rswrk2->fields["MenuTitle"]."</a><ul>";
///
$sSqlWrk3 = "SELECT * from menus WHERE ParentID = ".$rswrk2->fields["ID"];
$rswrk3 =$conn->Execute($sSqlWrk3);
while (!$rswrk3->EOF) {
$child3 = ew_ExecuteScalar("SELECT COUNT(*) FROM menus WHERE ParentID = '".$rswrk3->fields["ID"]."'");
if ($child3 == 0){
$blockcontent .= "<li><a href=\"".$rswrk3->fields["MenuLink"]."\">".$rswrk3->fields["MenuTitle"]."</a></li>";
}else{
$blockcontent .= "<li><a href=\"".$rswrk3->fields["MenuLink"]."\">".$rswrk3->fields["MenuTitle"]."</a><ul>";
///
$sSqlWrk4 = "SELECT * from menus WHERE ParentID = ".$rswrk3->fields["ID"];
$rswrk4 =$conn->Execute($sSqlWrk4);
while (!$rswrk3->EOF) {
$blockcontent .= "<li><a href=\"".$rswrk4->fields["MenuLink"]."\">".$rswrk4->fields["MenuTitle"]."</a></li>";
$rswrk4->MoveNext();
}
$blockcontent .= "</ul></li>";
}
$rswrk3->MoveNext();
}
///
$blockcontent .= "</ul></li>";
}
$rswrk2->MoveNext();
}
//
$blockcontent .= "</ul></li>";
}
$rswrk->MoveNext();
}
$blockcontent .= "</ul>";
$blockcontent .= "<script type=\"text/javascript\">
ddtreemenu.createTree(\"treemenu\", true, 5)
</script>";
return $blockcontent;
}
}
//menu block
<?php
$mainmenu = new mainmenu;
$blockcontent = $mainmenu->display_children(0);
?>
can i use only one query to create this menu? any idea?
thanks \
Mansour