Думаю, что все вы знаете о том, что представление компонента может быть закэшировано. Но все ли понимают, зачем при этом использовать переменные запроса? Давайте разберемся.
Активировать кэширование представления в своем компоненте достаточно легко. Возьмем стандартный метод display() вашего контроллера:
public function display($cachable = false, $urlparams = array()) { ... $cachable = true; ... parent::display($cachable, $urlparams); }
Итак, вызов JControllerLegacy::display() с первым параметром в значении true активирует кэширование. Но зачем нужен второй параметр $urlparams?
$urlparams – это массив переменных запроса и их типов фильтра, который участвует в генерации уникального ID кэша. Например:
$urlparams = array( 'format' => 'WORD', 'option' => 'WORD', 'view' => 'WORD', 'layout' => 'WORD', 'tpl' => 'CMD', 'id' => 'INT' );
Давайте посмотрим, каким же образом этот массив участвует в генерации уникального ID кэша. Сначала заглянем в метод JControllerLegacy::display() и найдем место вызова кэша:
/libraries/legacy/controller/legacy.php
// Display the view if ($cachable && $viewType != 'feed' && $conf->get('caching') >= 1) { $option = $this->input->get('option'); $cache = JFactory::getCache($option, 'view'); if (is_array($urlparams)) { $app = JFactory::getApplication(); if (!empty($app->registeredurlparams)) { $registeredurlparams = $app->registeredurlparams; } else { $registeredurlparams = new stdClass; } foreach ($urlparams as $key => $value) { // Add your safe url parameters with variable type as value {@see JFilterInput::clean()}. $registeredurlparams->$key = $value; } $app->registeredurlparams = $registeredurlparams; } $cache->get($view, 'display'); } else { $view->display(); }
Мы видим, что до вызова кэша $cache->get($view, 'display');> наш массив регистрируется в свойстве registeredurlparams приложения, которое является простым объектом, свойства которого – это название переменной запроса, а значение – типа фильтра переменной. Вот как выглядит это объект при кэшировании com_content:
print_r($app->registeredurlparams); stdClass Object ( [catid] => INT [id] => INT [cid] => ARRAY [year] => INT [month] => INT [limit] => UINT [limitstart] => UINT [showall] => INT [return] => BASE64 [filter] => STRING [filter_order] => CMD [filter_order_Dir] => CMD [filter-search] => STRING [print] => BOOLEAN [lang] => CMD [Itemid] => INT [format] => WORD [option] => WORD [view] => WORD [layout] => WORD [tpl] => CMD )
Далее свойство registeredurlparams обрабатывается в методе makeId() класса JCache:
/libraries/joomla/cache/cache.php
/** * Create safe id for cached data from url parameters set by plugins and framework * * @return string md5 encoded cacheid * * @since 11.1 */ public static function makeId() { $app = JFactory::getApplication(); $registeredurlparams = new stdClass; // Get url parameters set by plugins if (!empty($app->registeredurlparams)) { $registeredurlparams = $app->registeredurlparams; } // Platform defaults $defaulturlparams = array( 'format' => 'WORD', 'option' => 'WORD', 'view' => 'WORD', 'layout' => 'WORD', 'tpl' => 'CMD', 'id' => 'INT' ); // Use platform defaults if parameter doesn't already exist. foreach ($defaulturlparams as $param => $type) { if (!property_exists($registeredurlparams, $param)) { $registeredurlparams->$param = $type; } } $safeuriaddon = new stdClass; foreach ($registeredurlparams as $key => $value) { $safeuriaddon->$key = $app->input->get($key, null, $value); } return md5(serialize($safeuriaddon)); }
Мы видим, что делается обход объекта registeredurlparams и генерируется новый объект $safeuriaddon, свойством которого является название переменной в запросе, а значением – значение этой переменной. При этом значение фильтруется тем типом фильтра, который мы задали для соответствующей переменной. Далее этот объект сериализуется и передается для генерации md5 хэша.
Вы всегда должны помнить, что для правильного кэширования вы должны передавать в массив все переменные запроса, которые вы используете в вашем компоненте. При этом немаловажным является установка корректного типа фильтра для этих переменных.
Удачной разработки!