【问题标题】:Load content on specific pages using hook_init in Drupal 7在 Drupal 7 中使用 hook_init 在特定页面上加载内容
【发布时间】:2014-02-12 15:41:56
【问题描述】:

我在一个模块中有一个hook_init,它只需要在特定页面上执行。 目前,hook_init 在每次页面加载时都会执行。

问题:

  1. hook_init 是正确的方法吗?
  2. 如果不是,使用我的自定义模块执行页面特定操作的正确选项是什么?
  3. 使用hook_init,然后验证页面的URL。根据比赛,我可以执行我的条件吗?

【问题讨论】:

  • 你想用这个钩子做什么? Hook init 对于在页面呈现之前定义变量和加载样式或脚本很有用。您可以使用 drupal_get_path_alias 按 url 过滤:api.drupal.org/api/drupal/includes%21path.inc/function/…
  • 在我的例子中,我使用它来定义和初始化稍后在页面中使用的变量。所以我应该继续使用 hook_init 和 drupal_get_path_alias ?
  • 是的,记住 hook_init 不在缓存页面中运行。
  • 如果你的网站有缓存页面,你应该使用hook_boot,但我不推荐这个
  • 刚刚快速阅读了 hook_boot。是的,如果我理解正确的话,这个页面有缓存版本和未缓存版本。但是我可以从 hook_boot 中调用 drupal_get_path_alias 吗?

标签: drupal drupal-7


【解决方案1】:

我会尽可能避免使用 hook_init 或 boot。 这些钩子在所有页面上执行,对我来说,即使是路径掩码匹配也是性能的痛苦。

如果要在页面中添加 java 脚本或 css,使用 hook_init 或 boot 是错误的。 hook_init 不在缓存页面上执行。要添加资产,请实现 hook_page_build 并使用 #attached 属性添加它们。

要初始化模板中可用的变量,请实现预处理挂钩。

我并不是说 hook_init 不好。许多模块使用该钩子添加它们的资产。但是从 Drupal 7 开始,几乎所有东西都是可渲染的数组,并且可以更改,直到达到最后一个阶段,您可以更改、调整变量等。

【讨论】:

  • 感谢您的信息。我会看看 hook_preprocess。但为了清楚起见,我的模块只是根据某些条件执行操作,并将结果分配给页面加载后使用的变量。
猜你喜欢
  • 2016-09-21
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
相关资源
最近更新 更多