#drupal
#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;
}
Теперь я хочу использовать шаблон для отображения специфики элемента, поэтому я создал модуль элемента
a 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:
Вам нужно объявить имена и значения по умолчанию для переменных, которые вы хотите использовать в 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 = amp;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];
}
Комментарии:
1. Я не хочу использовать theme(), потому что мне нужно самому определять весь макет страницы. Когда я использую drupal_get_form, используется стандартный шаблон страницы, и только часть «элемента» выполняется шаблоном элемента. Или я могу использовать theme() и все еще иметь стандартный шаблон страницы?
2. Использование
theme()
не имеет ничего общего с общим макетом страницы на самом деле, оно в основном просто использует систему реестра тем Drupal, чтобы другие модули / темы могли переопределять вывод. Например, вы можете использоватьtheme('image', array('uri' => 'some/path'));
для вывода тематического изображения, которое абсолютно не влияет на страницу в целом.3. Oeps, вы правы. Я пришел к такому выводу, потому что я только что сделал theme(‘show_item’) вместо return theme(‘show_item’).
4. Хорошо, я переписал код, используя ваше решение, и он работает! Большое спасибо. Я заметил, что функция загрузки для элемента вызывается 4 раза. У вас есть какие-либо идеи, почему это так?
5. Это случается со мной довольно часто, и я не всегда полностью уверен, почему, я обновил ответ, включив
drupal_static
шаблон для вашей функции загрузки, который сведет к минимуму использование базы данных, когда это произойдет