Як отримати ідентифікатор вузла з URL-адреси?


47

Поки я натрапив на ці 3 функції в Drupal 7, але я не дуже впевнений, у чому різниця між ними, і яка більш придатна для отримання ідентифікатора вузла у функції попередньої обробки блоку.

Чи можете ви мені зрозуміти?


Ви робите це в node.tpl.php чи щось подібне? Якщо так, ви можете використовувати $ node-> nid.
Барт

Ні, я це роблю в функції попередньої обробки блоку, хоча блок надрукується на сторінці вузла.
silkAdmin

Відповіді:


63

Я не дуже впевнений, у чому різниця між ними

  • 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". Це включає:
    • path: поточний шлях зворотного виклику меню
    • 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 / reitions / 3 / view.

Майте на увазі, що деякі функції попередньої обробки, наприклад, такі для сторінки чи вузла, вже мають a $variables['node']. Це означає, що в цих випадках вам просто потрібно використовувати наступний фрагмент у своїй функції попередньої обробки, не переживаючи, яку функцію використовувати.

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

Для інших функцій попередньої обробки перевірте документацію, щоб побачити, чи є якась змінна, що містить об'єкт вузла. Наприклад, саме той випадок template_preprocess_comment()надає $variables['node']функції попередньої обробки для коментарів.


7

Як це робиться в Drupal сердечника template_preprocess_page :

Рядок 2267 теми.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];

3
arg(1);

Це не поганий спосіб зробити це. arg () працює на внутрішньому шляху, тому псевдоніми шляху не впливатимуть на нього.


Це правда, на неї не впливатимуть псевдоніми шляху. Але якщо ви перебуваєте на node / XXXXX, ви можете просто використовувати $ node-> nid. @French, де б ви ще використовували arg (1), і він повертав би те, що ви хочете?
iStryker

якщо ви знаходитесь в гачку модуля, у вас не буде доступу до вузла. Аргументи поглядів також можуть бути прикладом.
Джеремі Френч

дякую Джеремі та 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.