Думаю, что все вы знаете о том, что представление компонента может быть закэшировано. Но все ли понимают, зачем при этом использовать переменные запроса? Давайте разберемся.
Активировать кэширование представления в своем компоненте достаточно легко. Возьмем стандартный метод 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 хэша.
Вы всегда должны помнить, что для правильного кэширования вы должны передавать в массив все переменные запроса, которые вы используете в вашем компоненте. При этом немаловажным является установка корректного типа фильтра для этих переменных.
Удачной разработки!







