1

我的博客上,我有一系列关于一个共同主题的帖子,我想将这些帖子与一个共同的导航块链接在一起,以便读者可以轻松地在该系列中向前或向后跳转。

我已经使用NodeQueue将所有博客条目按顺序收集在一起。将关联的块放在我的侧边栏中给了我想要的导航,但该块出现在我网站的每个页面上。

我想要做的是限制块的可见性,以便它只出现在队列中包含的页面上。我怎样才能做到这一点?

我知道 NodeQueue 使用Views创建它的块,所以我猜答案可能更多地与使用 Views 而不是 NodeQueue 有关。如果有一个模块可以满足我的需要,那就太好了。如果答案需要 PHP(例如,用于配置块可见性),那么我需要一些帮助。

该博客在 Drupal 6.19 上运行,我确实有一个测试实例,我可以在接触实时站点之前尝试一下。

4

3 回答 3

1

块可见性与其内容无关。如果您想为队列中的节点显示一个静态块,那同样困难。

我看到了可能的解决方案。

  • 在块可见性设置中手动输入节点并选择在列出的页面上显示
  • 创建一个 PHP 片段来测试用户是否看到一个节点,查询数据库以查看它是否在队列中。(我不喜欢这种方法)

第一个提供更多管理,但最后一个很容易中断,我不喜欢将代码存储在数据库中。

于 2010-10-09T07:59:00.017 回答
1

好的,虽然我认为这是一个优雅的解决方案,但它有点冗长。我希望它不会吓到你——它确实并不复杂,但与代码不同,它很难用文本解释。弄清楚这一点很有趣。此答案适用于 Views 版本 2 或更高版本。本质上,该解决方案结合了两个模块

  1. 视图附加(http://drupal.org/project/views_attach
  2. 节点队列(特别是分类队列)

在继续之前,请阅读附加视图。此视频最好地解释了观看次数http://mustardseedmedia.com/podcast/episode37

分类队列只不过是为词汇表中的每个分类术语自动创建的节点队列。假设我们有一个名为的分类节点队列My Lists。假设您有一个名为的词汇表Series,它有 3 个术语:Apache Solr Tutorial SeriesCSS Tips and Techniques SeriesDrupal Views Tips Series。如果My ListsSeries用作其分类源,则将创建 3 个子队列——每个术语一个。

在您的博客上,您将拥有多个系列文章(您称其为带有“共同主题”的文章)。每个系列都将独立于另一个系列。每个系列将包含 2 个或更多博客的列表。重要的是要注意,在我提出的解决方案中,博客只能成为 1 系列的一部分——我希望没问题。我们正在使用基于 Nodequeue 的解决方案,因为您要求系列中博客的列出顺序很重要并且必须保留。

首先,您需要创建一个词汇表(假设我们称之为Series)。每次创建新的博客系列时,您都会创建一个新的分类术语,例如Apache Solr Tutorials SeriesCSS Tips and Techniques Series等等。确保Series词汇表适用于您的blog内容类型。

您现在需要创建分类队列。只需Smartqueue Taxonomy在模块列表中启用。它带有标准的 Nodequeue 模块。单击内容管理 > 节点队列 > 分类队列。命名队列My Lists。确保选择Series作为词汇表。您可以将队列的长度保留为0(无限制),因为每个系列的博客都可以包含任意数量的博客。现在:

  1. Link "add to queue" text:Add to %subqueue
  2. Link "remove from" queue text:Remove from %subqueue

这是一种方便的事情。它将在每个blog节点的底部为您提供链接,以在相应的分类队列中添加或删除。因此,如果一篇博客文章有分类术语CSS Tips and Techniques,它将在完整节点页面(甚至是预告视图)的底部获得一个链接,以便可以将其添加到节点CSS Tips and Techniques队列中的子队列中My Lists

这样就完成了分类队列的设置。

现在我们进入视图附加。请在继续之前启用视图附加模块。本质Views attach上在节点的末尾附加了一个视图。在我们的例子中,我们的视图将是系列中其他文章的列表(仅当博客是系列的一部分时)。

我们基本上需要将节点的分类术语“传递”给视图。此分类术语将在节点队列中选择适当的子队列My Lists。该子队列中的所有项目都将按照您指定的确切顺序显示(通过标准 Nodequeue 接口)。

制作视图的步骤。

  1. 让我们调用视图display_other_blogs_in_series
  2. 添加类型的显示Node Content(启用视图附加后可用)。这是一种类似于块和页面显示的显示,但具有将自身附加到节点的特殊能力。

中进行以下设置Node Content Display

Node content settings
Node types: blog
Build modes: Teaser, Full node
Arguments: token
Show title: No

您应该Use tokens from the node the view is attached to在参数下选择。让标记为[term-id]这是“顶级分类术语的 ID”。这个非常重要!!本质上,您将从Series词汇表(例如 CSS 技巧和技术)中将博客节点的分类术语作为参数传递给视图。为此,Series词汇表必须具有最低的权重。(见http://groups.drupal.org/node/11788#comment-38332)。如果它的权重最低,那么分类词汇将是节点编辑表单分类部分中的第一个词汇。

现在我们需要告诉我们的 View 只从My Lists队列中获取项目。添加关系Nodequeue: Queue。确保[x] Require this relationship被选中。确保[x] Limit to one or more queues选择 withMy list作为队列。

添加一个参数Nodequeue: Subqueue Reference。确保关系是queue我们上面定义的关系。这个论点将成为Series词汇表中的分类术语。此参数将导致选择正确的子队列。

添加您感兴趣的字段,例如Node: Title。确保Node: Title通过打勾将其制成超链接Link this field to its Node

添加Nodequeue: Position为排序条件。确保排序顺序是升序并确保使用关系queue

在过滤器中,确保添加Node: Type = blog为过滤器。

所以这个视图要做的是:

  1. Series从当前正在查看的节点中的词汇表中获取分类术语
  2. 将其作为参数传递给视图display_other_blogs_in_series
  3. 视图将使用该参数在队列中选择适当的子My Lists队列
  4. 子队列中的项目将按照您指定的顺序一一列出
  5. 这将正确出现在属于特定系列的每个博客中

而已!

后记: 如果您正在使用 Views 3(在撰写本文时当前为 alpha3)并且您想要一个块(现在相关文章位于节点正文的末尾),您可以通过以下方式进行操作:

  1. 忘记附加视图......它不是必需的
  2. 添加块视图。它应该包含与上述Node Content显示说明相同的参数、关系、字段和过滤器。
  3. 您需要Nodequeue: Subqueue Reference稍微修改参数的设置:在Action to take if argument is not present:选择下[x] Provide Default Argument。选择[x] Taxonomy Term ID from URL。现在确保[] Load default argument from term page未选中并[x] Load default argument from node page, thats good for related taxonomy blocks.选择[x]Limit terms by vocabulary词汇Series表。
  4. 确保为块命名并将其放在适当的区域中。
于 2010-10-11T20:23:28.097 回答
0

我实际上并没有玩过 NodeQueue,但根据您的描述,这听起来像是您应该能够使用视图来完成的事情。几个想法。

如果您仅对博客条目使用不同的内容类型,那么您应该能够将该内容类型添加为视图上的过滤器。那可能是最简单的。

如果你不能这样做,那么我会看看你是否可以为 NodeQueue 添加一个过滤器,因为它也应该可以工作。

如果以上都不起作用,我会看看你是否可以向 NodeQueue 添加关系。这样做可能会成功,因此您可以为 NodeQueue 添加过滤器。

最后,如果您在这里没有得到满意的答案,我建议您在 Drupal.org 上发布您的问题,因为那里有很多 drupal 专家回答问题。

于 2010-10-09T06:16:24.810 回答