Какой самый чистый способ получить NID текущего узла из модуля (НЕ шаблон)?

Я просмотрел этот старый поток на drupal.org , и это просто отводит голову вокруг. Вытащить путь и попытаться разобрать NID изнутри? Там должен быть лучший путь.

И такие решения, как

global $node;
$nid = $node->nid;

не работают в моем настраиваемом модуле (хотя мне говорят, что они работают в шаблонах?). Нет ошибки или чего-то еще, она просто создает узел $ node с нулевым значением.

Похоже, должно быть что-то действительно очевидное, что мне не хватает.

Итак, как вы получаете NID текущего узла без шаблона, следуя рекомендациям и строя достаточно надежный модуль?

21 голос | спросил beth 26 Mayam12 2012, 01:24:58

7 ответов


46

Предполагая, что ваш код запущен для страницы узла, методы, которые я вижу чаще всего в модулях core /contrib, либо используют menu_get_object() или arg() :

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

или

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

Я лично предпочитаю первый метод (даже если назначение в состоянии не считается хорошей идеей для некоторых людей), но оба они абсолютно верны.

ответил Clive 26 Mayam12 2012, 01:27:59
5

Самый простой способ сделать это в Drupal 8, поскольку arg () больше не работает:

$path_args = explode('/', current_path());
print $path_args[1];

Изменить запись

ответил Pooya Sanooei 7 J000000Monday14 2014, 17:12:23
2

arg(0) возвращает 'node' и arg(1) возвращает узел nid.

if (arg(0) == 'node' && is_numeric(arg(1))) {
  $nid = arg(1);
}
ответил Sébastien Gicquel 12 J0000006Europe/Moscow 2017, 11:13:34
1

Это помогло мне: http://www.webomelette.com /node-id-nid-url-path-alias - Перейдите в раздел Content и filter down, чтобы найти контент, для которого вы хотите увидеть идентификатор узла, и наведите указатель мыши на ссылку «Изменить». Посмотрите на гиперссылку, которую ваш браузер сообщает вам, что она будет следовать, если вы нажмете Edit.

ответил Ana 24 +04002014-10-24T05:30:30+04:00312014bEurope/MoscowFri, 24 Oct 2014 05:30:30 +0400 2014, 05:30:30
0

Второй метод в текущем принятом ответе является самым чистым в D7. Первый ответ:

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

является только визуально более чистым. Фактически, menu_get_object() вызывает довольно много кода и может привести к непредвиденным ошибкам. Я использовал его внутри функции hook_node_grants() и столкнулся с ошибкой PHP Fatal:

  

Достигнут максимальный уровень вложенности функции «256», прерванный!

Объяснение, найденное в https://drupal.stackexchange.com/a/69232/9158

  

Бесконечный цикл, который вы замечаете, вызван тем, что   menu_get_object() заставляет Drupal проверять текущего зарегистрированного пользователя   имеет доступ к узлу, что приводит к   hook_node_grants(), который вызывает menu_get_object(),   который вызывает вашу реализацию hook_node_grants() для вызова   снова, который ...

Это было решено с помощью второго метода:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}
ответил Jan Ehrhardt 28 ThuEurope/Moscow2017-12-28T16:33:04+03:00Europe/Moscow12bEurope/MoscowThu, 28 Dec 2017 16:33:04 +0300 2017, 16:33:04
-1

Другой вариант, в D7:

function _my_module_get_nid() {
  $path_args = explode('/', current_path());
  //$nid = $path_args[1];
  if(is_int($path_args)) {
    return($path_args[1]);
  }
  // Log that we failed to load a NID.
  else {
    watchdog('my_module', 'Unable to gather NID at: ' . current_path(),  WATCHDOG_WARNING, NULL);
  return FALSE;
  }
}

Если вы планируете использовать функцию вне своего модуля, не используйте начальную букву _ в начале имени функции.

ответил sheldonkreger 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 16 Sep 2014 03:04:52 +0400 2014, 03:04:52
-1
<?php
if (isset($node->nid) && count($node->nid) > 0){
  $mynodeid = $node->nid;
}
?>
ответил cptstarling 16 Jam1000000amFri, 16 Jan 2015 11:43:09 +030015 2015, 11:43:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132