módulos

views

versión

5.x

Una de las grandes ventajas de las vistas con argumentos en Drupal es el juego que te permiten con las taxonomías, de forma bastante simple, podemos hacer que se nos muestre información relacionada con ciertas categorías, y complicándolo un poquito más, podemos realizar cosas como las que pregunta cdp en este comentario:

Quiero hacer una vista que al hacer click sobre un nodo me muestre todos los nodos que tengan los mismos tags que el nodo sobre el que se ha hecho click. He creado el vocabulario, pero por ahora no he conseguido crear una vista que me muestre los nodos comunes a los vídeos. ¿Solucionaría mi problema una vista con argumentos?

Es decir, en una vista de tipo bloque, mostrar todos los nodos que compartan tags con el que estamos visualizando. Esto también se puede hacer con las vistas con argumentos

Nota: Para estos ejemplos he creado varios nodos con ciudades, cada ciudad pertenece a un país y tiene un idioma, ambas características marcadas por la taxonomía.

ejemplo simple

En este ejemplo, se muestra cómo hacer una vista con argumentos para que muestre los nodos pertenecientes a la taxonomía que se le pasa por parámetro.

un poco más complejo

Complicándolo un poquito más, podemos hacer una vista de tipo bloque que, a partir del nodo actual, muestre todos aquellos con los que comparta taxonomía.
Modificar las vistas de esta forma requiere algunos conocimientos de PHP.

Utilizaremos este código como "Argument Handling Code", del que podés encontrar más información en el handbook de drupal


// Utilizamos arg(1) para recoger el parámetro 1 de la url, es decir, el nodo.
// Por ejemploen la url node/12, arg(0) sera "node" y arg(1) será 12.
$nid = arg(1);
//Utilizamos la función taxonomy_node_get_terms, que nos devuelve un array
// con todos los términos que tiene el nodo.
$terms = taxonomy_node_get_terms($nid);
$url = array();
// Recorremos el array de términos del nodo, capturando los ids
foreach($terms as $id=>$term) {
$url[] .= $id;
}
// Generamos una lista de ids separados por +, 1+2+3
$url = implode("+",$url);
// Finalmente le pasamos al primer argumento $args[0] la lista separada por +
$args[0] = $url;
// Y usamos un segundo argumento para excluir el propio nodo
$args[1] = $nid;
return $args;

He observado que da un error al configurar el bloque, pero que aparentemente funciona muy bien. ¿Se sabe a qué puede ser debido el error?

El error que se observa es porque antes de activar el bloque no he restringido en qué páginas se muestra, es decir, solamente en las que haya nodos (node/*).
En la página de configuración de bloques no hay nodos, así que se produce un error en la consulta, al forzar que se muestre solamente en node/*, ya no se produce el error.

Si usas internacionalización, puede que necesites restringir por */node/* para el tema de los idiomas

Enviar un comentario nuevo

  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato

CAPTCHA
Esta pregunta sirve para distinguir si eres un humano o un spambot.
7 + 11 =