web-dev-qa-db-fra.com

Comment puis-je obtenir l'ID de nœud à partir de l'URL?

Jusqu'à présent, je suis tombé sur ces 3 fonctions dans Drupal 7, mais je ne suis pas vraiment sûr de la différence entre elles, et qui est plus approprié pour obtenir l'ID de nœud dans une fonction de prétraitement de bloc .

Pouvez-vous me donner un aperçu?

47
silkAdmin

Je ne sais pas vraiment quelle est la différence entre eux

  • menu_get_object () renvoie l'objet associé à la page actuellement affichée. Si le code est exécuté lorsque Drupal affiche la page example.com/node/1, alors menu_get_object() renverra l'objet nœud pour le nœud dont l'ID est 1; si la page affichée est example.com/user/1, puis menu_get_object('user') renverra l'objet utilisateur pour l'utilisateur dont l'ID est 1.
  • menu_get_item () renvoie un tableau contenant un index pour chaque champ contenu dans la table "menu_router". Ceci comprend:
    • path: le chemin actuel du rappel de menu
    • load_functions: un tableau de noms de fonctions (comme node_load) à appeler pour charger un objet correspondant à une partie du chemin courant
    • access_callback: le rappel qui vérifie si l'utilisateur actuellement connecté a accès à l'élément de menu
    • page_callback: le nom de la fonction qui rend la page
    • title: le titre de la page associée à l'élément de menu
  • drupal_lookup_path () est la fonction qui vous renvoie le chemin interne associé à l'alias passé en argument. Si "page d'accueil" est l'alias associé à example.com/node/1, alors drupal_lookup_path("homepage") renverra "node/1". Les alias de chemin peuvent être associés à n'importe quel chemin interne, pas seulement aux chemins de noeud.

et qui est plus approprié pour obtenir l'ID de nœud dans une fonction de prétraitement de bloc.

Si tout ce que vous voulez obtenir est l'ID de nœud du nœud actuellement affiché, il vous suffit d'utiliser le code suivant:

if (arg(0) == 'node') {
  $nid = arg(1);
}

Si vous devez obtenir l'objet nœud, vous pouvez utiliser le code suivant:

if ($node = menu_get_object()) {
  // Use the node object.
}

Parmi ces extraits, le second est meilleur, car il renvoie l'objet nœud approprié pour les chemins internes tels que nœud/1/révisions/3/vue.

Gardez à l'esprit que certaines fonctions de prétraitement, telles que celles de la page ou du nœud, ont déjà un $variables['node']. Cela signifie que dans ces cas, il vous suffit d'utiliser l'extrait de code suivant dans votre fonction de prétraitement, sans vous soucier de la fonction à utiliser.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

Pour les autres fonctions de prétraitement, consultez la documentation pour voir s'il existe une variable contenant l'objet nœud. Par exemple, c'est le cas pour template_preprocess_comment() qui met $variables['node'] À la disposition des fonctions de prétraitement pour commentaires.

63
kiamlaluno

Comment c'est fait dans Drupal Core's template_preprocess_page :

Ligne 2267 de theme.inc et suivants:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page utilise menu_get_object . Après cela, il suffit de vérifier si le nœud est défini et d'obtenir $ node-> nid.

7
Bart

Une chose à laquelle vous devez faire attention est l'alias du chemin.

drupal_get_normal_path($path)

pour obtenir le chemin actuel, utilisez la variable système $_SERVER["REQUEST_URI"]

(Si vous êtes sur la page du nœud, vous pouvez appeler $node->uri['path'], cela renverra un chemin sans alias. Là encore, si vous êtes sur la page du nœud, vous pouvez simplement utiliser $node->nid.)

cela renverra le nœud/XXXX

alors essayez quelque chose comme

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];
4
iStryker
arg(1);

N'est-ce pas une mauvaise façon de le faire. arg () fonctionne sur le chemin interne, il ne sera donc pas affecté par les alias de chemin.

3
Jeremy French

Dans Drupal 8, vous pouvez obtenir des arguments d'URL en fonction de ce qui est dans le routage.

Pour obtenir l'identifiant seul:

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

Si vous prévoyez de charger l'objet nœud, vous pouvez simplement l'obtenir de cette façon:

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

Pour trouver les noms des paramètres, vous pouvez utiliser:

$possible_parameters = \Drupal::routeMatch()->getParameters();
2
oknate