Vistas filtros contextuales, relaciones - argumentos y relaciones (conexiones)
En esta lección dedicaré especial atención al trabajo con argumentos en Views. Los argumentos son partes de la URL, por ejemplo:
node/15 El primer argumento es node, el segundo 15. taxonomy/term/10 El primer argumento es taxonomy, el segundo term, el tercero 10. user/67 El primer argumento es user, el segundo 67.
Creo que estos ejemplos son claros y no requieren explicaciones adicionales.
Los argumentos se pueden obtener con la función arg()
:
<?php print arg(0) . '<br />'; print arg(1); ?>
Si la URL era node/15
, se mostrarán:
node 15
La numeración de argumentos en arg()
empieza en 0. Ahora veamos las soluciones integradas en el módulo Views.
Listar nodos de un usuario
Supongamos que estamos en la página user/1
y necesitamos mostrar un bloque con los nodos cuyo uid sea 1. Para ello usaremos el argumento de la URL.
Añadimos una nueva vista de tipo bloque. En Fields agregamos el título del nodo, filtramos solo nodos publicados y ordenamos por fecha de publicación.
Título
Título: user_nodes
Formato
Formato: Unformatted list | Configuración
Mostrar: Fields | Configuración
Fields
Contenido: Title
Filter criteria
Contenido: Published (Yes)
Sort criteria
Contenido: Post date (desc)
Pager
Use pager: Display a specified number of items | 15 items
More link: No
Ahora hacemos clic en Contextual filters (argumentos). Seleccionamos:
Content: Author uid
Y luego configuramos:
When the filter value is NOT available Provide default value User ID from URL Provide default value
Guardamos la vista. Colocamos el bloque en la región deseada y navegamos a user/1
; el bloque mostrará todos los nodos del usuario con uid 1.
Listar nodos relacionados
Ahora complicaremos el ejemplo. Supongamos que precisamos enlazar una noticia con varias otras. Para ello usamos campos node reference. Necesitaremos el módulo References y su submódulo Node Reference.
http://drupal.org/project/references
Los campos de referencia en Drupal 7 permiten enlazar una entidad con múltiples usuarios o nodos simultáneamente. Esto se logra mediante campos de tipo node reference. Como en Drupal 7 podemos añadir campos a cualquier entidad, ahora también podemos enlazar cualquier entidad.
En mi sitio tengo 4 noticias y quiero enlazar a la segunda noticia la primera y la tercera (temática similar).
Vamos a Estructura › Content types › News › Manage fields y añadimos un campo node reference con autocompletado. Lo llamo “Noticias relacionadas”. Luego selecciono qué tipos de contenido pueden enlazarse y defino cuántos nodos enlazar. Yo elegí solo News. Guardamos el campo y editamos la noticia 2; allí aparece el campo “Noticias relacionadas”.
Las noticias relacionadas ya se muestran en la página como una lista, pero ajustaremos la vista:
Añadimos una nueva vista de tipo bloque.
Título:
similar_news
Formato:
Unformatted list | Configuración
Mostrar: Fields | Configuración
Fields
Content: Title
Filter criteria
Content: Published (Yes)
Content: Type (= News)
Sort criteria
Content: Post date (desc)
Pager
Use pager: Display a specified number of items | 5 items
Añadimos un argumento (contextual filter) Content: Nid, pero esta vez:
When the filter value is NOT available Provide default value Content ID from URL
También en Relationships añadimos la relación Content: Noticias relacionadas (field_similar) (elige el nombre de tu campo). Obsérvese que hay el mismo campo con la etiqueta “reverse”: sirve para invertir la relación, de modo que en la página de la noticia 3 se muestre la noticia 2 si ésta fue referenciada.
Quedarán así:
Contextual filters
Content: Nid
Relationships
Content: Noticias relacionadas
En Fields establecemos la relación: en lugar de “Do not use a relationship” selecciona el nombre de la relación.
Fields
(field_similar) Content: Title
Guardamos la vista y colocamos el bloque donde queramos.
En la página de la noticia 2, un bloque mostrará las noticias 1 y 3 relacionadas.