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

09.07.2011

В 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:

[video:http://vimeo.com/25272653]

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

Комментарии

Виталий
16.05.2016, 21:30

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

Виталий
17.05.2016, 00:02

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

Добавить комментарий