Come ottengo l'ID nodo dall'URL?


47

Finora mi sono imbattuto in queste 3 funzioni in Drupal 7, ma non sono davvero sicuro di quale sia la differenza tra loro, e quale sia più appropriato per ottenere l'ID nodo in una funzione di preelaborazione del blocco.

Puoi darmi qualche idea?


Lo stai facendo in node.tpl.php o qualcosa del genere? Se sì, puoi usare $ node-> nid.
Bart,

No, lo sto facendo in una funzione di preelaborazione del blocco, sebbene il blocco venga stampato sulla pagina del nodo.
silkAdmin,

Risposte:


63

Non sono davvero sicuro di quale sia la differenza tra loro

  • menu_get_object () restituisce l'oggetto associato alla pagina attualmente visualizzata. Se il codice viene eseguito quando Drupal mostra la pagina example.com/node/1, menu_get_object()restituirà l'oggetto nodo per il nodo il cui ID è 1; se la pagina visualizzata è example.com/user/1, menu_get_object('user')restituirà l'oggetto utente per l'utente il cui ID è 1.
  • menu_get_item () restituisce un array contenente un indice per ciascun campo contenuto nella tabella "menu_router". Ciò comprende:
    • percorso: il percorso corrente della richiamata del menu
    • load_functions: un array di nomi di funzioni (come node_load) da chiamare per caricare un oggetto corrispondente a una parte del percorso corrente
    • access_callback: il callback che controlla se l'utente attualmente connesso ha accesso alla voce di menu
    • page_callback: il nome della funzione che esegue il rendering della pagina
    • titolo: il titolo della pagina associata alla voce di menu
  • drupal_lookup_path () è la funzione che restituisce il percorso interno associato all'alias passato come argomento. Se "homepage" è l'alias associato a example.com/node/1, drupal_lookup_path("homepage")verrà restituito "node/1". Gli alias di percorso possono essere associati a qualsiasi percorso interno, non solo ai percorsi dei nodi.

e che è più appropriato per ottenere l'ID nodo in una funzione di preelaborazione del blocco.

Se tutto ciò che desideri è l'ID nodo del nodo attualmente visualizzato, devi solo utilizzare il seguente codice:

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

Se è necessario ottenere l'oggetto nodo, è possibile utilizzare il seguente codice:

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

Di questi snippet, il secondo è migliore, poiché restituisce l'oggetto nodo corretto per percorsi interni come node / 1 / revisions / 3 / view.

Tenere presente che alcune funzioni di preelaborazione, come quelle per la pagina o il nodo, hanno già un $variables['node']. Ciò significa che in questi casi, è sufficiente utilizzare il seguente frammento nella funzione di preelaborazione, senza preoccuparsi di quale funzione utilizzare.

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

Per altre funzioni di preelaborazione, consultare la documentazione per vedere se esiste qualche variabile contenente l'oggetto nodo. Ad esempio, questo è il caso per template_preprocess_comment()cui rende $variables['node']disponibili le funzioni di preelaborazione per i commenti.


7

Come è fatto nella template_preprocess_page di Drupal Core :

Linea 2267 di theme.inc e successive:

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

template_preprocess_page utilizza menu_get_object . Dopodiché si tratta solo di verificare se il nodo è definito e ottenere $ node-> nid.


4

Una cosa che devi fare attenzione è alias percorso.

drupal_get_normal_path($path)

per ottenere il percorso corrente utilizzare la variabile di sistema $_SERVER["REQUEST_URI"]

(Se ti trovi nella pagina del nodo che puoi chiamare $node->uri['path'], questo restituirà un percorso non-alias. Poi di nuovo se ti trovi nella pagina del nodo, puoi semplicemente usare $node->nid.)

questo restituirà il nodo / XXXX

quindi prova qualcosa del genere

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

3
arg(1);

Non è un brutto modo di farlo. arg () funziona sul percorso interno, quindi non sarà influenzato dagli alias del percorso.


Questo è vero, non sarà influenzato dagli alias del percorso. Ma se sei sul nodo / XXXXX, puoi semplicemente usare $ node-> nid. @French, dove altro useresti arg (1) e restituirebbe quello che vuoi?
iStryker

se si è in un hook del modulo non si avrà accesso al nodo. Anche gli argomenti di Views possono essere un esempio.
Jeremy French

grazie jeremy e istryker, ho aggiornato la mia domanda potrebbe essere più chiara .. Anche se proverò entrambe le soluzioni, grazie
silkAdmin

1
È una pessima idea usare arg (), ti stai legando a un percorso, usa menu_get_object(che si avvolge in menu_get_itemmodo che sia altrettanto buono).

if (arg(0) == 'node' && is_numeric(arg(1)))quindi arg(1)sarà quasi al 99% restituirti un ID nodo. Ma un solo arg(1)potrebbe anche restituirti molti altri ID.
leymannx,

2

In Drupal 8, puoi ottenere argomenti URL in base a ciò che è nel routing.

Per ottenere l'ID da solo:

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

Se prevedi di caricare l'oggetto nodo, puoi semplicemente ottenerlo in questo modo:

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

Per trovare i nomi dei parametri, è possibile utilizzare:

$possible_parameters = \Drupal::routeMatch()->getParameters();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.