Drupal hook_menu_alter текущие проблемы с узлами - PullRequest
1 голос
/ 30 ноября 2011

Я разрабатываю новый модуль, и в моем hook_menu_alter () мне нужно обнаружить узел, просматриваемый в данный момент.

Вместо использования arg(1) для извлечения идентификатора узла из URL, я обнаружил, что могу использовать menu_get_object ().

Следующий код работает в моем hook_init (), но не в hook_menu_alter ():

$node = menu_get_object();
dpm($node);

Может кто-нибудь предложить некоторое представление о том, почему это не работает и как получить информацию о текущем узле в hook_menu_alter ()?

Спасибо.

1 Ответ

2 голосов
/ 30 ноября 2011

Вывод hook_menu, hook_menu_alter и т. Д. Кэшируется, поэтому эти функции будут вызываться только после очистки кеша, а не для каждой загрузки страницы. Если подумать, если бы меню перестраивались при каждой загрузке страницы, производительность сайта значительно снизилась бы.

Таким образом, когда вызывается hook_menu_alter (который не будет на странице узла), для menu_get_object() не будет узла, который бы вам дал. Способ справиться с этими вещами заключается в обратном вызове страницы / доступа для пункта меню:

function mymodule_menu_alter(&$items) {
  $items['some/path']['page callback'] = 'mymodule_page_callback';
}

function mymodule_page_callback() {
  // This is a live page so menu_get_object() is now available
  $node = menu_get_object();
}

Из вашего комментария я думаю, что вы пытаетесь запретить доступ к определенным узлам на основе некоторых критериев. Для этого вы захотите реализовать свой собственный обратный вызов для доступа к уже существующему пути меню node/%. Примерно так:

function mymodule_menu_alter(&$items) {
  $items['node/%node']['access callback'] = 'mymodule_access_callback';
}

function mymodule_access_callback($node) {
  if ($node->type == 'group') {
    if (some_function_that_determines_access($node)) {
      return TRUE;
    }

    return FALSE;
  }

  return node_access('view', $node);
}
...