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?
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.
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];
arg(0)
renvoie 'node' et arg(1)
renvoie node nid.
if (arg(0) == 'node' && is_numeric(arg(1))) {
$nid = arg(1);
}
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.
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 dehook_node_grants()
à invoquer à nouveau, ce qui appellemenu_get_object()
, ce qui provoque votre implémentation dehook_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);
}
En D8:
$node = \Drupal::routeMatch()->getParameter('node');