Передача переменных в шаблон drupal

#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 шаблон для вашей функции загрузки, который сведет к минимуму использование базы данных, когда это произойдет