March 2, 2011

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();