Универсальный метод для кэширования xml-данных в XSLT — различия между версиями
Материал из Umicms
Kalexey (обсуждение | вклад) |
Velross (обсуждение | вклад) |
||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 4: | Строка 4: | ||
Универсальный метод, который необходимо добавить в файл '''classes/modules/cutom.php''', может быть представлен в следующем виде: | Универсальный метод, который необходимо добавить в файл '''classes/modules/cutom.php''', может быть представлен в следующем виде: | ||
<source lang="php"> | <source lang="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); | ||
+ | } | ||
+ | |||
+ | } | ||
</source> | </source> | ||
Строка 40: | Строка 56: | ||
20 - один из параметров, их может быть больше одного | 20 - один из параметров, их может быть больше одного | ||
</pre> | </pre> | ||
− | [[Категория:Верстка в XSLT]] | + | |
+ | Статья доработана по рекомендациям от Евгений Иоффе | ||
+ | [[Категория:Верстка в XSLT]][[Категория:Кеширование]] |
Текущая версия на 06:51, 8 июля 2014
Некоторая информация по кэшированию 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 - один из параметров, их может быть больше одного
Статья доработана по рекомендациям от Евгений Иоффе