Як отримати поточний ідентифікатор вузла?


51

У Drupal 7, якби я хотів отримати, щоб отримати ідентифікатор вузла поточно відображеного вузла (наприклад node/145), я міг би отримати його за допомогою arg()функції. У цьому випадку arg(1)повернувся б 145.

Як я можу досягти того ж у Drupal 8?

Відповіді:


103

Параметр буде переміщений з nid на повний об'єкт вузла до моменту отримання доступу до нього, так що:

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  // You can get nid and anything else you need from the node object.
  $nid = $node->id();
}

Додаткову інформацію див. У записі змін .


4
Я просто хочу додати, що ви повинні бути обережними з цим - я просто застрелився де \ Drupal :: routeMatch () -> getParameter ('вузол'); поверне масив із 1 елемента (ідентифікатор вузла) на сторінки видалення редакції вузла, тому, якщо ви будете викликати метод на тому, що ви вважаєте об'єктом, ви отримаєте фатальну помилку на кшталт "Фатальна помилка: Виклик функції члена getType ( ) на рядок ".
Джефф Бернц

Як отримати параметр, якщо я відвідав /taxonomy/term/{tid}?
AshwinP

Це функціональна заміна menu_get_object?
Френк Роберт Андерсон

Досить так @Frank. Звичайно, це дещо інакше, але якщо ви потрапили в контекст, який не знає, на якій сторінці сутності (якщо така є), це рекомендований спосіб дізнатися
Клайв

1
@AshwinP Параметр - це все, що ви пишете всередині {}свого маршруту. Для таксономічних термінів називається параметр taxonomy_termмаршруту, визначення маршруту /taxonomy/term/{taxonomy_term}. Тут ви можете отримати його , як це, \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal

17

Правильно використовувати \Drupal::routeMatch()->getParameter('node'). Якщо вам просто потрібен ідентифікатор вузла, ви можете використовувати \Drupal::routeMatch()->getRawParameter('node').


4

якщо ви використовуєте або створюєте користувальницький блок, вам потрібно буде дотримуватися цього коду, щоб отримати поточний ідентифікатор вузла URL-адреси.

// add libraries
use Drupal\Core\Cache\Cache;  

// code to get nid

$node = \Drupal::routeMatch()->getParameter('node');
  $node->id()  // get current node id (current url node id)


// for cache

public function getCacheTags() {
  //With this when your node change your block will rebuild
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
  //if there is node add its cachetag
    return Cache::mergeTags(parent::getCacheTags(), array('node:' . $node->id()));
  } else {
    //Return default tags instead.
    return parent::getCacheTags();
  }
}

public function getCacheContexts() {
  //if you depends on \Drupal::routeMatch()
  //you must set context of this block with 'route' context tag.
  //Every new route this block will rebuild
  return Cache::mergeContexts(parent::getCacheContexts(), array('route'));
}

Ця публікація не має сенсу. Ніхто не може знати, куди йде цей код.
Лестер Пібоді

2

Зауважте на сторінці попереднього перегляду вузла, наступне не працює:

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

Для сторінки попереднього перегляду вузла ви повинні завантажити вузол таким чином:

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

Як завантажити об’єкт вузла на сторінку попереднього перегляду вузла?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.