Как я могу получить идентификатор узла из URL?

47

До сих пор я сталкивался с этими тремя функциями в Drupal 7, но я не совсем уверен, в чем разница между ними, и какая из них больше подходит для получения идентификатора узла в функции предварительной обработки блока.

Можете ли вы дать мне какое-либо понимание?

silkAdmin
источник
Вы делаете это в node.tpl.php или что-то в этом роде? Если да, вы можете использовать $ node-> nid.
Барт
Нет, я делаю это в функции предварительной обработки блока, хотя блок печатается на странице узла.
silkAdmin

Ответы:

63

Я не совсем уверен, какая разница между ними

  • menu_get_object () возвращает объект, связанный с отображаемой в данный момент страницей. Если код выполняется, когда Drupal показывает страницу example.com/node/1, он menu_get_object()вернет объект узла для узла, чей ID равен 1; если отображается страница example.com/user/1, то menu_get_object('user')будет возвращен объект пользователя для пользователя, чей ID равен 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.
}

Из этих фрагментов второй лучше, так как он возвращает правильный объект узла для внутренних путей, таких как представление узла / 1 / revisions / 3 /.

Имейте в виду, что некоторые функции предварительной обработки, такие как функции для страницы или узла, уже имеют $variables['node']. Это означает, что в этих случаях вам просто нужно использовать следующий фрагмент в функции предварительной обработки, не беспокоясь о том, какую функцию использовать.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

Для других функций предварительной обработки, проверьте документацию, чтобы видеть, есть ли какая-либо переменная, содержащая объект узла. Например, это тот случай, template_preprocess_comment()когда $variables['node']для функций предварительной обработки доступны комментарии.

киамлалуно
источник
7

Как это сделать на странице template_preprocess_page в Drupal Core :

Строка 2267 из theme.inc и далее:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page использует menu_get_object . После этого нужно просто проверить, определен ли узел, и получить $ node-> nid.

Барт
источник
4

Вы должны быть осторожны с псевдонимом пути.

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];
iStryker
источник
3
arg(1);

Это не плохой способ сделать это. arg () работает с внутренним путем, поэтому псевдонимы пути на него не влияют.

Джереми Френч
источник
Это правда, на псевдонимы пути это не повлияет. Но если вы находитесь на узле / XXXXX, то вы можете просто использовать $ node-> nid. @French, где еще вы бы использовали arg (1), и он вернул бы то, что вы хотите?
iStryker
если вы подключены к модулю, у вас не будет доступа к узлу. Аргументы представлений также могут быть примером.
Джереми Френч
спасибо Джереми и Истрикер, я обновил свой вопрос, это может быть яснее .. Хотя я попробую оба ваших решения, спасибо
silkAdmin
1
Очень плохая идея использовать arg (), вы привязываете себя к пути, используйте menu_get_object(который просто оборачивается, menu_get_itemтак что это одинаково хорошо).
if (arg(0) == 'node' && is_numeric(arg(1)))тогда arg(1)почти до 99% вернет вам идентификатор узла. Но только arg(1)может также вернуть вам много других удостоверений личности.
leymannx
2

В Drupal 8 вы можете получить URL-аргументы, основанные на маршрутизации.

Чтобы получить идентификатор один:

$nid = \Drupal::routeMatch()->getRawParameter('node');

Если вы планируете загрузить объект узла, вы можете просто получить его следующим образом:

$node = \Drupal::routeMatch()->getParameter('node');

Чтобы найти имена параметров, вы можете использовать:

$possible_parameters = \Drupal::routeMatch()->getParameters();
oknate
источник