Views 上下文过滤器与关系 —— 参数与关联
在本课中,我将重点讲解 Views 中的参数(arguments)使用。参数是 URL 的一部分,例如:
node/15 第一个参数是 node,第二个是 15。 taxonomy/term/10 第一个参数是 taxonomy,第二个是 term,第三个是 10。 user/67 第一个参数是 user,第二个是 67。
我想这些例子已经非常直观,不需要额外说明。
可以使用函数 arg()
来获取参数:
<?php print arg(0) . '<br />'; print arg(1); ?>
如果 URL 是 node/15,输出结果将是:
node 15
在函数 arg
中,参数编号从 0 开始。现在我们来看看在 Views 模块中有哪些现成的实现方式。
显示用户的节点
假设我们在页面 user/1 上,需要显示该用户(uid = 1)发布的节点列表。为此,我们将使用 URL 中的参数。
创建一个新的视图(View)。输出类型选择“块(Block)”,在字段中添加节点标题,只显示已发布的节点,并按发布日期降序排序。
标题:
user_nodes
格式:
未格式化列表(Unformatted list) | 设置
显示:字段(Fields) | 设置
字段(Fields):
内容:标题
筛选条件(Filter criteria):
内容:已发布(是)
排序条件(Sort criteria):
内容:发布日期(降序)
分页器(Pager):
使用分页器:显示指定数量的项目 | 15 项
更多链接:无
接着点击“添加上下文过滤器(Contextual filters,参数)”,选择:
内容: 作者 uid(Author uid)
然后选择:
当过滤值不可用时: 提供默认值(Provide default value) 从 URL 获取用户 ID(User ID from URL)
保存视图,将块添加到需要的区域,然后访问 user/1 页面,在我们创建的块中会显示该用户(uid = 1)的所有节点。
显示关联的节点
现在我们来看一个更复杂的例子。假设我们需要将若干节点关联到另一节点。这可以通过 node reference 字段来实现。要使用这些关联字段,我们需要安装 References 模块及其子模块 Node References。
http://drupal.org/project/references
在 Drupal 7 中,引用字段允许将多个用户或多个节点关联到一个节点。这是通过 node reference 字段实现的。由于 Drupal 7 允许为任何实体添加字段,因此现在可以关联任意实体。
例如,我的网站上有 4 条新闻,我想将第二条新闻与第一条和第三条新闻关联(假设它们主题相似)。
进入“新闻”内容类型的字段管理界面,添加一个带自动完成的 node reference 字段。我将该字段命名为“相似新闻”。然后选择哪些内容类型可以被关联到该节点,并设置该字段可选择的节点数量。我只选择了“新闻”。点击保存字段。接着编辑第二条新闻,在其中会看到“相似新闻”字段。
此时,新闻节点之间的关联会在页面上以列表形式显示。但我们的任务是通过 Views 进行输出设置。
创建一个新的视图(View),输出类型同样选择块(Block)。
标题:
similar_news
格式:
未格式化列表(Unformatted list) | 设置
显示:字段(Fields) | 设置
字段:
内容:标题
筛选条件:
内容:已发布(是)
内容:类型(= 新闻)
排序条件:
内容:发布日期(降序)
分页器:
使用分页器:显示指定数量的项目 | 5 项
添加上下文过滤器(Contextual filter)“内容:Nid”,这次选择:
当过滤值不可用时: 提供默认值(Provide default value) 从 URL 获取内容 ID(Content ID from URL)
然后在“关系(Relationships)”中添加新的关系:
内容: 相似新闻(field_similar)。(如果你的字段名称不同,请选择对应字段。)请注意,还有一个带“reverse”标记的同名字段,这表示反向关系。也就是说,如果我们在“新闻 3”页面上,则会在块中显示“新闻 2”(即使我们最初是在“新闻 2”中选择了与“新闻 1”和“新闻 3”的关联)。
最终会选择以下字段:
Contextual filters:
内容:Nid
Relationships:
内容:相似新闻
然后在“字段(Fields)”设置中,将“使用关系”选项从“Do not use a relationship”更改为我们的关系名称。
字段:
(field_similar) 内容:标题
保存视图并将块放入所需区域。
现在,在“新闻 2”页面上,将会在一个独立的块中显示相似新闻“新闻 1”和“新闻 3”。