我创建了一个自定义内容类型,并使用views2创建各种页面视图。我使用了分类法(有4个术语,比如“A”,“B”,“C”和“D” )用于更广泛地分类此内容类型。还有4个其他分类对应上述每个术语“A”,“B”,“C”和“D “称为”分类标准-A“,”分类标准-B“,”分类标准-C“和”分类标准-D“,用于进一步对特定类别中的此内容类型进行细分(例如”A“或”B“等)。仅当选择了更广泛的类别“A”时,才会在节点编辑表单中显示子类别“分类法-A”。类似于“B”,“C”和“D”类别的情况。 现在在我的网页浏览中,我使用了分类词“A”,“B”,“C”和“D “作为我的第一个网址参数。因此以下网址
www.example.com/A
提供所有已发布的“类别A”的自定义内容类型。类似于“B类”,“C类”等的情况也是如此。 现在,为了将特定类别的内容类型(比如“A”)过滤到其子类别,我创建了与每个分类标准“分类标准-A”,“分类标准-B”,“分类标准-C”相对应的四个公开过滤器, “分类-d”。 现在我想在每种类型的“页面视图”上只显示一个过滤器;即 www.example.com/A 页面视图中与“Taxonomy-A”相对应的过滤器 www.example.com/B 页面视图中对应于“Taxonomy-B”的过滤器 过滤 www.example.com/C 页面视图等对应“Taxonomy-C”
如果我将视图的基本设置配置为在单独的块中显示过滤器,则过滤器块包含所有四过滤器加应用按钮。但是我想用应用按钮只显示一个过滤器(基于页面url的第一个参数)。
实际上我想将所有曝光的滤镜相互分离,并将每个曝光的滤镜作为一个单独的块,可以分配到模板区域。 是否有可能通过主题实现这一点(视图上的每个选择元素都有不同的“id”)?否则,我唯一的选择是为每个类别创建单独的内容类型“A”,“B”,“C”和< strong>“D”,如果类别数量很大,这不是一个实用的解决方案。
我如何实现这一目标?
提前感谢您的回复!!
答案 0 :(得分:0)
好吧,光滑的方法是查看如何修改视图以将不同的公开过滤器吐出到不同的块中,这可能由每个过滤器的配置中的块增量设置决定。那会很整洁。
获取暴露的块,然后使用hook_form_alter()
隐藏要放在不同块上的过滤器。然后以编程方式在新模块中创建新块(或者如果您绝对必须,则通过GUI使用PHP过滤器模块和自定义块)。在该模块中,复制该块中所需的表单元素,包括唯一的公开过滤器。记住暴露的过滤器不关心表单是有用的。他们关心查询。如果需要,您可以在URL中输入过滤器参数。
为公开过滤器中显示的表单实现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”元素。