xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Кэширование в Render API

Опубликовано в

В Drupal 7, в калбаках меню или любых других функциях, которые что-то выводят на экран, принято возвращать "рендер массив". Преимуществом такого подхода является возможность альтерить данные перед их преобразованием в html.

В Render API есть система кэширования, которая включается при добавлении в рендер массив параметра #cache. Пример ниже.

Как это было в Drupal 6:

/**
 * Menu callback
 */
function mymodule_page() {
  if ($cache = cache_get('mymodule:titles')) {
    $output = $cache->data;
  }
  else {
    $output = theme('item_list', mymodule_get_titles());
    cache_set('mymodule:titles', $output, 'cache', time() + 60*60);
  }
  return $output;
}

Как нужно делать в Drupal 7:

/**
 * Menu callback
 */
function mymodule_page() {
  $build['titles'] = array(
    '#theme' => 'item_list',
    '#items' => array(),
    '#pre_render' => array('mymodule_page_titles_pre_render_callback'),
    '#cache' => array(
      'keys' => array('mymodule', 'titles'),
      'bin' => 'cache',
      'expire' => REQUEST_TIME + 60*60,
    ),
  );
  return $build;
}
 
/**
 * Pre render callback
 */
function mymodule_page_titles_pre_render_callback($element) {
  $element['#items'] = mymodule_get_titles();
  return $element;
}

На десерт видео с DrupalCamp Kyiv 2011, в котором MadCap рассказывает о Render API:

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Здравствуйте. скажите, пожалуйста, как такой способ кэширования живет с формами? я столкнулся с тем, что стандартное кэширование ломает их, так как такая форма работает с одним пользователем и другие пользователи не могут ей воспользоваться, она уже как бы своою сессию отмотала и так до сброса кэша.

формы кэшировать нельзя

Спасибо, но я своим сообщение то же самое написал по сути) но думаю этот ответ говорит, что для страниц с формами об этом способе стоит забыть

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании