Comment puis-je obtenir l'ID de nœud actuel?

51

Dans Drupal 7, si je voulais obtenir l’identifiant du nœud actuellement affiché (par exemple node/145), je pourrais l’obtenir avec la arg()fonction. Dans ce cas, arg(1)reviendrait 145.

Comment puis-je obtenir la même chose dans Drupal 8?

24ma13wg
la source

Réponses:

103

Le paramètre aura été converti de l'objet nid en objet nœud complet au moment où vous y aurez accès. Ainsi:

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

Voir l' enregistrement de modification pour plus d'informations.

Clive
la source
4
Je veux juste ajouter que vous devez faire attention à cela - je viens de me faire piquer où \ Drupal :: routeMatch () -> getParameter ('node'); renverra un tableau de 1 élément (id du nœud) sur les pages de suppression de révision de nœud. Ainsi, si vous appelez une méthode sur ce que vous supposez être un objet, vous obtiendrez une erreur fatale du type "Erreur fatale: appel de la fonction membre getType ( ) sur la chaîne ".
Jeff Burnz
Comment puis-je obtenir le paramètre, si j'ai visité /taxonomy/term/{tid}?
AshwinP
Est-ce un remplacement fonctionnel pour menu_get_object?
Frank Robert Anderson
Oui à peu près @ Frank. C'est un peu différent bien sûr, mais si vous êtes déplacé dans un contexte qui ne sait pas quelle page d'entité (le cas échéant) est
Clive
1
@AshwinP Le paramètre est ce que vous écrivez à l'intérieur {}de votre route. Pour les termes de taxonomie, on appelle le paramètre taxonomy_termroute, définition de route /taxonomy/term/{taxonomy_term}. Ici , vous pouvez l' obtenir comme ça, \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal
17

Il est correct d'utiliser \Drupal::routeMatch()->getParameter('node'). Si vous avez juste besoin de l'ID de nœud, vous pouvez l'utiliser \Drupal::routeMatch()->getRawParameter('node').

Maouna
la source
4

Si vous utilisez ou créez un bloc personnalisé, vous devez suivre ce code pour obtenir l'id du nœud d'URL actuel.

// 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
la source
Cet article n'a pas de sens. Personne ne peut savoir où va ce code.
Lester Peabody
2

Remarque sur la page d'aperçu du nœud, les éléments suivants ne fonctionnent pas:

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

Pour la page d'aperçu du nœud, vous devez charger le nœud de la manière suivante:

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

Comment charger un objet noeud dans la page d'aperçu du noeud?

oknate
la source