web-dev-qa-db-fra.com

Comment obtenir par programme le NID du nœud actuel

Je me suis penché sur ce vieux fil sur drupal.org et ça me fait juste tourner la tête. En descendant le chemin et en essayant d'analyser le NID de l'intérieur? Il doit y avoir une meilleure façon.

Et des solutions comme

global $node;
$nid = $node->nid;

ne fonctionne pas dans mon module personnalisé (même si on me dit qu'ils fonctionnent dans des modèles?). Aucune erreur ou quoi que ce soit, il instancie simplement $node avec une valeur NULL.

J'ai l'impression qu'il doit y avoir quelque chose de vraiment évident que je manque.

Alors, comment obtenir le NID du nœud actuel sans modèle, tout en suivant les meilleures pratiques et en construisant un module raisonnablement robuste?

26
beth

En supposant que votre code s'exécute pour une page de nœud, les méthodes que je vois utilisées le plus souvent dans les modules core/contrib utilisent soit menu_get_object() ou arg() :

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

ou

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

Personnellement, je préfère la première méthode (même si l'affectation en condition n'est pas considérée comme une bonne idée par certaines personnes), mais les deux sont parfaitement valides.

50
Clive

Le moyen le plus simple de le faire dans Drupal 8 car arg () ne fonctionne plus:

$path_args = explode('/', current_path());
print $path_args[1];

Modifier l'enregistrement

5
Pouya Sanooei

arg(0) renvoie 'node' et arg(1) renvoie node nid.

if (arg(0) == 'node' && is_numeric(arg(1))) {
  $nid = arg(1);
}
4
Sébastien Gicquel

Ce lien m'a aidé: http://www.webomelette.com/node-id-nid-url-path-alias - Allez dans Contenu et filtrez vers le bas pour trouver le contenu que vous voulez voir = Node ID pour et survolez le lien Modifier. Regardez en bas pour voir l'hyperlien que votre navigateur vous indique qu'il suivra si vous cliquez sur Modifier.

1
Ana

La deuxième méthode actuellement réponse acceptée est la plus propre de D7. La première réponse:

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

est seulement visuellement plus propre. En fait, menu_get_object() appelle beaucoup de code et peut conduire à des erreurs imprévues. Je l'utilisais dans une fonction hook_node_grants() et j'ai rencontré une erreur PHP fatale:

Le niveau maximal d'imbrication des fonctions de '256' est atteint, abandonné!

L'explication, trouvée à https://drupal.stackexchange.com/a/69232/9158

La boucle infinie que vous remarquez est due au fait que menu_get_object() provoque Drupal pour vérifier que l'utilisateur actuellement connecté a accès au nœud, ce qui entraîne votre implémentation de hook_node_grants() à invoquer à nouveau, ce qui appelle menu_get_object(), ce qui provoque votre implémentation de hook_node_grants() à invoquer à nouveau, ce qui ...

Cela a été résolu en utilisant la deuxième méthode:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}
1
Jan Ehrhardt

En D8:

$node = \Drupal::routeMatch()->getParameter('node');
1
phuang07