Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

Alternative caching Joomla module

Ну, может быть, не совсем "alternative"; кэш, положим, все тот же самый, мы только попробуем абстрагироваться от параметров Global Configuration.

Alternative caching Joomla module

И сразу вопрос - зачем? На joomla.org находим крайне простой способ подключения общих параметров кэширования в ваш модуль (редактируем XML file):

 

<fieldset name="advanced">
<field
name="cache"
type="list"
default="1"
label="COM_MODULES_FIELD_CACHING_LABEL"
description="COM_MODULES_FIELD_CACHING_DESC">
<option
value="1">JGLOBAL_USE_GLOBAL</option>
<option
value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
</field>
</fieldset>

 

И сразу ответ - на тот случай, если общие параметры кэширования необходимо изменить для одного из ваших модулей. По умолчанию, при включенном в Global Configuration кэше, его lifetime равен 15 минутам; и это, вероятно, разумная золотая середина. Что, если тот или иной модуль потребует значительно большего, нежели система в целом, времени жизни кэша? Это может потребоваться, например, если удаленный API способен длительное время не отдавать корректный XML с данными, и хотелось бы заменить сообщение о недоступности сервиса хотя бы устаревшими сведениями. Одним словом, потренируемся для начала на jExchange rates CBR, модуле Joomla 3 , способным визуализировать колебания курсов валют по отношению к рублю посредством диаграмм из галереи Google Charts.

 

 

Варианты кода скрипта можно увидеть на форуме, вот с этим и поработаем. И начнем с класса ArrayObject, который позволит обратиться к объектам, как к массивам (запихнем в ArrayObject два запроса к API Центробанка):

 

$urls = new ArrayObject(
array(
'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$curDate2.'&date_req2='.$curDate.'&VAL_NM_RQ=R01235'
,'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$curDate2.'&date_req2='.$curDate.'&VAL_NM_RQ=R01239'
)
,ArrayObject::ARRAY_AS_PROPS
);
$cacheKey = (string)$urls->serialize();

 

Оговорюсь: данный метод совсем не является в данном случае безальтернативным; аналогичного результата мы с вами могли бы добиться, работая с обычным массивом и используя implode вместо serialize, что-то вроде:

 

$cacheKey = implode($urls);

 

Ок; что же до собственно процесса кэширования, он будет проходить у нас с вами следующим образом - обращаемся к описанным в документации Joomla! CMS 3.6 API\JCacheController методам: 

 

// Caching
$cache = JFactory::getCache('mod_jexchange_rates_cbr', ''); // Any unique name
$cache->setCaching(true); // Force cache enable. If caching is disabled though, that would be why your data isn’t actually writing to cache. If you need it to persist regardless of global cache setting.
$cache->setLifeTime(60); //Minutes
$cacheKey = (string)$urls->serialize();
if (!($data = $cache->get($cacheKey, ''))){
var_dump('DEBUG: Cache empty. Obtain data from service');
foreach ($urls as $i => $url){
$data[$i] = file_get_contents($url);
}
$cache->store($data, $cacheKey);
}
else{
var_dump('DEBUG: Cache present');
}
// \Caching

 

Т.е., что касается elseif: возвращаем данные из кэша, присваиваем полученное значение $data, которую далее и используем (cache present); в противном же случае выражение ложно, следуют цикл и обращение к удаленному API. Постараюсь включить описанную схему кэширования в одну из следующих ревизий модуля, а пока что можно просто заменить содержимое mod_jexchange_rates_cbr.php кодом, полностью приведенным на форуме.

 

Минутка рекламы. Заказать интернет -магазин, корпоративный сайт, сайт-визитку на движках Joomla, Prestashop, OpenCart, WordPress или Drupal - добро пожаловать. Только для вас, сегодня... и ежедневно!

Оставить комментарий

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