Нужна помощь в создании динамического меню

Я разрабатываю веб-сайт с использованием PHP, и это первый раз, когда я пытаюсь использовать динамическое меню.

То, что я делаю, я создал таблицу для страниц.

Структура таблицы выглядит следующим образом:

____________________________________________________________________________ |page_id|title|url|content|menu_title|show_on_navuigation|is_sub|parent_page| |_______|_____|___|_______|__________|___________________|______|___________| 

Здесь is_sub указывает, является ли это выпадающим меню какого-либо главного меню. и parent_page – главное меню подменю.

Теперь, что я хочу,

Я создал две родительские страницы:

About Us и Test

и 2 подменю: Test aboutus и testsub,

Тест aboutus является подразделением About Us, а testub является подтестом теста.

Как на самом деле должен выполняться запрос и цикл, чтобы меню выглядело идеально.

Заранее спасибо.

Это моя структура меню:

 <ul> <li class='has-sub'><a href='#'><span>About Us</span></a> <ul> <li><a href='corporateprofile'><span>Corporate Profile</span></a></li> <li class='last'><a href='visionandmission'><span>Vision &amp; Mission</span></a></li> </ul> </li> <li class='has-sub'><a href='#'><span>Business Services</span></a> <ul> <li><a href='recruitment'><span>Recruitment</span></a></li> <li><a href='training'><span>Training</span></a></li> <li><a href='executivesearch'><span>Executive Search</span></a></li> <li><a href='payroll'><span>Payroll</span></a></li> <li class='last'><a href='backgroundverification'><span>Background Verification</span></a></li> </ul> </li> <li class='has-sub'><a href='#'><span>Employers</span></a> <ul> <li><a href='enquiry'><span>Enquiry</span></a></li> <li><a href='jobdescription'><span>Job Description</span></a></li> <li><a href='employercontract'><span>Employer Contract</span></a></li> <li class='last'><a href='feedback'><span>Feedback</span></a></li> </ul> </li> <li class='has-sub'><a href='javascript:;'><span>Job Seeker</span></a> <ul> <li><a href='applyforjob'><span>Apply For Job/Register</span></a></li> <li><a href='careertips'><span>Career Tips</span></a></li> <li><a href='interview Questions'><span>Interview Questions</span></a></li> <li><a href='interviewprocess'><span>Interview Process</span></a></li> <li class='last'><a href='corporatedress'><span>Corporate Dress</span></a></li> </ul> </li> <li class='has-sub'><a href='#'><span>Franchise</span></a> <ul> <li class='last'><a href='#'><span>Franchise Enquiry Form</span></a></li> </ul> </li> <li class='last'><a href='#'><span>Contact us</span></a></li> </ul> <?php function displayMenu($parent_page_id) { $sql = "SELECT * FROM `pages` WHERE `parent_page` = '$parent_page_id'"; // sql $result = mysql_query($sql); if( mysql_num_rows($result) === 0 ) { // mysql_num_rows() is deprecated, but you are using mysql extension so that's why I show it here return true; // exit function } // else, continue to rest of function echo '<ul>'; while($row = mysql_fetch_assoc($result)) { // deprecated mysql php function here for simplicity echo '<li><a href="' . $result['url'] . '">' . $result['menu_title'] . '</a>'; // no closing </li> yet displayMenu($row['page_id']); // this is the recursive part echo '</li>'; // close the <li> from before the recursion } echo '</ul>'; } $get_base_menu = mysql_query("SELECT * FROM pages WHERE parent_page = 0"); while($fetch_base_menu = mysql_fetch_array($get_base_menu)) { $parent_page_id = $fetch_base_menu['page_id']; displayMenu($parent_page_id); } 

?>

Solutions Collecting From Web of "Нужна помощь в создании динамического меню"

Я думаю, что простейшая вещь для вас для кодирования будет чем-то вроде этой рекурсивной функции. Все, что вам нужно сделать, это разместить его на своей странице и убедиться, что у вас есть parent_page_id = 0 для элементов меню базового уровня. (Я использую parent_page_id вместо parent_page потому что я предполагаю, что это то, что вы имеете в виду, и это более понятно для ответа).

Вызов функции с аргументом «0» должен дать вам полное дерево меню.

 $trace = array(); function displayMenu($parent_page_id) { $sql = "SELECT * FROM `tbl_menu` WHERE `parent_page_id` = $parent_page_id"; // sql $result = mysql_query($sql); if( mysql_num_rows($result) === 0 ) { // mysql_num_rows() is deprecated, but you are using mysql extension so that's why I show it here $trace[] = "Page_id $parent_page_id has no children"; return true; // exit function } // else, continue to rest of function echo '<ul>'; while($row = mysql_fetch_assoc($result)) { // deprecated mysql php function here for simplicity $trace[] = "Entered while loop for page_id = $parent_page_id"; // not an error, just tracking echo '<li><a href="' . $row['url'] . '">' . $row['menu_title'] . '</a>'; // no closing </li> yet displayMenu($row['page_id']); // this is the recursive part echo '</li>'; // close the <li> from before the recursion } echo '</ul>'; } displayMenu(0); // call function for base level var_dump($trace); 

Больше информации:

Я исследовал эту тему раньше и имел хорошую ссылку на страницу на mysql.com с углубленным исследованием иерархических структур реляционных баз данных. Но когда я проверил, ссылка была сломана!

Но, я думаю, я нашел его на другом сайте, здесь:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Я настоятельно рекомендую попытаться уйти от использования модели списка Adjacency List и перейти к гораздо более легкому решению, например вложенному набору. Использование решения типа MPTT должно помочь вам значительно упростить управление иерархическими данными. Используя модель списка адресов, вы ограничены в определенной точке.

Я бы предложил изучить что-то по линии Zebra_MPTT или какую-то другую библиотеку MPTT. Ознакомьтесь с этой статьей об управлении иерархическими данными в MySQL .