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