Как получить идентификатор узла из URL-адреса?
До сих пор я сталкивался с этими 3 функциями в Drupal 7, но я не совсем уверен, что такое разница между ними, и что больше подходит для получения идентификатора узла в функции препроцессора блока.
Можете ли вы дать мне представление?
5 ответов
Я не уверен, что разница между ними
-
menu_get_object () возвращает связанный с объектом объект с отображаемой в настоящее время страницей. Если код выполняется, когда Drupal показывает страницу example.com/node/1, то
menu_get_object()
вернет объект узла для узла, чей идентификатор равен 1; если отображаемая страница - example.com/user/1, тоmenu_get_object('user')
вернет объект пользователя для пользователя с идентификатором 1. -
menu_get_item () возвращает массив, содержащий индекс для каждого поля, содержащегося в таблице «menu_router». Это включает:
- путь: текущий путь обратного вызова меню
- load_functions: массив имен функций (например,
node_load
), который вызывается для загрузки объекта, соответствующего части текущего пути - access_callback: обратный вызов, который проверяет, имеет ли пользователь, который в настоящий момент вошел в систему, элемент меню
- page_callback: имя функции, отображающей страницу
- title: заголовок страницы, связанной с пунктом меню
-
drupal_lookup_path () - это функция, которая возвращает вам внутренний путь, связанный с псевдонимом, переданным как аргумент. Если «домашняя страница» является псевдонимом, связанным с example.com/node/1, то
drupal_lookup_path("homepage")
возвращает"node/1"
. Пути-псевдонимы могут быть связаны с любыми внутренними путями, а не только с путями узлов.
и который более подходит для получения идентификатора узла в функции препроцессора блока.
Если все, что вы хотите получить, - это идентификатор узла текущего узла, то вам просто нужно использовать следующий код:
if (arg(0) == 'node') {
$nid = arg(1);
}
Если вам нужно получить объект узла, вы можете использовать следующий код:
if ($node = menu_get_object()) {
// Use the node object.
}
Из этих фрагментов второй лучше, поскольку он возвращает правильный объект узла для внутренних путей, таких как node /1 /revisions /3 /view.
Имейте в виду, что некоторые функции препроцесса, такие как те, что для страницы, или узел, уже имеют $variables['node']
. Это означает, что в этих случаях вам просто нужно использовать следующий фрагмент в вашей функции препроцесса, не беспокоясь о том, какую функцию использовать.
if (isset($variables['node'])) {
// Check the node ID or other properties.
}
Для других функций препроцесса проверьте документацию, чтобы увидеть, есть ли какая-либо переменная, содержащая объект узла. Например, это относится к template_preprocess_comment()
, который делает $variables['node']
доступными для функций препроцесса для комментариев.
Как это делается в Drupal Core template_preprocess_page :
Линия 2267 theme.inc и далее:
if ($node = menu_get_object()) {
$variables['node'] = $node;
}
template_preprocess_page использует menu_get_object . После этого нужно только проверить, определен ли узел и получить $ node-> nid.
Одна вещь, которую вы должны быть осторожны, - это псевдоним пути.
drupal_get_normal_path($path)
, чтобы получить текущий путь, используйте системную переменную $_SERVER["REQUEST_URI"]
(Если вы находитесь на странице узла, вы можете вызвать $node->uri['path']
, это вернет путь без псевдонима. Затем снова, если вы находитесь на узле страницы, вы можете просто использовать $node->nid
.)
это приведет к возврату узла /XXXX
, попробуйте что-то вроде
$node_path = explode('/', drupal_get_normal_path($path));
$nid = $node_path[1];
arg(1);
Неплохой способ сделать это. arg () работает на внутреннем пути , поэтому на него не будут влиять псевдонимы путей.
В Drupal 8 вы можете получить аргументы url на основе того, что находится в маршрутизации.
Чтобы получить только один:
$nid = \Drupal::routeMatch()->getRawParameter('node');
Если вы планируете загрузить объект узла, вы можете просто получить его следующим образом:
$node = \Drupal::routeMatch()->getParameter('node');
Чтобы найти имена параметров, вы можете использовать:
$possible_parameters = \Drupal::routeMatch()->getParameters();