Come ottengo l'ID nodo corrente?


51

In Drupal 7, se volessi ottenere l'ID del nodo attualmente visualizzato (ad esempio node/145), potrei ottenerlo con la arg()funzione. In questo caso, arg(1)restituirebbe 145.

Come posso ottenere lo stesso in Drupal 8?

Risposte:


103

Il parametro sarà stato trasferito da nid a oggetto nodo completo al momento dell'accesso, quindi:

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

Vedere il record delle modifiche per ulteriori informazioni.


4
Voglio solo aggiungere che devi fare attenzione con questo: mi sono appena punto dove \ Drupal :: routeMatch () -> getParameter ('node'); restituirà un array di 1 elemento (l'id del nodo) nelle pagine di eliminazione della revisione del nodo, quindi se si chiama un metodo su quello che si presume essere un oggetto si otterrà un errore irreversibile come "Errore irreversibile: chiamata a una funzione membro getType ( ) sulla stringa ".
Jeff Burnz,

Come posso ottenere il parametro, se ho visitato /taxonomy/term/{tid}?
Ashwin,

È una sostituzione funzionale per menu_get_object?
Frank Robert Anderson,

Praticamente sì, @Frank. Ovviamente è un po 'diverso, ma se vieni lasciato cadere in un contesto che non sa quale pagina entità (se presente) è attiva, questo è il modo consigliato per scoprirlo
Clive

1
@AshwinP Il parametro è qualunque cosa tu scriva all'interno {}del tuo percorso. Per i termini tassonomici viene chiamato il parametro del percorso taxonomy_term, definizione del percorso /taxonomy/term/{taxonomy_term}. Qui puoi ottenerlo in questo modo \Drupal::routeMatch()->getParameter('taxonomy_term'),.
Jdrupal,

17

È corretto da usare \Drupal::routeMatch()->getParameter('node'). Se hai solo bisogno dell'ID nodo, puoi usare \Drupal::routeMatch()->getRawParameter('node').


4

se stai utilizzando o creando un blocco personalizzato, devi seguire questo codice per ottenere l'ID del nodo URL corrente.

// 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'));
}

Questo post non ha senso. Non c'è modo per nessuno di sapere dove va questo codice.
Lester Peabody,

2

Nota sulla pagina di anteprima del nodo, quanto segue non funziona:

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

Per la pagina di anteprima del nodo, è necessario caricare il nodo in questo modo:

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

Come caricare l'oggetto nodo nella pagina di anteprima del nodo?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.