2011-02-11 70 views
1

当我进入Drupal 7时,我突然对我认为理解的事情感到困惑(或者不需要了解我在Druppal 5和6中花费了相当多的时间 -在Drupal 7中的节点之前生成页面吗?

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

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

或者我想,无论如何。我疯了,还是被迷惑,还是别的什么? D7有没有改变,导致这种看似新的行为,还是我只是困惑?非常感谢任何澄清可能在那里......

回答

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中完全一样。

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

+0

例如,我可能会将dsm调用放入节点 - something.tpl.php中;在提交的页面之后的页面上显示结果。无论如何,我只是重复了将看门狗语句放入node - something.tpl.php和page - something.tpl.php的测试,这次是在D6和D7站点上进行的。在D6中,节点模板在页面模板之前运行;在D7中,页面模板在节点模板之前运行。我检查了我的template.php文件,并且我看不到任何会对这些东西产生任何影响的东西。更令人困惑的是...... – 2011-02-11 17:12:15