Универсальный метод для кэширования xml-данных в XSLT — различия между версиями

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

Статья доработана по рекомендациям от Евгений Иоффе