Функция для получения элементов подменю

Главные вкладки

Аватар пользователя roman-yrv roman-yrv 11 февраля 2013 в 12:11

Добрый день.

Скажите пожалуйста, есть ли функция, которая бы получала параметрами родительский элемент меню, элемент для сортировки, еще что-то, а возвращала бы массив, содержащий элементы подменю, удовлетворяющие этим условиям ?

К сожалению, в api я такую функцию не обнаружил. И в настоящее время решил задачу с помощью обычного sql-запроса из таблицы menu_links, но чувствую, что это не совсем правильный путь.

Комментарии

Аватар пользователя komandante55 komandante55 11 марта 2013 в 9:55

Добрый день!
Ну как у Вас есть подвижки в решении данного вопроса?
Поделитесь, пожалуйста, вашим текущим решением.

Аватар пользователя roman-yrv roman-yrv 11 марта 2013 в 11:10

Добрый день.
Выкладываю фрагмент кода, который берет дочерние элементы меню, если известен код родительского элемента

// Получение списка дочерних элементов по коду родительского
// Причем, здесь делается связь с таблицей алиасов узлов url_alias, чтобы сразу их получить

   $sql='select ml.mlid, ml.link_title, ml.link_path, ua.alias '.  
        'from {menu_links} ml '.
        'left join {url_alias} ua '.
        'on ml.link_path=ua.source '.
        'where (ml.hidden=0) and (ml.menu_name=:menu_name) and (ml.plid=:parent) '.
        'order by ml.weight ';
   
// id родительского элемента (пункта главного меню)

   $parent_item_id=100; // Пусть будет, к примеру, 100
   
   $result=db_query($sql,array(':parent'=>$parent_item_id, ':menu_name' => 'main-menu'));
   
   // Формируем в цикле список дочерних элементов меню
   foreach ($result as $record) {
     
      // Добавить те пункты меню, которые ссылаются на опубликованные узлы
      $sql_pub='select count(nid) from {node} where nid=:nid and `status`=1';
 
      $cnt_nodes_pub=db_query($sql_pub,array(':nid'=>$nid))->fetchField();
     
      // Если узел, на который ссылается элемент меню, опубликован, то его отображаем
      if ($cnt_nodes_pub>0)
      {
        // Если узел имеет прописанный алиас, то прописываем его, иначе - адрес по умолчанию "node/ID узла"
        if ($record->alias!="")
          $href=$record->alias;
        else
          $href=$record->link_path;

        // Если дочерний элемент меню ссылается на текущую страницу, то обрамляем дочерний элемент стилем,
        // чтобы отображался чуть-чуть по-друому  
        if ($record->link_path==current_path())
          print '     <li><span class="active">'.$record->link_title.'</span></li>';
        else
          print '     <li>'.l($record->link_title, $href).'</li>';
      }
   }

Как-то так.

Опять же, я уверен, что с точки зрения логики Drupal данный код содержит кучу ошибок и т.д. Также уверен,
что некоторые вещи реализуются с помощью функций API Drupal, но, к сожалению, не было времени копаться в документации,
а с ходу стандартные решения найти не получилось.

Но тем не менее, задачу по отображению списка дочерних элементов меню он решил.