Переменные запроса и кэширование представления компонента

  • Понедельник, 20 июля 2015

Думаю, что все вы знаете о том, что представление компонента может быть закэшировано. Но все ли понимают, зачем при этом использовать переменные запроса? Давайте разберемся.

Активировать кэширование представления в своем компоненте достаточно легко. Возьмем стандартный метод 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 хэша.

Вы всегда должны помнить, что для правильного кэширования вы должны передавать в массив все переменные запроса, которые вы используете в вашем компоненте. При этом немаловажным является установка корректного типа фильтра для этих переменных.

Удачной разработки!

Дмитрий Рекун

Дмитрий Рекун

Пишу везде и понемногу ;)

Латвия, Рига. https://jpath.ru/

Статьи автора

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Логотип Joomla

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Свернуть

Коротко о главном в Joomla

Новости портала

Новое в блогах

Видео

Форум о Joomla