我需要在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)来查找数据库中的项目吗?
答案 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];
}