Я пытаюсь добавить динамическое рекурсивное меню списка навигации на сайт, над которым я работаю. Сценарий состоит в том, что в меню есть 2 уровня, связанные с родителем (preid).
Моя проблема в том, что я могу правильно отображать список 1-го уровня, однако я не могу правильно отобразить второй уровень. Я не уверен, где добавить теги UL и / UL для второго уровня.
Это то, что я после
<ul> <li>Item 1</li> <li>item 2</li> <li>item 3</li> <ul> <li>sub item 1</li> <li>sub item 2</li> </ul> <li>Item 4</li> <li>item 5</li> <ul> <li>sub item 1</li> <li>sub item 2</li> </ul> <li>item 6</li> </ul>
На самом деле это то, что я получаю с приведенным ниже кодом:
<ul> <li>item 1 <ul> </ul> </li> <li>item 2 <ul> <li>sub item 1</li> <ul> </ul> <li>sub item 2</li> <ul> </ul> </ul> </li> <li>Sports Injuries <ul> </ul> </li> </ul> </li> </ul>
Ниже приведен файл класса, который я использую для создания меню:
class Dynamic_Menu { function getConfig() { $this->DB_SERVER = 'localhost'; $this->DB_USER = '***'; $this->DB_PASS = '***'; $this->DB_NAME = '***'; } function __construct() { $this->getConfig(); $Conn = mysql_connect($this->DB_SERVER, $this->DB_USER, $this->DB_PASS); if (!$Conn) die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn)); $DB_select = mysql_select_db($this->DB_NAME, $Conn); if (!$DB_select) die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn)); } function select_row($sql) { //echo $sql . "<br />"; if ($sql!="") { $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error()); if ($result) { while($row = mysql_fetch_array($result)) $data[] = $row; } return $data; } } function recordCount($sql) { if ($sql!="") { $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error()); if ($result) { $cnt = mysql_num_rows($result); return $cnt; } } } function getChild($id) { $menu = ""; $str = ""; $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$id' "; $res = $this->select_row($s); $menu .= '<ul>'; for ($i=0;$i<count($res);$i++) { $cnt_of_child = $this->recordCount("SELECT * FROM vcms_sys_explorer where preid = '".$res[$i][eid]."' "); //if ($cnt_of_child > 0) // $str = ''; //else // $str = " (is sub menu item)"; $menu .= '<li>'. $res[$i][name].$str.'</li>'; $menu .= $this->getChild($res[$i][eid]); } $menu .= '</ul>'; return $menu; } function getMenu($parentid) { $menu = ""; $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$parentid' "; $res = $this->select_row($s); $menu .= '<ul>'; for ($i=0;$i<count($res);$i++) { $menu .= '<li>'.$res[$i][name].$this->getChild($res[$i][eid]).'</li>'; if ((count($res) - 1) > $i) { } } $menu .= '</ul>'; return $menu; } }
Я вызываю меню с помощью:
$menu = new Dynamic_Menu(); $menu->getMenu(1);
Может ли кто-нибудь помочь и объяснить, где мне нужно разместить метки уровня 2 UL и / UL. Я бил головой об этом в течение последних двух дней. Любая помощь будет принята с благодарностью, спасибо …
Во вложенном списке под-списки всегда будут содержаться в элементе списка – вот что делает их вложенными. Вы можете распечатать полный список только одной функцией, используя этот формат (в общем коде, но вы должны получить основную идею):
function get_list($parent) { $children = query('SELECT * FROM table WHERE parent_id = '.$parent); $items = array(); while($row = fetch_assoc($children)) { $items[] = '<li>'.$row['name'].get_list($row['id']).'</li>'; } if(count($items)) { return '<ul>'.implode('', $items).'</ul>'; } else { return ''; } }
И это даст вам список, структурированный правильно, как:
<ul> <li>Item 1</li> <li>Item 2 <ul> <li>Item 2.1</li> <li>Item 2.2</li> </ul> </li> </ul>
Все, хотя этот вопрос не совпадает с вопросом, который я опубликовал 2 дня назад, вот результат того, что я пытался делать с папками, а не с БД. Следующее будет перемещаться по каталогу и всем вспомогательным каталогам указанного пути $ и выплескивать результаты во вложенном не упорядоченном списке по завершении запуска скрипта. Надеюсь, поможет.
<?php function readDirs($path){ $dirHandle = opendir($path); echo "<ul>"; while ($item = readdir($dirHandle)) { $newPath = $path . "/" . $item; if (is_dir($newPath) && $item != '.' && $item != '..') { echo "<li><a href='$newPath'>$item</a>"; readDirs($newPath); } } echo "</li></ul>"; } $path = "./galleries"; readDirs($path); ?>