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?
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?
Risposte:
Non sono davvero sicuro di quale sia la differenza tra loro
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. node_load
) da chiamare per caricare un oggetto corrispondente a una parte del percorso correntedrupal_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.
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.
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];
arg(1);
Non è un brutto modo di farlo. arg () funziona sul percorso interno, quindi non sarà influenzato dagli alias del percorso.
menu_get_object
(che si avvolge in menu_get_item
modo 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.
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();