将 Drupal 中所有暴露的过滤器相互解耦,并将每个暴露的过滤器作为一个单独的块
Posted
技术标签:
【中文标题】将 Drupal 中所有暴露的过滤器相互解耦,并将每个暴露的过滤器作为一个单独的块【英文标题】:Decouple all the exposed filters in Drupal with each other and make each exposed filter as a separate block 【发布时间】:2010-08-30 15:59:34 【问题描述】:我创建了一个自定义内容类型并使用views2 来创建各种页面视图。我使用了一个分类法(有 4 个术语,比如 "A"、"B"、"C" 和 "D" ) 用于对这种内容类型进行更广泛的分类。还有 4 个其他分类法对应于上述每个术语 “A”、“B”、“C” 和 “D " 称为 "Taxonomy-A"、"Taxonomy-B"、"Taxonomy-C" 和 "Taxonomy -D" 用于在特定类别中进一步细分此内容类型(例如 "A" 或 "B" 等)。 The sub-category "Taxonomy-A" is visible on the node edit form only if broader category "A" is selected. "B"、"C" 和 "D" 类别的情况类似。 现在在我的页面浏览中,我使用了分类术语 "A"、"B"、"C" 和 "D " 作为我的 url 的第一个参数。因此以下网址
www.example.com/A
提供所有已发布的“A 类”自定义内容类型。 “B 类”、“C 类”等的情况也类似。 现在要将特定类别(例如“A”)的内容类型过滤到其子类别中,我创建了四个暴露的过滤器,对应于每个分类“分类-A”、“分类-B”、“分类-C”和“分类-D”。 现在我想在每种类型的“页面视图”上只显示一个过滤器;即 过滤器对应于 www.example.com 上的“Taxonomy-A” /A 页面视图过滤器对应于 www.example.com/B 上的“Taxonomy-B” /strong> page-viewFilter 对应于 www.example.com/C page-view 等上的“Taxonomy-C” .
如果我配置视图的基本设置以在单独的块中显示过滤器,则过滤器块包含所有四个过滤器加应用按钮。但我只想显示一个带有应用按钮的过滤器(基于页面 url 的第一个参数)。
实际上我想将所有暴露的过滤器相互解耦,并将每个暴露的过滤器作为一个单独的块,可以分配给一个模板区域。 是否可以通过主题来实现这一点(视图暴露过滤器表单上的每个选择元素都有不同的“id”)?否则,我剩下的唯一选择是为每个类别 "A"、"B"、"C" 和 "C" 创建单独的内容类型strong>“D”,如果类别数量很大,这不是一个实际的解决方案。
我怎样才能做到这一点?
提前感谢您的回复!
【问题讨论】:
【参考方案1】:1。超级光滑
好吧,巧妙的方法是查看如何修改视图以将不同的暴露过滤器吐出到不同的块中,这可能由每个过滤器配置中的块增量设置决定。那会很整洁。
2。 Overkill/Redundant/FAPI-hook_block() 演练
获取您的公开块,然后使用hook_form_alter()
隐藏您想要放置在不同块上的过滤器。然后在新模块中以编程方式创建新块(或者如果您绝对必须,php 过滤器模块和通过 GUI 的自定义块)。在该模块中,复制您在该块中需要的表单元素,包括唯一的暴露过滤器。记住暴露的过滤器不关心表单是很有用的。他们关心查询字符串。如果需要,您可以在 URL 中输入过滤器参数。
3。条件修饰
为暴露的过滤器中显示的表单实现 hook_form_alter()。要识别此表单,您首先需要获取 views_exposed_form
的 id(不确定是否如此),然后从表单数组中获取更具体的标识以仅针对此公开表单。 (无论如何,方法#2 都需要这个)。
现在你有了它,你可以做几件事。首先,请记住,如果您积极地以全局方式缓存此块,这将会中断。每页缓存,或以您打算更改块的任何粒度缓存。对于您要隐藏的每个过滤器,您将在$form['#access']
中添加一些逻辑,以便 Drupal 可以查看表单元素,查看它所在的页面,并隐藏该表单元素,因为它没有被使用。
如果你碰巧依赖于当前页面路径,你可能会这样做:
$form['taxonomy_b_filter']['#access'] = arg(0) == 'section';
如果当前页面路径看起来像 http://example.com/section,这会告诉 Drupal 隐藏虚构的 'taxonomy_b_filter' 元素。
【讨论】:
感谢格雷赛德的回答!如果需要更多信息,我将研究您的方法并返回这里。以上是关于将 Drupal 中所有暴露的过滤器相互解耦,并将每个暴露的过滤器作为一个单独的块的主要内容,如果未能解决你的问题,请参考以下文章