将变量传递给 drupal 模板

Posted

技术标签:

【中文标题】将变量传递给 drupal 模板【英文标题】:Pass variables to drupal template 【发布时间】:2011-11-05 18:27:05 【问题描述】:

我需要在 drupal 中显示一个由模板创建的页面,该页面基于我表中的特定记录。

我创建了模块“item”(例如)。

我制作了 item_menu 钩子:

  $items['items/%item'] = array(
    'title' => 'Items',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('show_item', 1),
    'access callback' => true,
    'access arguments' => array(),
  );  

我为项目创建了一个加载函数:

function item_load($itemid)

  $sql = 'SELECT * FROM items it WHERE it.id = :itemid';

  $result = db_query(
    $sql, 
    array(':itemid' => $itemid), 
    array( 'target' => 'mydatabase' ));

  $item = $result->fetchObject();
  return $item;

现在我想用一个模板来显示物品的细节,所以我做了一个物品模块 item.tpl.php。和一个 item_theme 钩子来注册模板:

function item_theme($existing, $type, $theme, $path) 

  return array(
    'show_item' => array(
      'template' => 'item',
      'variables' => array(),
    ),
  );

我需要做的最后一件事是将项目对象传递给 item.tpl.php,以便我可以显示项目属性。

但我不知道该怎么做。如何使该项目在模板中为人所知??

我希望问题足够清楚。提前致谢。

[编辑]

我发现 arg(1) 包含来自菜单页面参数的通配符的值,我应该使用 arg(1) 在数据库中查找该项目吗?

【问题讨论】:

【参考方案1】:

您需要在hook_theme 的数组的variables 部分中声明要使用的变量的名称和默认值:

function item_theme($existing, $type, $theme, $path) 
  return array(
    'show_item' => array(
      'template' => 'item',
      'variables' => array('var1' => NULL, 'var2' => NULL, 'etc...'),
    ),
  );

然后像这样调用主题函数:

$item_output = theme('show_item', array('var1' => $a_var, 'var2' => $another_var));

** 更新 **

要解决 load() 函数被调用 4 次的问题,您可以使用静态变量来避免每次都运行查询:

function item_load($itemid) 
  $items = &drupal_static(__FUNCTION__, array());

  if (!isset($items[$itemid])) 
    $sql = 'SELECT * FROM items it WHERE it.id = :itemid';
    $items[$itemid] = db_query(
      $sql, 
      array(':itemid' => $itemid),
      array('target' => 'mydatabase')
    )->fetchObject();
  

  return $items[$itemid];

【讨论】:

我不想使用theme(),因为我需要自己定义整个页面布局。当我使用 drupal_get_form 时,使用标准页面模板,并且只有“项目”部分由项目模板完成。或者我可以使用 theme() 并且仍然拥有标准页面模板吗? 使用theme()实际上与整体页面布局无关,它基本上只是利用了Drupal的主题注册系统,以便其他模块/主题可以覆盖输出。比如你可以使用theme('image', array('uri' => 'some/path'));输出一个主题图片,对整个页面完全没有影响。 哎呀,你是对的。我得出这个结论是因为我只是做了 theme('show_item') 而不是 return theme('show_item')。 好的,我用你的解决方案重写了代码,它正在工作!非常感谢。我注意到该项目的加载函数被调用了 4 次。你知道这是为什么吗? 这发生在我身上,我并不总是完全确定为什么,我已经更新了答案,为你的加载函数包含了drupal_static 模式,这样可以最大限度地减少数据库的使用发生

以上是关于将变量传递给 drupal 模板的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7将变量传递给同一视图

在Drupal 7中的页面之间传递变量

Drupal 8添加javascript并使用自定义模块在钩子中传递数据

React w/ Apollo & Drupal nodeQuery - 如何定义/传递变量?

Drupal 7中的PHP变量到jQuery

Drupal 7 视图 $title 变量