如何使用Views 3创建带有术语和节点的嵌套树?


22

我需要创建类似以下内容:

颜色(词汇)

  • 红色(字词)
    • 黑暗(术语)
      • 节点1
      • 节点2
    • 轻(术语)
      • 节点3
      • 节点4
  • 蓝色(术语)
    • 节点5
    • 节点6
  • 绿色(术语)
    • 节点7
    • 节点8

(子弹点是缩进的。)
有没有办法用Drupal 7和view 3做到这一点?如果没有,还有其他方法吗?


为了澄清(也许我误解了您的问题),您想在一页上显示这样的结构吗?
Maciej Zgadzaj 2011年

是的只有一页
iStryker 2011年

Answers:


15

感谢refino,我使用以下模块找到了一个不错的解决方案:

在下面找到说明:

  1. 首先创建一个新的分类法(我们称之为“文件夹”)
  2. 然后,使用术语“ Folder”分类法的引用字段创建一个新的内容类型(我们将其称为“ Element”)
  3. 创建一个新的“内容”视图(我们称之为“元素视图”)
  4. 选择字段显示
  5. 向您的字词参考字段添加上下文过滤器
  6. 创建一个新的“ Taxonomy”视图(我们将其称为“文件夹树”)
  7. 添加2个字段(术语名称和术语ID)。可以从显示中排除第二个字段
  8. 关系中:添加“父项”
  9. 添加第三个字段(术语ID)并将其分配给您的父级关系。此字段可以从显示中排除
  10. 选择格式“树(邻接模型)”,然后在参数中选择:有序列表+主字段(您的第一个tid),父字段(您的tid分配给父关系)。您现在应该有一棵漂亮的树,其中包含所有术语
  11. 添加第四个字段“ Global:View”(这是Views Field View附带的),然后选择“元素视图”,在Arguments文本字段中显示Master add [tid]

希望有帮助

干杯

iStryker编辑:这就是我得到的。我唯一更改的是将Element View设置为表视图,并删除了默认(行和带)类。

iStryker的最终产品图片


此评论有很大帮助。只需一点点注意:您可能想重命名字段(管理标题),因为在VT设置下拉列表中,两个“ Term ID”字段将无法区分。
Artur

这个答案使我达到了90%。我需要删除每个字段上的默认类;在“元素视图”视图中删除表类;有点主题
iStryker

我添加了一个步骤来减少“内容”视图中的重复项。另外,Global:View中的“参数”字段现在标记为“上下文过滤器”,并且要使用的标记为“ [!tid]”。
–othermachines

除了有机分类法外,是否可以这样做?
IamOnStage

14

我在Drupal 7.8和Views 3 + Views字段中创建了三个视图,使用Include View将一个视图嵌套到另一个视图中,并且得到了这样的结果(附加)。 在此处输入图片说明

分步操作方法:

  1. 创建词汇表“颜色”并用标签填充它。

  2. 创建分类节点“颜色”的新视图-我称其为“颜色的节点”

2.1格式表,设置:分组字段:分类术语:名称

2.2高级上下文过滤器:分类术语:父术语

2.3高级关系:分类术语:使用颜色的内容

2.4设置字段:分类术语:术语ID,分类术语:名称,(field_color)内容:标题

2.5过滤条件:分类术语:词汇(=颜色)

2.6如果需要,还可以为术语ID,分类术语:名称设置“从显示中排除”

2.7设置路径:/ nodes-of-colors /%

2.8设置无结果的行为:全局:视图区域(稍后我们将再次介绍)2.9保存

3.创建新的分类节点颜色视图-我称其为“颜色节点2”

3.1格式表,设置:分组字段:无

3.2高级上下文过滤器:分类术语:术语ID

3.3高级关系:分类术语:使用颜色的内容

3.4设置字段:分类术语:术语ID,分类术语:名称,(field_color)内容:标题

3.5过滤标准:分类术语:词汇(=颜色)

3.6如果需要,还可以为术语ID,分类术语:名称设置“从显示中排除”

3.7设置路径:/ nodes-of-colors-2 /%

3.8设置无结果行为:全局:无

3.9保存

返回并再次编辑“颜色节点”

4.1转到设置无结果行为:全局:查看区域

4.2设置要插入的视图:视图:nodes_of_colors2显示:页面

4.3设置继承上下文过滤器

4.4保存

5再次返回视图(类型术语)

5.1创建分类节点的新视图颜色-我称之为“颜色树”

5.1格式表,设置:分组字段:无

5.2高级上下文过滤器:无

5.3高级关系:分类术语:父术语

5.4设置字段:分类术语:术语ID,分类术语:术语ID,分类术语:名称,视图:包括视图(包括视图)

5.5筛选条件(1):分类术语:词汇(=颜色)

5.6筛选条件(2):(父)分类术语:术语

5.7如果需要,还可以为术语ID和包含视图的标签设置“从显示中排除”

5.8设置路径:/ colors-tree

5.9设置无结果行为:无

5.10保存

...应该是这样,最后。


您能否再澄清一下“ 5.4设置字段...视图:包含视图”。我在任何地方都看不到该选项。谢谢
uwe

抱歉,我没有写过,我使用了Views 7.x-3.0-rc1 + Views Field 7.x-1.0-rc1
Refineo 2011年

好的谢谢。我按照他们的问题队列上的一些说明以及drupal.org/node/1171604
uwe 2011年

哇,此答案在过去7天中获得了广泛好评。有没有人对此进行过测试,或者您/他们只是因为@Refineo提供了最详细的答案而投票赞成?
iStryker 2012年

我再次尝试了本演练,但没有成功。我恨你们所有支持这个问题的人都是上周未经测试
iStryker 2012年


3

如果要从URL获取vid,请使用以下代码。

$vid = $_GET['vid'];
$tid = 0;
$level = 0;
print taxonomy_tree($vid, $tid, $level);
function taxonomy_tree($vid, $tid = 0, $level) {
  $children = taxonomy_get_children($tid, $vid);
  $output = '';
  if ($children) {
    $output .= '<ul>'; 
    foreach ($children as $child) {
      $level++;
      $output .= '<li class="taxonomy-tree-lvl' . $level . ' ">'; 
print $level;
      $output .= l($child->name, 'taxonomy/term/'. $child->tid) . '(' . taxonomy_term_count_nodes($child->tid) . ')'; 
      $output .= taxonomy_tree($vid, $child->tid, $level);
      $output .= '</li>';

      $level--; 
    }
    $output .= '</ul>'; 
  }

  return $output;

}

或使用以下代码。

$vocabulary = taxonomy_vocabulary_load(2);//Here pass the vid
print $vocabulary->name;
$vid1 = $_GET['vid'];
if(!$vid1) {
$vid1 = 2;
print 'empty';
}
$vid = 2;
$parent = 0;
print get_child_terms($parent, $vid1);
 function get_child_terms($parent, $vid) {
      $sql = "SELECT td.tid, td.vid, td.name"
         . "  FROM {term_data} td"
         . "  JOIN {term_hierarchy} th on th.tid = td.tid"
         . " WHERE th.parent = %d"
         . "   AND td.vid = %d"
         . " ORDER BY td.weight, td.name";
    $terms = db_query($sql, $parent, $vid);
    $output = "";
    while ($aterm = db_fetch_object($terms)) {
        $output .= "<li>";
        $output .= l("$aterm->name", "taxonomy/term/$aterm->tid/all") . " ("
                .  taxonomy_term_count_nodes($aterm->tid) . ")</li>\n"
                .  get_child_terms($aterm->tid, $vid);
    }
    return ($output != "") ? "<ul style='list-style-type: none;
  margin: 0px 0px 0px 20px;
  padding: 0px;'>\n". $output ."</ul>\n" : "";
  }

2

当然有:

  1. 设置您的层次结构词汇,
  2. 将其添加到任何选定的内容类型中,
  3. 使用上下文过滤器创建一个列出该内容类型的节点的视图:

    • 任一“内容:具有分类术语ID”-如果您只想列出分配给特定术语的节点,
    • 或“内容:具有分类学术语ID(具有深度)”-如果要列出分配给特定术语及其子术语的节点,请参见。

      在这种情况下,在过滤器配置中,您需要设置深度-希望该过滤器工作在以下(或以上)的级别。

然后,假设您的视图的URL为http://mysite.com/myview且'Red'tid = 1,如果您访问http://mysite.com/myview/1,它将列出您分配给以下任一节点的所有节点术语“红色”,“深色”和/或“浅色”。


我不是在寻找特定术语的答案。我正在寻找整个词汇的观点
iStryker

这正是我所描述的。
Maciej Zgadzaj 2012年

2

您可以使用分类法菜单模块。这是关于它的报价(来自模块的项目页面):

轻松将您的分类词汇转换为菜单!

特征:

  • 每个词汇的自定义菜单
  • 使用默认分类法术语路径或自定义路径
  • 与视图整合
  • 与Pathauto集成:使用URL /路径别名
  • 不干扰其他菜单模块

欢迎来到Drupal SE!taxonomy_menu是一个很棒的项目,它可以很好地做到这一点。OP希望在Views中做到这一点。
AyeshK

0

我正在尝试达到相同的目的,但是在D7中找不到很多可用的东西。 分类块模块是按块而不是视图进行的。


0

我相信我已经找到了解决此问题的另一种方法,并且我认为比其他解决方案更简单。它不涉及任何其他模块,您只需要一个视图。

假设您已经创建了一个两层的分层词汇表(颜色)和一种内容类型,并且带有对该词汇表的引用,请执行以下操作:

  1. 创建一个新视图并通过“分类词汇:机器名称(=颜色)”进行过滤
  2. 添加关系:(1)Taxonomy term: Content using Color和(2)Taxonomy term: Parent term
  3. 将字段添加到视图中:(1)Titlefield_color在“ Relationship”中选择并需要此关系),(2)Taxonomy term name(不使用关系并从显示中排除)(3)Taxonomy term name(是的,这次选择Parent关系并排除从显示)。
  4. 现在,通过单击“格式设置”将其分组:(1)分组1:(Parent) Taxonomy term: Name(2)Taxonomy term: Name

做完了 如果您有两个以上的级别,只需使用父级作为关系的关系添加另一个父级关系。

编辑:如果您不需要这种关系,您将最终陷入困境。如果父项具有节点引用的子项,则将列出两次父项。因此,这在顶级术语中限制了答案,而没有引用它的节点不会显示。另外,由于排序可能很重要,因此任何内容都引用顶级术语都可能会根据显示需求而给您带来问题。


在添加关系之前,没有过​​滤器“分类词汇:机器名称(=颜色)”。我怀疑第一步是第二步。另外,当我在“关系”中选择field_color时,我不明白如何添加字段标题。
Dimetry
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.