借助另一个问题:在视图中显示每个分类术语的最新节点我已经能够创建所需的视图,只是它显示每个术语的所有帖子(按术语分组)?如何限制每个学期只显示其最新帖子中的3个。
例如
第1学期
- 第1个帖子
-第2个
帖子-第3个帖子
第2学期
-第1个
帖子
- 第2个帖子-第3个帖子
第三学期
-职位1-
职位2-
职位3
借助另一个问题:在视图中显示每个分类术语的最新节点我已经能够创建所需的视图,只是它显示每个术语的所有帖子(按术语分组)?如何限制每个学期只显示其最新帖子中的3个。
例如
第1学期
- 第1个帖子
-第2个
帖子-第3个帖子
第2学期
-第1个
帖子
- 第2个帖子-第3个帖子
第三学期
-职位1-
职位2-
职位3
Answers:
如果只需要一个节点,则可以使用“代表节点”关系。但是,如果每个学期需要三个节点,请使用“ 视图字段视图”之类的方法。
1)创建内容的“子”视图。像这样:
添加分类术语参数,寻呼机限制,排序等:
现在,您可以将此视图附加到另一个视图。
2)创建分类视图:
添加隐藏的术语ID字段,然后添加“全局:查看”字段:
不要忘记配置缓存。从“ 视图字段视图”页面:
强烈建议将此模块与视图缓存一起使用。视图内容缓存和“缓存操作”是缓存视图的好方法。
经过进一步的调查,“ 偷看摘要”似乎正是您想要的。文档上的屏幕截图是针对Drupal 6的,与Drupal 7稍有不同,因此我附上了一些更新的屏幕截图。
不幸的是,您必须编辑要限制的每个组的寻呼机。当您为一个组编辑寻呼机时,它将更改所有组的设置。如果要显示每个组的节点数与组的总数不同,请覆盖“上下文过滤器”下“格式”设置中的节点数(第一个屏幕截图为紫色)。
它的缺点是本质上为[n]个分组创建[n]个视图,这可能是性能问题,具体取决于您拥有多少个分组,但是它确实将查询限制为仅显示的数量。根据您的用例,这可以提高性能。与往常一样,负责任地缓存。
限制此代码的一种方法是将以下内容添加到自定义模块中:
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页面管理器之类的东西分别显示视图面板并将它们全部放在一个区域中,这样您就不会在运行大量查询。
与往常一样,您将要在生产中缓存这些东西。
Hook_views_pre_build()
或者hook_build_pre_execute()
可能会用于降低性能影响的类似操作,但是我对此并不熟悉。或者您可能以前喜欢我对这个问题的回答。