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








