将两个视图合并为一个视图
Posted
技术标签:
【中文标题】将两个视图合并为一个视图【英文标题】:Combine two views into one view 【发布时间】:2010-04-05 15:42:23 【问题描述】:我想将两种观点合二为一。
第一个视图显示公司 ID = Y 的 X 的所有项目。这是优先排序给客户,然后是其他所有人。
所以我创建了第二个视图,X 的所有项目,其中公司 ID != Y。
我将它创建为附件以附加到第一个视图,但我认为我没有得到预期的结果。
如何组合这些视图,以便首先列出第一个视图结果,然后也列出第二个视图,使用相同的分页器、过滤器和参数?
有没有什么方法可以在不编程的情况下实现它?
【问题讨论】:
查看本教程:sethsandler.com/code/… 【参考方案1】:从 mysql 的角度来看,order-by-field 语法将是处理此问题的适当方式。示例:
SELECT * FROM tickets ORDER BY FIELD(priority, 'High', 'Normal', 'Low');
如果有一个模块可以将这种功能添加到视图中,那就太好了,但是 AFAIK,它不存在。
如果你想在不编程的情况下解决这个问题,我认为你可以使用规则模块在公司 ID = Y 的节点上自动设置“粘性”复选框。有了它,你可以在粘性值上订购视图.
【讨论】:
“粘性”状态就像一个魅力,不需要任何黑客!呜呼。谢谢。【参考方案2】:按照“粘性”的想法,如果您不想覆盖它,也许您可以在公司类型中添加一个复选框字段——isClient。为除客户以外的所有人设置为 false,然后按此排序。
我还没有这样做,但也许您需要将两个版本都创建为附件,并将它们都附加到另一个显示器...?
【讨论】:
【参考方案3】:drupal 5 有意见联盟。有人开始为 D6 做点什么,但我不知道他们走了多远。
http://drupal.org/node/275162
【讨论】:
【参考方案4】:将第二个视图创建为附件并将其附加到第一个视图。
将所有Inherit arguments
、Inherit exposed filters
和Inherit pager
设置为Yes
。
【讨论】:
这就是我所做的,但它显示了 2 个寻呼机,其中一个视图结束,另一个视图开始。 好吧,我创建了一个这样的测试视图: - 带有过滤器的页面显示。 - 带有另一个过滤器的附件显示。 - 我在主显示器“之前”附加了附件。 - 我将继承参数、继承公开过滤器和继承寻呼机设置为“是”并将“渲染寻呼机”设置为“否”。它几乎正常工作。一个寻呼机出现在影响附件的主显示屏下方。但是有一个大问题,我认为它会让你重新考虑所有方法:如果附件显示比主显示有更多的“页面”要显示,你就无法访问它们。寻呼机只有主显示页面的链接;没有了。【参考方案5】:client 参数是如何传递给视图的?作为 url 参数?如果是这样,您可以像我概述 here 一样创建您的第二个视图,然后在适当的位置选择 exclude the argument 选项。
【讨论】:
CompanyID 只是来自过滤器【参考方案6】:通常最简单的方法是使用一个小的 hook_query_alter,但这需要少量的编程。
【讨论】:
对于视图,我相信有一个专用的、特定的函数来改变视图查询。自去年左右以来它是新的。在此之前我尝试使用 hook_query_alter 更改视图查询,结果发现代码非常混乱。 没错,但有时视图不支持的情况下需要直接编辑查询。您提到的方法是 hook_views_alter 但您可以在 advanced_help 文档中找到所有信息【参考方案7】:稍后...但我发现了一个更好的解决方案仅使用 Views 模块:
-
创建一个块视图,其中显示您需要的第一个列表(“
all items of X where company ID = Y
”)
使用第二个列表创建另一个必须是“页面视图”的视图 (all items of X, where company ID != Y
)
在第二个视图的“HEADER
”设置中,单击“Add
”并选择“Global: View area
”。
在“View to insert
”列表中,选择您创建的第一个(如果您正在使用,请选中“Inherid contextual filters
”)
就是这样!
【讨论】:
以上是关于将两个视图合并为一个视图的主要内容,如果未能解决你的问题,请参考以下文章
如何合并两个模型集合并使其成为一个分页然后将其发送到 Laravel 中的视图
在 SQL Server 2008 中将两个表合并到一个索引视图中