将变量传递给drupal模板

时间:2011-11-05 18:27:05

标签: drupal

我需要在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对象传递给item.tpl.php,这样我就可以显示项属性了。

但我不知道该怎么做。如何在模板中识别项目?

我希望这个问题足够明确。提前谢谢。

[编辑]

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

1 个答案:

答案 0 :(得分:0)

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

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];
}