Поки я натрапив на ці 3 функції в Drupal 7, але я не дуже впевнений, у чому різниця між ними, і яка більш придатна для отримання ідентифікатора вузла у функції попередньої обробки блоку.
Чи можете ви мені зрозуміти?
Поки я натрапив на ці 3 функції в Drupal 7, але я не дуже впевнений, у чому різниця між ними, і яка більш придатна для отримання ідентифікатора вузла у функції попередньої обробки блоку.
Чи можете ви мені зрозуміти?
Відповіді:
Я не дуже впевнений, у чому різниця між ними
menu_get_object()
поверне об'єкт вузла для вузла, ідентифікатор якого дорівнює 1; якщо сторінка, що відображається, є example.com/user/1, то menu_get_object('user')
поверне об’єкт користувача для користувача, ідентифікатор якого 1. node_load
), які потрібно викликати для завантаження об'єкта, що відповідає частині поточного шляху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']
функції попередньої обробки для коментарів.
Як це робиться в Drupal сердечника template_preprocess_page :
Рядок 2267 теми.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 () працює на внутрішньому шляху, тому псевдоніми шляху не впливатимуть на нього.
menu_get_object
(який просто обертається, menu_get_item
так що це однаково добре).
if (arg(0) == 'node' && is_numeric(arg(1)))
то arg(1)
майже 99% поверне вам ідентифікатор вузла. Але виключно arg(1)
ви також можете повернути вам безліч інших посвідчень особи.
У Drupal 8 ви можете отримати аргументи URL-адреси на основі того, що знаходиться в маршрутизації.
Щоб отримати ідентифікатор один:
$nid = \Drupal::routeMatch()->getRawParameter('node');
Якщо ви плануєте завантажити об’єкт вузла, ви можете просто отримати його таким чином:
$node = \Drupal::routeMatch()->getParameter('node');
Щоб знайти імена параметрів, ви можете використовувати:
$possible_parameters = \Drupal::routeMatch()->getParameters();