it-swarm.it

Come ottengo l'ID nodo dall'URL?

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?

47
silkAdmin

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, allora menu_get_object() restituirà l'oggetto nodo per il nodo il cui ID è 1; se la pagina visualizzata è esempio.com/utente/1, quindi 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 rende la pagina
    • titolo: il titolo della pagina associata alla voce di menu
  • drupal_lookup_path () è la funzione che ti restituisce il percorso interno associato all'alias passato come argomento. Se "homepage" è l'alias associato a example.com/node/1, allora drupal_lookup_path("homepage") restituirà "node/1". Gli alias dei percorsi 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 quello che vuoi ottenere è l'ID nodo del nodo attualmente mostrato, devi solo usare 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.

Tieni 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 della funzione da utilizzare.

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

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

63
kiamlaluno

Come è fatto in Drupal Core's template_preprocess_page :

Riga 2267 di theme.inc e in seguito:

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.

7
Bart

Una cosa che devi fare attenzione è alias percorso.

drupal_get_normal_path($path)

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

(Se ti trovi nella pagina del nodo puoi chiamare $node->uri['path'], questo restituirà un percorso non alias. Quindi 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];
4
iStryker
arg(1);

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

3
Jeremy French

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();
2
oknate