【问题标题】:Where to declare variables common to different include files in a module - Drupal在哪里声明模块中不同包含文件共有的变量 - Drupal
【发布时间】:2011-08-27 20:11:50
【问题描述】:

我有一个 Drupal 模块“示例”。我已将模块的管理和客户端功能拆分为两个包含文件 example.admin.inc 和 example.pages.inc。我在 example.module 文件中声明了常量 (define()),它们可以在 pages.inc 文件和 admin.inc 文件中访问。

但是我怎样才能在一个集中的位置声明普通的 $variables,以便它们可以在 admin.inc 文件和 pages.inc 文件中访问。我尝试在 example.module 中声明 $variable,但无法在 example.admin.inc 和 example.pages.inc 中访问它。

【问题讨论】:

  • 什么样的变量?那些只为单个页面请求而存在的,或者持久化的值,可以被覆盖的变量......?
  • 这可以被覆盖。可能是作为表达式的结果进行评估的结果。

标签: drupal drupal-6 drupal-modules


【解决方案1】:

有多种可能性,取决于你想要的。

可覆盖的设置

您可以使用variable_get('your_module_your_key', $default_value);。然后,很容易在 settings.php 中用$conf['your_module_your_key'] = 'other value'; 覆盖它。见http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/variable_get。

为此构建一个设置表单也很容易,例如参见http://api.drupal.org/api/drupal/modules--menu--menu.admin.inc/function/menu_configure/7。

请注意,您应该始终为变量添加模块名称的前缀,并且您不要将其用于频繁更改的变量,因为每次更改都会导致缓存清除对于所有变量。另请注意,所有变量都会在每个页面请求中加载,因此不要创建太多变量或在其中存储大数据结构。它们主要用于配置。

静态获取/设置函数

您可以编写简单的 get/set 函数,在单个页面请求期间在内部使用静态变量来交换变量。参见例如http://api.drupal.org/api/drupal/includes--path.inc/function/drupal_set_title/6。

请记住,这些内容仅为单个页面请求保留。这是一个示例实现,它允许保存由字符串标识的多个变量,因此其工作方式类似于 variable_get()/set()。

<?php
function yourmodule_static($key, $value = NULL) {
  static $storage;

  if (isset($value)) {
    $storage[$key] = $value;
  }
  return $storage[$key];
}

// Then, you can use it like this:
your_module_static('key', $value);

// And then in a different function/file:
$value = your_module_static('key');

您还可以将其扩展为按引用返回等等。

缓存

要存储来自慢速数据库查询或复杂计算的数据,您可以使用缓存系统。 http://www.lullabot.com/articles/a-beginners-guide-to-caching-data 似乎对此进行了详细而出色的解释。

请注意,缓存默认存储在数据库中,但可插入,例如也可以使用 APC 或 Memcached。

【讨论】:

  • 说实话,和我预期的不太一样,但感谢您的详尽回答。
  • 然后更好地解释您的预期。这些是您在 Drupal 中拥有的选项,除了全局变量之外没有其他可能性(静态 get/set 辅助函数可以直接替代它)。
  • 我希望有一个全局“like”变量,它存在于特定模块的范围内,而不是全局范围内。 variable_get() 看起来不错,但它使用数据库,对吧?希望你明白我的意思。
  • Drupal 中没有“模块范围”,所有模块都运行在同一个全局命名空间中。但如上所述,您可以使用将数据存储在内部静态函数中的 set/get 函数。如果你有多个不同的东西要存储,很容易将上面的模式扩展到yourmodule_static($key, $value) 之类的东西。 Drupal 7 有一个 drupal_static() 函数能够重置工作非常相似的静态缓存。我将更新我的示例。
【解决方案2】:

在 .module 文件中,但您需要将其定义为全局

【讨论】:

  • 嗯,我希望有一个没有全局变量的解决方案。
  • 不知道有没有别的办法,
  • 这绝对是一个选项,谢谢 :) 但问题是我有这个针对全局变量的东西。
【解决方案3】:

对于 Drupal 7,请参阅新的 drupal_static() 函数: http://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/drupal_static/7

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 2018-02-02
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2023-03-27
    相关资源
    最近更新 更多