В 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
Комментарии
Здравствуйте. скажите, пожалуйста, как такой способ кэширования живет с формами? я столкнулся с тем, что стандартное кэширование ломает их, так как такая форма работает с одним пользователем и другие пользователи не могут ей воспользоваться, она уже как бы своою сессию отмотала и так до сброса кэша.
формы кэшировать нельзя
Спасибо, но я своим сообщение то же самое написал по сути) но думаю этот ответ говорит, что для страниц с формами об этом способе стоит забыть
Добавить комментарий