drupal页面上的“上下文”

Posted

技术标签:

【中文标题】drupal页面上的“上下文”【英文标题】:"context" on a drupal page 【发布时间】:2009-12-18 12:13:52 【问题描述】:

这个问题很笼统,我已经发布了它的一个版本here。不过,我希望通过在这个论坛中提问,我将有更好的机会得到回应,并对更多人有用。

当所有内容都加载到 drupal 页面时,将内容关联在一起是一件棘手的事情。在 drupal 中,每个页面,无论是哪个站点,都基本相同:中间有主要内容(一个视图、一个节点或多个节点),围绕该中心内容的块。为了让块以某种方式了解中间的内容,(更不用说彼此了解)您必须在自己的自定义模块中做一些非常花哨的步法,或者您必须在 URL 中提供“参数”。

我一直在研究 developmentseed 提供的 spaces/context/features/purl 模块套件,还研究了 Earl 制作的 Panels/Ctools 模块迈尔斯(写观点的人)。虽然两者都提供了使我的工作更轻松的工具,但我对每一个的理解是,如果我想要由我的“上下文”定义的块的内容,我仍然需要在 URL 中放置“参数”(我通常使用它)意义,而不是上下文模块或 Ctools 中上下文概念所指的特定意义)。

我是否遗漏了什么,或者这就是我们使用 Drupal 的地方?

最后,我应该说,我知道其他模块可以在有限的情况下帮助解决此类问题。例如,Views attach 模块和Node reference views 模块都针对一个非常具体的用例尝试解决这个问题。它们都是很好的模块,还有其他类似的模块,但我真的很想找到解决这个问题的方法。

【问题讨论】:

如果您想要讨论/对话而不是问题的真正答案,您应该将您的问题放入社区 wiki。 @googletorp 我刚刚把它做成了一个 wiki - 感谢您的建议! 【参考方案1】:

我想我不太明白你的目标是什么,但我还是会尝试:

对于每个非静态网站,无论是基于 Drupal 还是其他任何东西,都有两个基本的东西为决定为给定请求提供什么内容提供“上下文”。

第一件也是最重要的事情显然是请求本身。这是始终保证存在的唯一信息。在大多数情况下,这将只是一个 GET 请求,并且对于这些请求,URL 隐含地是 the 可用的“上下文”的主要来源。除了 URL 之外,POST 请求还可以提供更多“上下文”,但是对于您的问题,有人可能会争辩说它们只是 GET 请求的一种更复杂的变体,除了来自 URL 的那些(以及在大多数情况下,无论如何都可以将 POST 请求转换为具有更详细 URL 的 GET 请求)。

第二个“提供上下文”的东西是会话。无论会话处理基于什么机制(现在主要是 cookie),目标总是相同的,即携带一些“状态”信息跨越固有无状态请求的边界。它通过将给定请求与来自先前请求的信息相关联来实现这一点,这些信息存储在服务器端。这允许“丰富”可用于决定为请求提供什么内容的信息。基本上,可以将其视为向请求添加更多“参数”的一种方式。

就是这样。组装响应所需的任何其他信息都需要以某种方式从请求中给出的信息中导出(并且可以说会话处理已经是这样做的主要过程,通过添加基于 cookie 或其他一些标识符的“上下文”随请求而来)。

Drupal 很好地反映了这个过程,恕我直言,因为它首先根据 URL 为响应组合“主要”内容,并在会话中“附加”附加信息(例如关于用户的信息)。只有在 主要内容通过调用 index.php 中的 $return = menu_execute_active_handler() 组装后,才会通过调用 theme('page', $return); 添加响应的其他元素(例如块、菜单等) .

因此,无论您想要“传递”给其他元素的“上下文”是什么,您要么必须从已经用于组装主要内容(URL、会话)的信息中“重新提取”它,要么必须在生成主上下文期间临时存储它。您可以通过多种方式做到这一点,例如通过将其添加到已经存储在会话中的信息中,通过在某些函数中使用静态缓存,通过设置全局变量(不要;),通过数据库传递内容等等......

再说一次,我似乎不明白你的目标是什么。你在这里缺少什么?

【讨论】:

@Henrik 感谢您抽出宝贵时间提供周到的回复。你确实完全理解我的目标。我提出了我的问题,因为我正在使用 Drupal 构建一个网站,但这个问题本质上与 Drupal 无关。相反,我遇到了 Web 开发中的老问题:如何在无状态环境中维护状态。因此,您已经回答了我的问题,因为您帮助我理解了我所有的选择。基本上,我可以使用请求本身(即 URL)或会话。此外,临时存储是可能的,但要小心...【参考方案2】:

Henrik 的回答很好,但我想补充一点,除了使用 cookie 维护状态之外,请求中可能包含很多信息。想想重要的 HTTP 标头,例如接受或语言,甚至 X-REQUESTED-WITH。大多数网络框架将这些信息包装到一个方便的数据结构中。不幸的是,从给出的答案中我不得不得出结论,drupal 没有。

【讨论】:

以上是关于drupal页面上的“上下文”的主要内容,如果未能解决你的问题,请参考以下文章

drupal 7中的上下文过滤器视图

如何在没有面板的Views Drupal 7中将组ID作为上下文

Drupal:如何使用上下文来触发由视图引起的分类术语条件的反应?

Drupal 8 根据当前路线更改菜单链接

创建一个 Drupal 视图,加载共享任何一个分类术语的所有文章(上下文过滤器)

Drupal 7 视图显示具有相同分类术语的节点