Добрый день.
Скажите пожалуйста, есть ли функция, которая бы получала параметрами родительский элемент меню, элемент для сортировки, еще что-то, а возвращала бы массив, содержащий элементы подменю, удовлетворяющие этим условиям ?
К сожалению, в api я такую функцию не обнаружил. И в настоящее время решил задачу с помощью обычного sql-запроса из таблицы menu_links, но чувствую, что это не совсем правильный путь.
Комментарии
Добрый день!
Ну как у Вас есть подвижки в решении данного вопроса?
Поделитесь, пожалуйста, вашим текущим решением.
Добрый день.
Выкладываю фрагмент кода, который берет дочерние элементы меню, если известен код родительского элемента
// Причем, здесь делается связь с таблицей алиасов узлов 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, но, к сожалению, не было времени копаться в документации,
а с ходу стандартные решения найти не получилось.
Но тем не менее, задачу по отображению списка дочерних элементов меню он решил.