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

  • 20.07.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 хэша.

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

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

Добавить комментарий

Обновить
Защитный код

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

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

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

Скачать Joomla! 3.6.0 Документация Joomla! CMS Свернуть

Расширения Joomla

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

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

Видео