Я разрабатываю веб-сайт с использованием 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 & 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); }
?>
Я думаю, что простейшая вещь для вас для кодирования будет чем-то вроде этой рекурсивной функции. Все, что вам нужно сделать, это разместить его на своей странице и убедиться, что у вас есть 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 .