Универсальный метод для кэширования xml-данных в XSLT
Материал из Umicms
(перенаправлено с «Универсальный метод для кеширования xml-данных в XSLT»)
Некоторая информация по кэшированию xml-данных была представлена в данной статье: Кэширование результата работы метода getCreateForm в XSL-шаблоне
Универсальный метод, который необходимо добавить в файл classes/modules/cutom.php, может быть представлен в следующем виде:
public function xsltCache($expire = 3600, $stream){
$params_temp = array_slice(func_get_args(), 2);
$params = array();
foreach($params_temp as $param){
$params[] = (strpos($param, '/') !== FALSE) ? "(" . $param . ")" : $param;
}
$domain = cmsController::getInstance()->getCurrentDomain()->getId();
$params_str = implode('/', $params);
$url = $stream . "://" . $params_str;
$requestParams = array();
$allowedParams = array('extProps', 'extGroups');
foreach($_REQUEST as $param => $value) {
if(!in_array($param, $allowedParams))
continue;
$requestParams[$param] = $value;
}
if(count($requestParams)) {
$url .= '/?'. http_build_query($requestParams);
}
$folder = CURRENT_WORKING_DIR . '/sys-temp/udatacache/';
$path = $folder . md5($domain. '_'. $url) . '.xml';
if(!is_dir($folder)) mkdir($folder, 0777, true);
if(is_file($path)) $mtime = filemtime($path);
if(!is_file($path) || time() > ($mtime + $expire)) {
$data = file_get_contents($url);
file_put_contents($path, $data);
return array('plain:result' => $data);
}else{
$result = file_get_contents($path);
return array('plain:result' => $result);
}
}
а сам вызов в XSL-шаблоне будет следующим:
udata://custom/xsltCache/3600/custom/lidersCustom/20
где 3600 - время кэширования xml-данных в секундах, custom - модуль lidersCustom - метод 20 - один из параметров, их может быть больше одного
Статья доработана по рекомендациям от Евгений Иоффе