Mailinglisten-Archive |
Hallo Jörn, Ich habe diesen Ansatz bereits in einem OpenSource Projekt implementiert und es funktioniert bis jetzt einwandfrei. Hier ist der Code der Methode die das implementiert: <?php class ppcTreeMenu { ... public function asList ($listItemFormat) { $selectQuery = "SELECT `node`.`name`, `node`.`link`, `node`.`alias`, COUNT(*)-1 AS `level` FROM `menu_items` AS `node`, `menu_items` AS `parents` " . "WHERE `node`.`lft` BETWEEN `parents`.`lft` AND `parents`.`rgt` AND " . "`node`.`menuId`={$this->menuId} AND `parents`.`menuId`={$this->menuId} GROUP BY `node`.`lft` ORDER BY `node`.`lft`"; $prevLevel = -1; $list = ""; foreach ($this->conn->query ($selectQuery, PDO::FETCH_OBJ) as $row) { if ($prevLevel == $row->level) { $list .= "\n</li>\n"; } else if ($prevLevel < $row->level) { $list .= "\n<ul>\n"; } else if ( ($prevLevel-$row->level) == 1) { $list .= "</li>\n</ul>\n</li>\n"; } else { // close the current node $list .= "</li>\n"; // close the levels $list .= str_repeat ("</ul>\n</li>\n", $prevLevel-$row->level); } $listItem = $listItemFormat; $listItem = str_replace ("%name", $row->name, $listItem); $listItem = str_replace ("%link", $row->link, $listItem); $listItem = str_replace ("%alias", $row->alias, $listItem); $list .= "<li>\n" . $listItem; $prevLevel = $row->level; } $list .= "\n</li>\n"; $list .= str_repeat ("</ul>\n</li>\n", $prevLevel); $list .= "</ul>\n"; return $list; } } ... } Vielleichts hilfts dir ja. MfG Jakob ?>
php::bar PHP Wiki - Listenarchive