Есть ли способ (кроме sql) получить mlid для данного nid в drupal? - PullRequest
5 голосов
/ 13 мая 2010

У меня есть узел, я хочу, чтобы это меню. Насколько я могу судить, node_load не включает его. Очевидно, что написать запрос для его нахождения по пути node/nid тривиально, но есть ли способ сделать это на Drupal?

Ответы [ 2 ]

6 голосов
/ 21 ноября 2012

если дерево меню имеет несколько уровней, sql кажется лучшим вариантом. ниже приведен пример для Drupal 7, где path - это что-то вроде 'node / x'

function _get_mlid($path, $menu_name) {

$mlid = db_select('menu_links' , 'ml')
->condition('ml.link_path' , $path)
->condition('ml.menu_name',$menu_name)
->fields('ml' , array('mlid'))
->execute()
->fetchField();
return $mlid;
}
3 голосов
/ 15 мая 2010

Модуль Узла меню предоставляет API для этого. Вы можете прочитать документацию (Doxygen) в коде. Я думаю, что необходимая вам функциональность обеспечивается методом menu_node_get_links($nid, $router = FALSE):

/**
 * Get the relevant menu links for a node.
 * @param $nid
 *   The node id.
 * @param $router
 *   Boolean flag indicating whether to attach the menu router item to the $item object.
 *   If set to TRUE, the router will be set as $item->menu_router.
 * @return
 *   An array of complete menu_link objects or an empy array on failure.
 */

Возвращается ассоциативный массив mlid => menu object. Возможно, вам нужен только первый, чтобы он выглядел примерно так:

$arr = menu_node_get_links(123);
list($mlid) = array_keys($arr);

В противном случае вы можете попробовать это предложение в ветке на форумах Drupal :

Используйте node/[nid] в качестве аргумента $ path для:

function _get_mlid($path) {
  $mlid = null;
  $tree =  menu_tree_all_data('primary-links');
  foreach($tree as $item) {
    if ($item['link']['link_path'] == $path) {
      $mlid = $item['link']['mlid'];
      break;
    }
  }
  return $mlid;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...