是否在Drupal 7中的节点之前生成页面?

时间:2011-02-11 02:35:39

标签: drupal drupal-7

当我进入Drupal 7时,我突然对我认为理解的东西感到困惑(或者在我在Drupals 5和6中度过的相当长的时间内不需要理解 -

我将处理一个模块,在开发代码的过程中,我会抛出几个调用dsm()和/或drupal_set_message()。在我之前的工作中,这些调用总是以我预期的方式工作 - 在下一页提交时,dsm将运行,生成他们生成的任何内容,结果将最终出现在页面上。在Drupal 7中,我正在做同样的事情,但我发现它们显示的页面太晚了 - 我必须刷新页面才能看到它们。这让我觉得Drupal 7评估模型是评估所选页面模板然后 - 然后 - 只有这样 - 页面上显示的节点才会被加载和渲染。果然,看门狗()和sleep()的一些测试证实了这一点 - 页面模板肯定会在处理页面内的节点之前开始处理。 (这是标准D7页面模板只有非常微小的变化版本,没有内部D7行为的时髦调整,顺便说一下,我对缓存没有什么特别之处 - Config上的所有缓存选项>开发>性能已关闭。)

这解释了消息行为 - 页面模板在页面呈现过程开始时显示它可用的任何消息,然后在节点上工作。如果在呈现节点时生成任何消息,它们将继续显示消息堆栈,但它们不会出现在此版本的页面上,因为消息堆栈已由页面模板呈现(并清除)。但这似乎是错误的 - 我希望这些消息作为立即呈现页面的一部分出现。我也确定D6没有这样做 - dsm()消息会立刻出现。这不仅仅是一个调试问题;它也搞乱了一些表单验证代码,其中验证错误没有出现在表单提交的页面上,正是出于这个原因。

无论如何,我认为还是这样。我是疯了,还是迷惑,还是其他什么? D7是否有变化导致这种看似新的行为,或者我只是感到困惑?非常感谢你们的任何澄清......

1 个答案:

答案 0 :(得分:2)

你究竟在哪里添加你的dsm()电话?

状态消息以http://api.drupal.org/api/drupal/includes--theme.inc/function/template_process_page/7为主题(D6中为template_preprocess_page)

在该步骤之后添加的所有消息,例如page.tpl.php中的消息,仅显示在下一页上。不知道D5,但这在D6中完全相同。

在菜单回调处理过程中发生的所有事情都应该在之前执行并显示在同一页面上。