Comment afficher seulement 3 des derniers messages pour chaque terme dans une vue?

13

À l'aide d'une autre question: Afficher les nœuds les plus récents pour chaque terme de taxonomie dans les vues J'ai pu créer la vue dont j'ai besoin, sauf qu'elle affiche tous les messages pour chaque terme (regroupés par terme)? Comment limiter chaque terme pour afficher seulement 3 de leurs derniers messages.

par exemple

Durée 1
- Post 1
- Post 2
- Post 3

Durée 2
- Post 1
- Post 2
- Post 3

Durée 3
- Post 1
- Post 2
- Post 3

Nigel Waters
la source

Réponses:

9

Si vous n'avez besoin que d'un seul nœud, vous pouvez utiliser la relation «nœud représentatif». Mais si vous avez besoin de trois nœuds pour chaque terme, utilisez quelque chose comme Vues Field View .

1) Créez une vue "enfant" pour le contenu. Quelque chose comme ça: entrez la description de l'image ici

Ajoutez l'argument du terme de taxonomie, les limites du pager, le tri, etc.: entrez la description de l'image ici

Vous pouvez maintenant attacher cette vue à une autre.

2) Créer une vue de taxonomie: entrez la description de l'image ici

Ajoutez le champ ID de terme masqué, puis ajoutez le champ «Global: Afficher»: entrez la description de l'image ici

N'oubliez pas de configurer la mise en cache. À partir de la page Vues du champ Vues :

Il est fortement recommandé d'utiliser ce module conjointement avec la mise en cache des vues. Vues Le cache de contenu et les actions de cache sont de bons moyens de mettre en cache les vues.

kalabro
la source
Merci Kalabro. Votre approche est également correcte. À l'origine, je suivais cette route, mais je voulais voir s'il y avait un meilleur moyen que de créer une tonne de vues, puis d'intégrer la vue après la vue.
Nigel Waters
2
Ce n'est pas une tonne, @NigelWaters. Ce n'est que deux: un pour les nœuds et un pour les termes. Cette solution est assez stable et je l'utilise pour les listes de vues non standard.
kalabro
Mon malentendu. J'ai pensé que je devais créer une vue pour chaque groupe.
Nigel Waters
C'est presque parfait pour mon cas d'utilisation. Mon seul problème est le lien "plus" pour une vue enfant, des liens vers la même vue, et n'affiche toujours que le nombre limité d'éléments! Les titres de la vue parent sont liés à la taxonomie qui fonctionne comme vous le souhaitez.
Mark
Ahah - J'ai créé un affichage de bloc pour ma vue enfant avec seulement les n premiers éléments affichés, et un lien plus. Le lien le plus navigue vers l'affichage de la page et affiche tous les éléments avec un téléavertisseur. Génial! Maintenant, le seul problème est que les liens d'en-tête (dans la vue principale) vers le terme de taxonomie, mais je peux soit dissocier cela, soit changer l'affichage de la page de la vue enfant sur la même URL.
Mark
7

Après une enquête plus approfondie, il semble que Peek Summary soit exactement ce que vous voulez. Les captures d'écran sur la documentation sont pour Drupal 6, et c'est légèrement différent dans Drupal 7, j'ai donc joint quelques captures d'écran mises à jour.

  • Choisissez Peek Summary dans 'Contextual Filters'> 'Lorsque la valeur du filtre n'est pas dans l'URL'> 'Afficher un résumé'> 'Format'

Choisissez Peek Summary dans 'Contextual Filters'> 'Lorsque la valeur du filtre n'est pas dans l'URL'> 'Afficher un résumé'> 'Format'

  • Vous verrez une vue des sous-vues. Cliquez sur l'engrenage à côté du pager pour le groupe que vous souhaitez limiter.

Cliquez sur l'icône des préférences du téléavertisseur

  • Saisissez le nombre maximum d'éléments à afficher dans les options du pager.

Premier champ sous Options de pager

Vous devrez modifier le pager pour chaque groupe que vous souhaitez limiter, ce qui est regrettable.Lorsque vous modifiez le pager pour un groupe, il modifie les paramètres de tous les groupes. Si vous souhaitez afficher un nombre de nœuds par groupe différent du nombre total de groupes, remplacez-le dans les paramètres 'Format' sous 'Filtres contextuels' (sur la première capture d'écran en violet).

Il présente l'inconvénient de créer essentiellement [n] vues pour [n] regroupements, ce qui pourrait être un problème de performances en fonction du nombre de regroupements dont vous disposez, mais il limite la requête au seul ensemble de nombres à afficher. Cela pourrait améliorer vos performances, selon votre cas d'utilisation. Comme toujours, cachez de manière responsable.

beth
la source
Il semble qu'un pager ne puisse pas être remplacé par groupe. Si vous appuyez sur Modifier sur un pager dans un groupe, les paramètres du pager principal s'affichent. A moins que je manque quelque chose?
Nigel Waters
Ah, vous avez raison. Eh bien, c'est parfait alors. Vous pourrez tous les limiter à la fois.
beth
Malheureusement, cela signifie que le téléavertisseur affecte également le nombre de groupes affichés. Je suppose que mon message d'origine est trompeur car l'exemple ne montre que trois termes avec trois messages chacun. Je dois afficher 10 termes ou plus avec 3 messages par terme sur une seule page. Si proche :(
Nigel Waters
Je me trompais sur le fait de "remplacer les éléments à afficher" sans rien faire. Utilisez-le pour déterminer le nombre de groupes à afficher. La saisie de «0» vous donne des groupes infinis.
beth
2

Un moyen de limiter cela dans le code serait d'ajouter quelque chose comme ce qui suit à un module personnalisé:

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;
}

Il s'agit d'une vue des termes de taxonomie qui est connectée aux nœuds via une relation. Si vous n'avez qu'une vue des nœuds, votre kilométrage peut varier.

Bien qu'il empêche l'affichage de plus de 3 par terme, cela n'empêchera pas la requête de renvoyer tous les résultats pour chaque terme, ce qui n'améliore pas du tout les performances SQL. Si vous avez un très grand nombre de résultats pour chaque terme, faites des affichages de panneau d'affichage séparés et mettez-les tous dans une seule région en utilisant quelque chose comme CTools Page Manager afin de ne pas exécuter d'énormes requêtes.

Comme toujours, vous voudrez mettre ce contenu en cache en production.

beth
la source
2
Il n'y a vraiment pas besoin de commenter mon sexe. C'est assez dommageable. t.co/i1dKE8hQ t.co/ATfV3mBG Quoi qu'il en soit, Hook_views_pre_build()ou hook_build_pre_execute()pourrait être utilisable pour quelque chose comme ça qui réduit les performances, mais je ne les connais pas aussi bien. Ou vous pourriez aimer ma réponse à cette question précédemment .
beth
Mise à jour: Je l'ai de bonne foi (Crell et stevector): "Vous ne pouvez pas limiter chaque groupe séparément dans une seule requête. Vous devez le faire dans la phase de rendu. SQL ne peut pas le faire, malheureusement." Ils ont également déclaré que "le mieux que vous puissiez faire est une série de requêtes syndicales", mais ils ne pensent pas que Views puisse le faire non plus.
beth
Ah, je vous ai pris pour l'OP. Dans tous les cas, le module Peek Summary peut être utile dans ce cas, bien qu'il présente ses propres problèmes de performances. Son créateur avertit que c'est "plutôt dégueu, mais plutôt cool".
beth