¿Cómo obtengo el ID de nodo de la URL?

47

Hasta ahora, me encontré con estas 3 funciones en Drupal 7, pero no estoy realmente seguro de cuál es la diferencia entre ellas, y cuál es más apropiado para obtener la ID de nodo en una función de preproceso de bloque.

¿Me puede dar alguna idea?

sedaadmin
fuente
¿Estás haciendo esto en node.tpl.php o algo así? En caso afirmativo, podría usar $ node-> nid.
Bart
No, estoy haciendo esto en una función de preproceso de bloque, aunque el bloque se imprime en la página del nodo.
silkAdmin

Respuestas:

63

No estoy realmente seguro de cuál es la diferencia entre ellos

  • menu_get_object () devuelve el objeto asociado con la página que se muestra actualmente. Si el código se ejecuta cuando Drupal muestra la página example.com/node/1, menu_get_object()devolverá el objeto de nodo para el nodo cuya ID es 1; si la página que se muestra es example.com/user/1, menu_get_object('user')devolverá el objeto de usuario para el usuario cuyo ID es 1.
  • menu_get_item () devuelve una matriz que contiene un índice para cada campo contenido en la tabla "menu_router". Esto incluye:
    • ruta: la ruta actual de la devolución de llamada del menú
    • load_functions: una matriz de nombres de funciones (como node_load) a los que se llamará para cargar un objeto correspondiente a una parte de la ruta actual
    • access_callback: la devolución de llamada que verifica si el usuario actualmente conectado tiene acceso al elemento del menú
    • page_callback: el nombre de la función que representa la página
    • título: el título de la página asociada al elemento del menú
  • drupal_lookup_path () es la función que le devuelve la ruta interna asociada con el alias pasado como argumento. Si "página de inicio" es el alias asociado a example.com/node/1, drupal_lookup_path("homepage")regresará "node/1". Los alias de ruta se pueden asociar a cualquier ruta interna, no solo a rutas de nodo.

y que es más apropiado para obtener la ID de nodo en una función de preproceso de bloque.

Si todo lo que desea obtener es el ID de nodo del nodo que se muestra actualmente, entonces solo necesita usar el siguiente código:

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

Si necesita obtener el objeto de nodo, puede usar el siguiente código:

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

De esos fragmentos, el segundo es mejor, ya que devuelve el objeto de nodo correcto para rutas internas como node / 1 / revisiones / 3 / view.

Tenga en cuenta que algunas funciones de preproceso, como las de la página o el nodo, ya tienen a $variables['node']. Esto significa que en esos casos, solo necesita usar el siguiente fragmento de código en su función de preproceso, sin preocuparse de qué función usar.

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

Para otras funciones de preproceso, verifique la documentación para ver si hay alguna variable que contenga el objeto nodo. Por ejemplo, ese es el caso para el template_preprocess_comment()que se $variables['node']ponen a disposición las funciones de preproceso para comentarios.

kiamlaluno
fuente
7

Cómo se hace en la página template_preprocess_page de Drupal Core :

Línea 2267 de theme.inc y en adelante:

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

template_preprocess_page usa menu_get_object . Después de eso, solo es cuestión de verificar si el nodo está definido y obtener $ node-> nid.

Bart
fuente
4

Una cosa que debes tener cuidado es el alias de ruta.

drupal_get_normal_path($path)

para obtener la ruta actual use la variable del sistema $_SERVER["REQUEST_URI"]

(Si está en la página de nodo a la que puede llamar $node->uri['path'], esto devolverá una ruta sin alias. Por otra parte, si está en la página de nodo, simplemente puede usar $node->nid).

esto devolverá el nodo / XXXX

así que intenta algo como

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

No es una mala forma de hacerlo. arg () funciona en la ruta interna, por lo que no se verá afectado por los alias de ruta.

Jeremy French
fuente
Esto es cierto, no se verá afectado por los alias de ruta. Pero si está en el nodo / XXXXX, puede usar $ node-> nid. @French, ¿dónde más usarías arg (1) y te devolvería lo que quieres?
iStryker
Si está en un gancho de módulo, no tendrá acceso al nodo. Los argumentos de opinión también pueden ser un ejemplo.
Jeremy French
gracias jeremy e istryker, he actualizado mi pregunta, podría ser más clara. Aunque intentaré ambas soluciones, gracias
silkAdmin
1
Es una muy mala idea usar arg (), te estás vinculando a una ruta, usar menu_get_object(que simplemente se envuelve, menu_get_itemasí que eso es igualmente bueno).
if (arg(0) == 'node' && is_numeric(arg(1)))luego arg(1), casi al 99% le devolverá una ID de nodo. Pero un solo arg(1)también podría devolverle muchas otras identificaciones.
leymannx
2

En Drupal 8, puede obtener argumentos de URL basados ​​en lo que está en el enrutamiento.

Para obtener la identificación solo:

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

Si planea cargar el objeto de nodo, simplemente puede obtenerlo de esta manera:

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

Para encontrar los nombres de los parámetros, puede usar:

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