如何在视图中仅显示每个术语的最新帖子中的3个?


13

借助另一个问题:在视图中显示每个分类术语的最新节点我已经能够创建所需的视图,只是它显示每个术语的所有帖子(按术语分组)?如何限制每个学期只显示其最新帖子中的3个。

例如

第1学期
- 第1个帖子
-第2个
帖子-第3个帖子

第2学期
-第1个
帖子
- 第2个帖子-第3个帖子

第三学期
-职位1-
职位2-
职位3

Answers:


9

如果只需要一个节点,则可以使用“代表节点”关系。但是,如果每个学期需要三个节点,请使用“ 视图字段视图”之类的方法

1)创建内容的“子”视图。像这样: 在此处输入图片说明

添加分类术语参数,寻呼机限制,排序等: 在此处输入图片说明

现在,您可以将此视图附加到另一个视图。

2)创建分类视图: 在此处输入图片说明

添加隐藏的术语ID字段,然后添加“全局:查看”字段: 在此处输入图片说明

不要忘记配置缓存。从“ 视图字段视图”页面:

强烈建议将此模块与视图缓存一起使用。视图内容缓存和“缓存操作”是缓存视图的好方法。


谢谢卡拉布罗。您的方法也是正确的。我本来打算走这条路线,但想看看是否有比创建大量视图然后在视图之间嵌入视图更好的方法。
奈杰尔·沃特斯

2
没什么,@ NigelWaters。只有两个:一个用于节点,一个用于术语。该解决方案非常稳定,我将其用于非标准视图列表。
kalabro 2012年

我的误会 我认为我需要为每个小组创建一个视图。
奈杰尔·沃特斯

对于我的用例而言,这几乎是完美的。我唯一的问题是子视图的“更多”链接,指向同一视图的链接,并且仍然仅显示有限数量的元素!父视图中的标题链接到所需的分类法。
2014年

啊-我为子视图创建了一个块显示,其中只显示了前n个项目,还有一个更多链接。“更多”链接导航到页面显示,并使用寻呼机显示所有项目。大!现在唯一的问题是标题(在主视图中)链接到分类术语,但是我可以取消链接,也可以将子视图的页面显示更改为相同的URL。
标记

7

经过进一步的调查,“ 偷看摘要”似乎正是您想要的。文档上的屏幕截图是针对Drupal 6的,与Drupal 7稍有不同,因此我附上了一些更新的屏幕截图。

  • 从“上下文过滤器”>“当过滤器值不在URL中”时选择“窥视摘要”>“显示摘要”>“格式”

从“上下文过滤器”>“当过滤器值不在URL中”时选择“窥视摘要”>“显示摘要”>“格式”

  • 您将看到一个子视图视图。单击您要限制的寻呼机旁边的齿轮。

单击传呼机首选项图标

  • 输入要在寻呼机选项上显示的最大项目。

分页器选项下的第一个字段

不幸的是,您必须编辑要限制的每个组的寻呼机。当您为一个组编辑寻呼机时,它将更改所有组的设置。如果要显示每个组的节点数与组的总数不同,请覆盖“上下文过滤器”下“格式”设置中的节点数(第一个屏幕截图为紫色)。

它的缺点是本质上为[n]个分组创建[n]个视图,这可能是性能问题,具体取决于您拥有多少个分组,但是它确实将查询限制为仅显示的数量。根据您的用例,这可以提高性能。与往常一样,负责任地缓存。


似乎不能按组覆盖寻呼机。在组中的某个寻呼机上单击编辑,将调出主寻呼机设置。除非我想念什么?
奈杰尔·沃特斯

啊,对。好吧,那太完美了。您将可以一次限制所有这些。
beth,2012年

不幸的是,这意味着寻呼机也会影响显示的组数。我想我的原始帖子具有误导性,因为该示例仅显示三个词,每个词三个词。我需要在一个页面上显示10个或更多的术语,每个术语3个帖子。这么近:(
奈杰尔·沃特斯

我对“覆盖要显示的项目”无所作为是错的。使用它来确定要显示的组数。输入“ 0”会给您无限个组。
beth,2012年

2

限制此代码的一种方法是将以下内容添加到自定义模块中:

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

这是用于通过关系连接到节点的分类术语的视图。如果仅查看节点,则里程可能会有所不同。

尽管它可以防止每个术语显示超过3个字符,但这不会阻止查询返回每个术语的所有结果,因此根本无法提高SQL性能。如果每个术语都有大量结果,请使用CTools页面管理器之类的东西分别显示视图面板并将它们全部放在一个区域中,这样您就不会在运行大量查询。

与往常一样,您将要在生产中缓存这些东西。


2
真的没有必要对我的性别发表评论。这非常有害。t.co/i1dKE8hQ t.co/ATfV3mBG无论如何,Hook_views_pre_build()或者hook_build_pre_execute()可能会用于降低性能影响的类似操作,但是我对此并不熟悉。或者您可能以前喜欢我对这个问题的回答
beth,2012年

更新:我有很好的权限(Crell和stevector)认为:“您不能在单个查询中分别限制每个组。您必须在呈现阶段进行操作。可惜,SQL无法做到这一点。” 他们还说“最好的办法是进行一系列联合查询”,但是他们也不认为Views可以做到。
beth,2012年

啊,我误以为你是OP。无论如何,“ 窥视摘要”模块在这种情况下可能很有用,尽管它会带来自身的性能问题。它的创造者警告说,它“有些粗鲁,但很酷”。
beth,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.