Como mostro apenas três das postagens mais recentes para cada termo em uma exibição?

13

Com a ajuda de outra pergunta: Mostrar os nós mais recentes para cada termo de taxonomia no Views Pude criar a visualização necessária, exceto pelo fato de exibir todas as postagens para cada termo (agrupadas por termo)? Como limite cada termo para exibir apenas três das postagens mais recentes.

por exemplo

Termo 1
- Post 1
- Post 2
- Post 3

Termo 2
- Post 1
- Post 2
- Post 3

Termo 3
- Post 1
- Post 2
- Post 3

Nigel Waters
fonte

Respostas:

9

Se você precisar de apenas um nó, poderá usar o relacionamento "Nó representativo". Mas se você precisar de três nós por cada termo, use algo como Views Field View .

1) Crie uma exibição "filho" para o conteúdo. Algo assim: insira a descrição da imagem aqui

Adicione argumento do termo de taxonomia, limites de pager, classificação e etc: insira a descrição da imagem aqui

Agora você pode anexar essa visualização a outra.

2) Criar visão taxonômica: insira a descrição da imagem aqui

Adicione o campo ID do termo oculto e adicione o campo "Global: Visualizar": insira a descrição da imagem aqui

Não esqueça de configurar o cache. Na página Visualização do campo Visualizações :

É altamente recomendável usar este módulo em conjunto com o cache de visualizações. Visualizações O cache de conteúdo e as ações de cache são boas maneiras de armazenar em cache as visualizações.

kalabro
fonte
Obrigado Kalabro. Sua abordagem também está correta. Inicialmente, eu estava indo por esse caminho, mas queria ver se havia uma maneira melhor do que criar uma tonelada de visualizações e depois incorporar as visualizações.
Nigel Waters
2
Isso não é muito, @NigelWaters. São apenas dois: um para nós e outro para termos. Essa solução é bastante estável e eu a uso para listagens de visualizações fora do padrão.
Kalabro
Meu mal-entendido. Eu pensei que precisava criar uma visão para cada grupo.
Nigel Waters
Isso é quase perfeito para o meu caso de uso. Meu único problema é o link "mais" para uma exibição filho, links para a mesma exibição e ainda exibe apenas o número limitado de elementos! Os títulos da visualização pai vinculam-se à taxonomia que funciona conforme desejado.
Mark
Ahah - criei uma exibição em bloco para a visualização do meu filho com apenas os primeiros n itens mostrados e um link a mais. O link mais navega para a exibição da página e exibe todos os itens com um pager. Ótimo! Agora, o único problema é o link do cabeçalho (na visualização principal) para o termo de taxonomia, mas posso desvincular isso ou alterar a exibição da página da visualização secundária para o mesmo URL.
Mark
7

Após uma investigação mais aprofundada, parece que o Resumo da Espiada pode ser exatamente o que você deseja. As capturas de tela na documentação são para o Drupal 6 e são ligeiramente diferentes no Drupal 7, então anexei algumas capturas de tela atualizadas.

  • Escolha Resumo da visualização em 'Filtros contextuais'> 'Quando o valor do filtro não estiver no URL'> 'Exibir um resumo'> 'Formato'

Escolha Resumo da visualização em 'Filtros contextuais'> 'Quando o valor do filtro não estiver no URL'> 'Exibir um resumo'> 'Formato'

  • Você verá uma visualização de sub-visualizações. Clique na engrenagem ao lado do pager do grupo que você deseja limitar.

Clique no ícone de preferências do pager

  • Digite o máximo de itens a serem exibidos nas opções do pager.

Primeiro campo em Opções do Pager

Você terá que editar o pager para cada grupo que você deseja limitar, o que é lamentável.Quando você edita o pager para um grupo, ele altera as configurações de todos os grupos. Se você deseja exibir um número de nós por grupo diferente do número total de grupos, substitua-o nas configurações de 'Formato' em 'Filtros contextuais' (na primeira captura de tela em roxo).

Ele tem a desvantagem de criar essencialmente [n] visualizações para [n] agrupamentos, o que pode ser um problema de desempenho dependendo de quantos agrupamentos você possui, mas limita a consulta apenas ao número definido para exibição. Isso pode melhorar seu desempenho, dependendo do seu caso de uso. Como sempre, armazene em cache de forma responsável.

beth
fonte
Parece que um pager não pode ser substituído por grupo. Pressionar a edição em um pager em um grupo exibe as configurações do pager principal. A menos que esteja faltando alguma coisa?
Nigel Waters
Ah, você está certo. Bem, isso é perfeito então. Você poderá limitar todos eles de uma vez.
beth
Infelizmente, isso significa que o pager também afeta o número de grupos exibidos. Suponho que minha postagem original seja enganosa, pois o exemplo mostra apenas três termos com três postagens cada. Preciso mostrar 10 ou mais termos com 3 postagens por termo em uma única página. Tão perto :(
Nigel Waters
Eu estava errado sobre os "substituir itens a serem exibidos" sem fazer nada. Use isso para determinar quantos grupos mostrar. Digitar '0' fornece grupos infinitos.
beth
2

Uma maneira de limitar isso no código seria adicionar algo como o seguinte a um 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;
}

Isto é para uma visão dos termos de taxonomia conectados aos nós por meio de um relacionamento. Se você tiver apenas uma visão dos nós, sua milhagem poderá variar.

Embora impeça a exibição de mais de 3 por termo, isso não impedirá que a consulta retorne todos os resultados para cada termo, portanto, não melhora o desempenho do SQL. Se você tiver um número muito grande de resultados para cada termo, faça exibições de painéis de exibição separadas e coloque-as em uma região usando algo como o CTools Page Manager, para que você não esteja executando grandes consultas.

Como sempre, você vai querer armazenar essas coisas em cache na produção.

beth
fonte
2
Realmente não há necessidade de comentar sobre o meu sexo. É bastante prejudicial. t.co/i1dKE8hQ t.co/ATfV3mBG De qualquer forma, Hook_views_pre_build()ou hook_build_pre_execute()pode ser usado para algo assim que reduz o impacto no desempenho, mas não estou tão familiarizado com isso. Ou você pode gostar da minha resposta a esta pergunta anteriormente .
beth
Atualização: Eu tenho uma boa autoridade (Crell e stevector) que "Você não pode limitar cada grupo separadamente em uma única consulta. Você deve fazê-lo no estágio de renderização. O SQL não pode fazer isso, infelizmente." Eles também disseram "O melhor que você poderia fazer é uma série de consultas sindicais", mas eles não acham que o Views pode fazer isso também.
beth
Ah, eu confundi você com o OP. De qualquer forma, o módulo Resumo da consulta pode ser útil nesse caso, embora apresente seus próprios problemas de desempenho. Seu criador alerta que é "meio nojento, mas meio legal".
beth