2009-11-03 72 views
6

¿Cómo puedo construir un bloque en Drupal que pueda mostrar el ID del nodo de la página de visualización en la que está actualmente el bloque?Drupal - Obtener el ID del nodo de la vista para personalizar el enlace en el bloque

Estoy usando vistas para construir una gran parte de mi sitio, pero necesito poder crear bloques "inteligentes" en modo PHP que tendrán contenido dinámico dependiendo de lo que se muestre en la vista.

¿Cómo puedo encontrar el $ nid que muestra una vista actualmente?

+0

Estoy un poco confundido con respecto a lo que quiere decir con 'ver' aquí. ¿Quiere decir vistas desde el módulo de vistas? Si es así, ¿por qué solo tienen una ID de nodo? (La mayoría de las vistas son colecciones de nodos, pero tal vez tengas un escenario de uso especial) –

+0

Hola, tienes razón, estoy usando el módulo de vistas para buscar nodos y luego formatearlos correctamente. Sin embargo, toda la información sobre estas vistas se refiere a un nodo, solo necesito obtener ese NID. – MrFidge

Respuesta

14

Aquí está una más robusta manera de conseguir el ID del nodo:

<?php 
    // Check that the current URL is for a specific node: 
    if(arg(0) == 'node' && is_numeric(arg(1))) { 
     return arg(1); // Return the NID 
    } 
    else { // Whatever it is we're looking at, it's not a node 
     return NULL; // Return an invalid NID 
    } 
?> 

Este método funciona incluso si tiene una ruta personalizada para el nodo w con los módulos path y/o pathauto.

Sólo como referencia, si no lo hace a su vez en el módulo path, las direcciones URL por defecto que genera Drupal son llamados "rutas del sistema" en la documentación. Si do activa el módulo path, puede establecer rutas personalizadas que se denominan "alias" en la documentación.

Como siempre tengo encendido el módulo path, una cosa que me confundió al principio fue si alguna vez fue posible para la función arg devolver parte de un alias en lugar de parte de la ruta del sistema.

Como resultado, la función arg siempre devolverá una ruta del sistema porque the arg function is based on $_GET['q'] ... Después de un poco de investigación, parece que $_GET['q'] siempre devolverá una ruta del sistema.

Si desea obtener la ruta desde la solicitud de página real, necesita usar $_REQUEST['q']. Si el módulo path está habilitado, $_REQUEST['q'] puede devolver un alias o una ruta del sistema.

+2

En una nota relacionada, habilitar el módulo 'ruta' le dará acceso a una función llamada' drupal_lookup_path', que puede usar para buscar una ruta del sistema desde un alias y viceversa. Consulte la documentación 'drupal_lookup_path' para obtener más información: mparker17

+1

Además, una vez que tiene una ID de nodo, puede usar la función node_load para obtener toda la información sobre ese nodo: mparker17

+1

Dependiendo del contexto en el que está pegando mi código, las declaraciones 'return' pueden no tener sentido ...es posible que desee reemplazarlos con '$ display_node =' si necesita devolver algo más; pero necesitas obtener el NID por algo. – mparker17

1

Hay un par de maneras de hacer esto:

  1. usted puede hacer sus bloques con vistas y pasar el nid a través de un argumento.

  2. Puede pasar manualmente el nid accediendo al objeto $ view utilizando el siguiente código. Es una matriz en $ view-> result. Cada fila en la vista es un objeto en esa matriz, y el nid está en ese objeto para cada una. Así que podría ejecutar un foreach sobre eso y obtener todas las nid de todas las filas en la vista con bastante facilidad.

La primera opción es mucho más fácil, así que si eso se adapta a sus necesidades yo iría con eso. ¡Espero que ayude!

+0

La opción 1 no funcionó bastante, me temo, podría levantar el argumento, pero el argumento tenía un formato incorrecto para lo que necesitaba, siguió usando el alias en lugar del nodeID – MrFidge

+0

Puede marcar la opción bajo el argumento para pase la ID del nodo desde la URL si no hay ningún argumento presente. O puede verificar la opción del código PHP e ingresar algo como: $ url = explotar ('/', $ _ GET ['q']); return $ url [1]; – theunraveler

1

Debe considerar el módulo de paneles. Es un módulo muy grande y requiere algo de trabajo antes de que puedas aprovechar su potencial. Así que toma eso en consideración.

Puede usarlo para configurar una página que contenga varias vistas/bloques que se pueden colocar en diferentes regiones. Utiliza un concepto llamado contexto que puede ser cualquier cosa relacionada con lo que está viendo. Puede usar ese contexto para determinar qué nodo se está viendo y no solo cambiar los bloques, sino también el diseño. También es un poco más limpio ya que puede mover el código PHP fuera de la interfaz de administración.

En una nota lateral, también está escrito por el autor de vistas.

+0

He visto paneles antes, realmente no me he metido en él, tal vez este podría haber sido el momento ^^ – MrFidge

2

Al final este fragmento hizo el trabajo - simplemente eliminó el URL limpio e informó el último argumento.

<?php 
    $refer= $_SERVER ['REQUEST_URI']; 
    $nid = explode("/", $refer); 
    $nid = $nid[3]; 
?> 

Teniendo en cuenta el comentario de respuesta, lo anterior fue probablemente reduce a esto, el uso de la función de Drupal arg() para obtener una parte de la ruta de solicitud:

<?php 
    $nid = arg(3); 
?> 
+0

Debería echar un vistazo a la función arg() para extraer argumentos de una ruta drupal - ver: http: // api.drupal.org/api/function/arg/6 –

+0

Henrik - ¡eso es perfecto! Trabajó un sueño. – MrFidge

+0

+1 para publicar el seguimiento con la solución encontrada. –

0

Este tema es bastante antiguo. Solo para refrescar un poco con algo nuevo sobre Drupal 7, la forma correcta de obtener el ID del nodo es usando la función menu_get_object();

examp:

$node = menu_get_object(); 
$contentType = node_type_get_name($node); 

Drupal 8 tiene otro método. Mira esto

arg() is deprecated

espero que ayude!

Cuestiones relacionadas