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

47

Jusqu'ici, je suis tombé sur ces 3 fonctions dans Drupal 7, mais je ne sais pas trop quelle est la différence entre elles et quelle est la meilleure solution pour obtenir l'ID de nœud dans une fonction de prétraitement de bloc.

Pouvez-vous me donner un aperçu?

silkAdmin
la source
Faites-vous cela dans node.tpl.php ou quelque chose comme ça? Si oui, vous pouvez utiliser $ node-> nid.
Bart
Non, je le fais dans une fonction de prétraitement de bloc, bien que le bloc soit imprimé sur la page du nœud.
silkAdmin

Réponses:

63

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

  • menu_get_object () retourne l'objet associé à la page actuellement affichée. Si le code est exécuté lorsque Drupal affiche la page example.com/node/1, menu_get_object()l'objet retourne alors l'objet nœud du nœud dont l'ID est 1; si la page affichée est example.com/user/1, menu_get_object('user')l'objet retourné sera alors l'utilisateur correspondant à l'utilisateur dont l'ID est 1.
  • menu_get_item () retourne un tableau contenant un index pour chaque champ contenu dans la table "menu_router". Ceci comprend:
    • chemin: le chemin actuel du rappel du menu
    • load_functions: un tableau de noms de fonctions (comme node_load) à appeler pour charger un objet correspondant à une partie du chemin actuel
    • 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 transmis en argument. Si "homepage" est l'alias associé à example.com/node/1, il drupal_lookup_path("homepage")reviendra "node/1". Les alias de chemin peuvent être associés à n’importe quel chemin interne, pas seulement aux chemins de nœud.

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.
}

Le deuxième est préférable, car il renvoie l'objet de nœud correct pour les chemins d'accès internes tels que nœud / 1 / revisions / 3 / view.

N'oubliez pas 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 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 noeud. Par exemple, c’est le cas pour template_preprocess_comment()lequel met à la $variables['node']disposition des fonctions de prétraitement des commentaires.

kiamlaluno
la source
7

Comment ça se passe dans template_preprocess_page de Drupal Core :

Ligne 2267 de theme.inc et suivantes:

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

template_preprocess_page utilise menu_get_object . Ensuite, il suffit de vérifier si le noeud est défini et d’obtenir $ node-> nid.

Bart
la source
4

Une chose à laquelle vous devez faire attention est le pseudonyme de 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 de nœud que vous pouvez appeler $node->uri['path'], cela renverra un chemin non alias. Si vous êtes sur la page de nœud, vous pouvez simplement utiliser $node->nid.)

cela retournera noeud / XXXX

alors essayez quelque chose comme

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

Ce n'est 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.

Jeremy French
la source
C’est vrai, les alias de chemins ne l’affecteront pas. Mais si vous êtes sur le noeud / XXXXX, vous pouvez simplement utiliser $ node-> nid. @French, où utiliseriez-vous arg (1) et qui renverrait ce que vous voulez?
iStryker
si vous êtes dans un hook de module, vous n'aurez pas accès au noeud. Les arguments de vues peuvent également être un exemple.
Jeremy French
merci jeremy et istryker, j'ai mis à jour ma question, il pourrait être plus clair .. Bien que je vais essayer vos deux solutions, merci
silkAdmin
1
C'est une très mauvaise idée d'utiliser arg (), vous vous attachez à un chemin, vous utilisez menu_get_object(qui se contente de tourner menu_get_itempour que ce soit tout aussi bien).
if (arg(0) == 'node' && is_numeric(arg(1)))alors arg(1)près de 99% vous renverront un ID de nœud. Mais un seul arg(1)pourrait également vous retourner beaucoup d'autres identifiants.
leymannx
2

Dans Drupal 8, vous pouvez obtenir des arguments d'URL basés sur le contenu du routage.

Pour obtenir l'identifiant seul:

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

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

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

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

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