¿Cómo muestro solo 3 de las últimas publicaciones para cada término en una vista?

13

Con la ayuda de otra pregunta: ¿ Mostrar los nodos más nuevos para cada término de taxonomía en Vistas que he podido crear la vista que requiero, excepto que muestra todas las publicaciones para cada término (agrupadas por término)? ¿Cómo limito cada término para mostrar solo 3 de sus últimas publicaciones?

p.ej

Término 1
- Publicación 1
- Publicación 2
- Publicación 3

Término 2
- Publicación 1
- Publicación 2
- Publicación 3

Término 3
- Publicación 1
- Publicación 2
- Publicación 3

Nigel Waters
fuente

Respuestas:

9

Si solo necesita un nodo, puede usar la relación "Nodo representativo". Pero si necesita tres nodos por cada término, use algo como Vistas Vista de campo .

1) Crear una vista "secundaria" para el contenido. Algo como esto: ingrese la descripción de la imagen aquí

Agregue argumento de término de taxonomía, límites de buscapersonas, clasificación, etc. ingrese la descripción de la imagen aquí

Ahora puede adjuntar esta vista a otra.

2) Crear vista de taxonomía: ingrese la descripción de la imagen aquí

Agregue el campo de ID de término oculto y luego agregue el campo "Global: Ver": ingrese la descripción de la imagen aquí

No olvide configurar el almacenamiento en caché. Desde la página de vista de campo de vistas :

Se recomienda encarecidamente utilizar este módulo junto con el almacenamiento en caché de vistas. Vistas La caché de contenido y las acciones de caché son buenas formas de almacenar en caché las vistas.

kalabro
fuente
Gracias Kalabro Su enfoque también es correcto. Originalmente iba por esta ruta, pero quería ver si había una mejor manera que crear una tonelada de vistas y luego incrustar vista tras vista.
Nigel Waters
2
Eso no es una tonelada, @NigelWaters. Eso es solo dos: uno para los nodos y otro para los términos. Esta solución es bastante estable y la uso para listados de vistas no estándar.
kalabro
Mi malentendido. Pensé que necesitaba crear una vista para cada grupo.
Nigel Waters
Esto es casi perfecto para mi caso de uso. ¡Mi único problema es el enlace "más" para una vista secundaria, enlaces a la misma vista y todavía solo muestra el número limitado de elementos! Los títulos de la vista principal enlazan con la taxonomía que funciona según lo deseado.
Mark
Ajá: creé una pantalla de bloque para mi vista secundaria con solo los primeros n elementos mostrados y un enlace más. El enlace más navega a la visualización de la página, y muestra todos los elementos con un buscapersonas. ¡Excelente! Ahora, el único problema es el enlace del encabezado (en la vista maestra) al término de taxonomía, pero puedo desvincularlo o cambiar la visualización de la página de la vista secundaria a la misma URL.
Mark
7

Tras una investigación más profunda, parece que Peek Summary podría ser exactamente lo que quieres. Las capturas de pantalla en la documentación son para Drupal 6, y es ligeramente diferente en Drupal 7, por lo que adjunté algunas capturas de pantalla actualizadas.

  • Elija Peek Summary de 'Contextual Filters'> 'Cuando el valor del filtro no está en la URL'> 'Mostrar un resumen'> 'Formato'

Elija Peek Summary de 'Contextual Filters'> 'Cuando el valor del filtro no está en la URL'> 'Mostrar un resumen'> 'Formato'

  • Verá una vista de sub-vistas. Haga clic en el engranaje al lado del buscapersonas para el grupo que desea limitar.

Haga clic en el icono de preferencias del localizador

  • Ingrese los elementos máximos para mostrar en las opciones del localizador.

Primer campo en Opciones de buscapersonas

Tendrá que editar el buscapersonas para cada grupo que desee limitar, lo cual es lamentable.Cuando edita el buscapersonas para un grupo, cambia la configuración de todos los grupos. Si desea mostrar un número de nodos por grupo diferente al número total de grupos, anule eso en la configuración de 'Formato' en 'Filtros contextuales' (en la primera captura de pantalla en púrpura).

Tiene la desventaja de crear esencialmente [n] vistas para [n] agrupaciones, lo que podría ser un problema de rendimiento dependiendo de cuántas agrupaciones tenga, pero limita la consulta solo al número establecido para mostrar. Esto podría mejorar su rendimiento, dependiendo de su caso de uso. Como siempre, cachee responsablemente.

beth
fuente
Parece que un buscapersonas no se puede anular por grupo. Al presionar editar en un buscapersonas en un grupo, se abre la configuración del buscapersonas maestro. ¿A menos que me falte algo?
Nigel Waters
Ah, tienes razón. Bueno, eso es perfecto entonces. Podrás limitarlos a todos a la vez.
beth
Desafortunadamente, eso significa que el localizador también afecta la cantidad de grupos que se muestran. Supongo que mi publicación original es engañosa ya que el ejemplo solo muestra tres términos con tres publicaciones cada uno. Necesito mostrar 10 o más términos con 3 publicaciones por término en una sola página. Tan cerca :(
Nigel Waters
Me equivoqué acerca de que "anular elementos para mostrar" no hacía nada. Use eso para determinar cuántos grupos mostrar. Ingresar '0' te da grupos infinitos.
beth
2

Una forma de limitar esto en el código sería agregar algo como lo siguiente a un módulo personalizado:

function custom_views_pre_render(&$view) {
  //get the rows from the view just before render
  $results = $view->result;
  //create a counter
  $count = '';
  //we're going to built up a new $result array
  $new_results = array();
  //iterate through each view row
  foreach($results as $result) {
    //find the taxonomy term
    $term = $result->taxonomy_term_data_name;
    //add the term to a string of all the terms we've seen so far
    $count .= $term;
    //make sure to separate them with spaces to make them easier to count
    $count .= ' ' ;
    //count how many rows have the same term as the current one
    $term_count = array_count_values(str_word_count($count, 1));

    if($term_count[$term] <= 3){
      //if this is the third or fewer row with this term, add it to the new result array
      $new_results[] = $result;
    }
  }
  //instead of the normal view output, only show the results we put in our array.
  $view->result = $new_results;
}

Esto es para ver los términos de taxonomía que están conectados a los nodos a través de una relación. Si solo tiene una vista de los nodos, su kilometraje puede variar.

Aunque evita la visualización de más de 3 por término, esto no impedirá que la consulta devuelva todos los resultados de cada término, por lo que no mejora el rendimiento de SQL en absoluto. Si tiene una gran cantidad de resultados para cada término, realice pantallas de panel de vista separadas y colóquelas todas en una región utilizando algo como CTools Page Manager para que no esté ejecutando grandes consultas.

Como siempre, querrás almacenar en caché estas cosas en producción.

beth
fuente
2
Realmente no hay necesidad de comentar sobre mi género. Es muy dañino. t.co/i1dKE8hQ t.co/ATfV3mBG De todos modos, Hook_views_pre_build()o hook_build_pre_execute()podría ser utilizable para algo como esto que reduce el impacto en el rendimiento, pero no estoy tan familiarizado con eso. O puede que le guste mi respuesta a esta pregunta anteriormente .
beth
Actualización: Tengo buena autoridad (Crell y stevector) que "No puede limitar cada grupo por separado en una sola consulta. Tiene que hacerlo en la etapa de renderizado. SQL no puede hacerlo, lamentablemente". También dijeron "Lo mejor que puedes hacer es una serie de consultas sindicales", pero no creen que las Vistas puedan hacer eso tampoco.
beth
Ah, te confundí con el OP. En cualquier caso, el módulo Resumen Peek podría ser útil en este caso, aunque presenta sus propios problemas de rendimiento. Su creador advierte que es "algo asqueroso, pero algo genial".
beth