Jak uzyskać bieżący identyfikator węzła?

51

W Drupal 7, gdybym chciał uzyskać identyfikator węzła aktualnie wyświetlanego węzła (np. node/145), Mógłbym uzyskać go za pomocą arg()funkcji. W takim przypadku arg(1)zwróci 145.

Jak mogę to samo osiągnąć w Drupal 8?

24ma13wg
źródło

Odpowiedzi:

103

Do czasu uzyskania dostępu do tego parametru parametr zostanie przekształcony z nid na pełny obiekt węzła, więc:

$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();
}

Zobacz rekord zmian, aby uzyskać więcej informacji.

Clive
źródło
4
Chcę tylko dodać, że musisz uważać na to - właśnie mnie ugryzło, gdzie \ Drupal :: routeMatch () -> getParameter ('node'); zwróci tablicę 1 elementu (identyfikator węzła) na stronach usuwania wersji węzła, więc jeśli wywołasz metodę na czymś, co uważasz za obiekt, otrzymasz błąd krytyczny, taki jak: „Błąd krytyczny: wywołanie funkcji członkowskiej getType ( ) na ciąg znaków ”.
Jeff Burnz,
Jak mogę uzyskać parametr, jeśli odwiedziłem /taxonomy/term/{tid}?
AshwinP
Czy to jest funkcjonalny zamiennik menu_get_object?
Frank Robert Anderson
Prawie tak @Frank. Jest to oczywiście nieco inne, ale jeśli zostaniesz upuszczony w kontekście, który nie wie, na której stronie encji (jeśli w ogóle) jest włączony, jest to zalecany sposób, aby się dowiedzieć
Clive
1
@AshwinP Parametr to wszystko, co napiszesz {}na swojej trasie. Dla terminów taksonomicznych nazywany jest parametr taxonomy_termtrasy, definicja trasy /taxonomy/term/{taxonomy_term}. Tutaj można dostać to w ten sposób, \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal
17

Jest poprawny w użyciu \Drupal::routeMatch()->getParameter('node'). Jeśli potrzebujesz tylko identyfikatora węzła, możesz użyć \Drupal::routeMatch()->getRawParameter('node').

Maouna
źródło
4

jeśli używasz lub tworzysz blok niestandardowy, musisz postępować zgodnie z tym kodem, aby uzyskać bieżący identyfikator węzła 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'));
}
Gauri Shankar
źródło
Ten post nie ma sensu. Nikt nie może wiedzieć, dokąd idzie ten kod.
Lester Peabody
2

Uwaga na stronie podglądu węzła następujące czynności nie działają:

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

W przypadku strony podglądu węzła należy załadować węzeł w ten sposób:

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

Jak załadować obiekt węzła na stronie podglądu węzła?

oknate
źródło