PHP_club:Древовидное меню
Мне очень понадобилось древовидное меню на php. Погуглив, я нашел несколько вариантов, в основном на встроенных API различных CMS. Вот те которые меня заинтересовали
1. Как сделать иерархическое меню?
2. Мой взгляд на деревья в PHP
В этих решениях меня испугало одно - слишком много кода. Проанализировал, к моему дереву я применил следующие требования:
1. Бесконечная вложенность
2. 1 запрос к mysql
3. Минимум кода
Мое решение, это переработка выше предложенных реализаций.
function all()
{
//Функция возвращает многомерный ассоциативный массив записей
$parents = array(); $sql = "Select CMS_SitePages.NAME, CMS_SitePages.ID, CMS_SiteSubMenu.ID_SUBMENU, CMS_SiteSubMenu.ID_MENU From CMS_SitePages Inner Join CMS_SiteMenu CMS_SiteMenu1 On CMS_SiteMenu1.ID_PAGE = CMS_SitePages.ID Inner Join CMS_SiteSubMenu On CMS_SiteSubMenu.ID_SUBMENU = CMS_SiteMenu1.ID Inner Join CMS_SiteMeta On CMS_SitePages.ID_META = CMS_SiteMeta.ID"; $result = mysql_query($sql) OR die ( "
Error at line ".__LINE__.":
" .mysql_error(). "
SQL was: $sql
" );
while ($row = mysql_fetch_assoc($result))
{ $parents[$row['ID_SUBMENU']] = array("ID" => "".$row['ID_SUBMENU']."","IDPARENTS" => "".$row['ID_MENU']."", "NAME" => "".$row['NAME'].""); }
return $parents;
}
function build_LI($list, $parentid, $check, $ULclass, $LIclass)
{
//Этой функцией будем выводить дерево меню через списки
//$list - Массив со всеми элементами
//$parentid - ИД родителя
//$check - ID элемента которого нужно выделить $arr = array();
//Выбираем только ИД элементов
$brothers = array_keys($list);
echo '
- ';if($list[$val]["ID"]==$check)echo "".$list[$val]["NAME"]."";else echo $list[$val]["NAME"];build_LI($list, $list[$val]["ID"],$check,$ULclass, $LIclass);echo "
"; } function draw_menu()
{
//$check - ID элемента которого нужно выделить
$list = all(); $parentid = 0; $check = 8;
//CSS настройки
$ULclass = "subsortable";
$LIclass = "ui-state-default";
build_LI($list, $parentid, $check,$ULclass, $LIclass ); }
//Выводим меню draw_menu(); Таким образом у меня получилась
модель MVC
Контроллер - draw_menu();
Вид - build_LI();
Модель - all();