构建任意深度的简单分类浏览器的简洁方法


23

我花了几天的时间来确定一种干净的方法来执行以下操作:

  1. 显示词汇表中所有顶级术语的列表及其子术语的链接
  2. 单击链接后,将转到这些条款的孩子的列表。
  3. 无限广告,直到最低级别的术语为止,最低术语将显示带有该术语标记的节点列表。

似乎这是非常普遍需要的功能,但是我找不到能够处理任意深度的解决方案,尤其是如果不是所有术语树都下降到相同深度时。

理想的解决方案是使用Views 3,Contexts,EntityFieldQueries或Drupal 7很好支持的任何其他解决方案。

我能做到几乎通过制作一个简单的观点有三个节点正是我想要的:长期的关系(长期,短期的母公司,以及长期的父亲的父亲)和用户那些连续上下文过滤器。唯一的问题是,如果存在一个术语路径深度太小的节点,该节点将被列为“未分类”并生成无效链接。与其这样做,我不希望它链接到下一个可用的子术语。

Answers:


23

我想出了一种仅使用“视图”模块执行此操作的方法。这不是完美的-它无法像我的单一深度分类法解决方案那样,用分类法谱系生成漂亮的URL和痕迹。

静态深度浏览器

对于静态深度的分类法(其中所有术语具有相同的子术语深度),您可以执行以下操作:

  1. 创建节点视图
  2. 将关系添加到分类术语(术语)
  3. 向分类学术语父级添加关系,可通过术语(父级)访问
  4. 通过父级(父级父级)可访问到分类学术语父级的关系
  5. 根据您的分类法深度,重复执行步骤4所需的次数。
  6. 为每个过滤器添加上下文过滤器,并确保它们的顺序正确。设置为当过滤器不在URL中时显示摘要。
  7. 您可能需要覆盖每个过滤器的面包屑和标题。
  8. ???
  9. 利润

可变深度浏览器

对于可变深度的分类法(某些术语树的嵌套层次比其他术语更深),要复杂一些:

  1. 在您的词汇表中添加一个新的顶级术语(Foo),并将所有其他术语置于其下方。
  2. 使用显示术语名称的页面创建术语视图
  3. 添加上下文过滤器:分类术语:父术语
  4. 如果默认值不在URL中,请提供默认值
  5. 将默认值设置为顶级术语名称(Foo)
  6. 指定验证条件
    • 验证者:分类术语
    • 条件:您的词汇名称
    • 过滤器值类型:术语名称转换为术语ID
  7. 单击“视图”面板顶部的“ +添加”按钮,将附件添加到视图。
  8. 仅添加到此附件(优先)关系:分类术语:带有术语的内容
  9. 仅添加到此附件(覆盖)显示:fields:链接到节点的节点标题,并删除(仅从此附件!)显示:fields:术语名称
  10. 仅添加到此附件((替代)上下文过滤器):分类术语:名称
  11. 如果过滤器值不可用,请提供默认值:URL的原始值:路径部分:2(如果您的页面路径具有> 1的部分,则为更多)
  12. 附件设置:附加到:[您刚创建的页面显示的名称]
  13. ???
  14. 利润

Views UI的屏幕截图,以供参考: 在此处输入图片说明


做得很好!支持问题和答案-这似乎是一件很常见的事情,您的解决方案比我最初尝试回答时发现的要好。
aendrew

8
  1. 创建类型分类的视图
  2. 添加类型分类法术语的上下文过滤器:父术语
  3. 设置提供默认值并将其保持固定。给出前一个父项的术语ID
  4. 分类术语术语ID添加为字段并将其从显示中排除
  5. 添加一个分类术语名称,点击该字段作为链接;将链接设置为“您在视图中设置路径/ [tid]”
    注意:您应取消选中“将该字段链接到其分类学术语页面”

当您访问视图页面时,您会看到顶级父级的子级;根据示例,您将获得:

  • term1
  • term2

当您单击term1时,您将得到孩子。直到您达到条款1.1.1。如果您单击term1.1.1,您将不会得到任何结果。为此,我们需要在上面的视图中再创建一个视图块。

  1. 添加方块
  2. 删除现有的上下文过滤器和字段
    注意:当你删除它们确保你选择此页(过程)从下拉顶部旁边其他明智的领域和内容过滤器,您在页面中创建也将消失。
  3. 添加新的上下文过滤器分类术语:术语ID
  4. 添加关系分类术语:带有术语的内容
  5. 添加内容标题,然后使用顶部下拉菜单中的关系。
  6. 保存视图并返回我们创建的页面(这很重要,否则您将无法完成下一步
  7. FOOTERHEADER中添加一个字段
  8. 从列表中选择“全局:视图区域”,然后从下拉视图中选择要创建的块,然后在其中插入,选中“ 继承上下文过滤器”,以便我们也可以将该视图中的值传递给块
  9. 即使视图没有结果,也请选中“ 显示”,以便在该视图不显示结果时仍显示该块

保存视图,您就完成了。


我遵循了穆罕默德·沙姆姆(Mohammed Shameem)的明确解释。谢谢,作品完美!
Steven

3

我认为您想要的是Views Tree,这是一个使用Views来构建分类学术语的贡献模块。

(请稍等,我将写一个使用它的快速操作方法,查看税额)

显然,该模块有一个问题,阻止它与分类学方面的工作。嘘

就是说,我发现以下代码似乎可以满足您的要求(您可以通过一些非常基本的jQuery代码使其显示/隐藏元素):

<?php

// The ID of the taxonomy vocabulary for which you'd like to create a nested list
$vid = 10;

$depth = 0;
$num_at_depth = 0;
$tree = taxonomy_get_tree($vid);

print "<ul class=\"menu\">\n<li>";
foreach ($tree as $term) {
  $diffdepth = 0;
  if ($term->depth > $depth) {
    print "\n<ul>\n<li>";
    $depth = $term->depth;
    $num_at_depth = 0;
  }
  if ($term->depth < $depth) {
    $diffdepth = $depth - $term->depth;
    while ($diffdepth > 0) {
      print "</li>\n</ul>\n";
      $diffdepth--;
    }
    $depth = $term->depth;
  }
  if (($term->depth == $depth) && ($num_at_depth > 0)) {
    print "</li>\n<li>";
  }
  print l($term->name, 'taxonomy/term/' . $term->tid);
  $num_at_depth++;
}
print "</li>\n</ul>\n";

通过“ 带有页面链接的嵌套类别列表 ”。


我已经启用了该模块并尝试对其进行试验,但我遇到两个问题:1.我怀疑它只是给您一个简单的列表,而不是多页浏览体验;并且2.我无法使其正常工作。方法将是最有帮助的。
beth,2012年

更新的答案。抱歉,“视图树”显然有一个未解决的问题:使用分类法术语。替代答案已发布。
aendrew

这似乎提供了一个简单的嵌套列表,而不是按顺序分页的浏览器。
贝丝2012年

@beth-如果我编写了一些单击父/子项时显示/隐藏该列表元素的jQuery,就足够了吗?
aendrew

我不希望它依赖JavaScript。
beth,2012年

0

如果您只想拥有一组动态分类浏览页面,那么我将按照以下方式进行操作,需要3个Views + 分类显示模块,该模块允许您使用Views显示taxonomy/term/%页面内容:

  1. 顶级术语 -列出其父级为null的术语
  2. 中级条款 -列出其父级不为null的条款。无结果:显示视图3
  3. 带术语的节点 -列出标记有术语的节点。

由于“视图1”和“视图2”可能以类似的方式主题化,因此您可以考虑将它们作为显示器合并到一个“视图”中-这样更易于管理。

我已经成功地将这种方法用于分类。幸运的是,它在每个级别上都是同质的-给定的分支以叶子(节点)或分支(术语)结尾,但不是同时结束。如果这是一个限制,请先进行测试。

当然,这是一个“伪代码”。您需要设置验证和过滤器,以及一个漂亮的,逻辑上看起来不错的pathauto模式以反映结构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.