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

Материал из Umicms
Перейти к:навигация, поиск
 
(не показаны 4 промежуточные версии 4 участников)
Строка 1: Строка 1:
В одной из статей уже был рассмотрен способ кеширования html-кода в XSLT,
+
'''Не актуально для версии 2.9'''<br/>
это была статья [[Блочное кеширование html-кода в XSLT]]
+
В одной из статей уже был рассмотрен способ кэширования html-кода в XSLT,
 +
это была статья [[Блочное кэширование html-кода в XSLT]]
  
 
В данной статьей будет  показан пример универсального кастомного метода,  
 
В данной статьей будет  показан пример универсального кастомного метода,  
Строка 10: Строка 11:
 
       $xslFilePath = getRequest('xsl');
 
       $xslFilePath = getRequest('xsl');
 
         // $filePath - путь к xsl-шаблону трансформации.
 
         // $filePath - путь к xsl-шаблону трансформации.
       $filePath = CURRENT_WORKING_DIR . '/xsltTpls/' . $xslFilePath;
+
       $filePath = CURRENT_WORKING_DIR . '/templates/demodizzy/xslt/' . $xslFilePath;
 
       if(!is_file($filePath)) return;
 
       if(!is_file($filePath)) return;
 
        
 
        
Строка 17: Строка 18:
 
       $params_str = implode('/', $params);
 
       $params_str = implode('/', $params);
 
       $url = "udata://" . $module . '/' . $method . '/' . $params_str;
 
       $url = "udata://" . $module . '/' . $method . '/' . $params_str;
 +
      if($module=='usel') {
 +
      $url = $module. "://" . $method . '/' . $params_str;
 +
      }
  
 
       $folder = CURRENT_WORKING_DIR . '/sys-temp/udatacache/';   
 
       $folder = CURRENT_WORKING_DIR . '/sys-temp/udatacache/';   
Строка 24: Строка 28:
 
    
 
    
 
       if(!is_file($path) || time() > ($mtime + $expire)) {     
 
       if(!is_file($path) || time() > ($mtime + $expire)) {     
     
+
   
 
         $xsltDom = new DomDocument;
 
         $xsltDom = new DomDocument;
 
         $xsltDom->resolveExternals = true;
 
         $xsltDom->resolveExternals = true;
Строка 58: Строка 62:
 
         //html-данные необходимо включить в CDATA и в какой либо корневой узел.
 
         //html-данные необходимо включить в CDATA и в какой либо корневой узел.
 
         $result = "<udata mode=\"cache\"><![CDATA[" . $result . "]]></udata>";
 
         $result = "<udata mode=\"cache\"><![CDATA[" . $result . "]]></udata>";
 +
        file_put_contents($path, $result);
 
         // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS
 
         // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS
 
         return array('plain:result' => $result);
 
         return array('plain:result' => $result);
Строка 94: Строка 99:
  
 
</source>
 
</source>
[[Категория: Верстка в XSLT]]
+
[[Категория: Верстка в XSLT]][[Категория:Кеширование]]

Текущая версия на 09:27, 1 декабря 2013

Не актуально для версии 2.9
В одной из статей уже был рассмотрен способ кэширования html-кода в XSLT, это была статья Блочное кэширование html-кода в XSLT

В данной статьей будет показан пример универсального кастомного метода, в который можно передавать основной вызов: модуль, метод, параметры и также путь к шаблону для трансформации xml данных. Кастомный метод необходимо добавить в файл classes/modules/custom.php:

  public function xsltHtmlCache($expire = 3600, $module, $method){
      $xslFilePath = getRequest('xsl');
        // $filePath - путь к xsl-шаблону трансформации.
      $filePath = CURRENT_WORKING_DIR . '/templates/demodizzy/xslt/' . $xslFilePath;
      if(!is_file($filePath)) return;
      
      $args = func_get_args();
      $params = array_slice($args, 3);
      $params_str = implode('/', $params);
      $url = "udata://" . $module . '/' . $method . '/' . $params_str;
      if($module=='usel') {
      $url = $module. "://" . $method . '/' . $params_str;
      }

      $folder = CURRENT_WORKING_DIR . '/sys-temp/udatacache/';  
      $path = $folder . md5($url . $filePath) . '.xml';
      if(!is_dir($folder)) mkdir($folder, 0777, true);
      if(is_file($path)) $mtime = filemtime($path);
   
      if(!is_file($path) || time() > ($mtime + $expire)) {    
     	
        $xsltDom = new DomDocument;
        $xsltDom->resolveExternals = true;
        $xsltDom->substituteEntities = true;
      
        $xsltDom->load($filePath, DOM_LOAD_OPTIONS);
 
        $xslt = new xsltProcessor;
        $xslt->registerPHPFunctions();
        $xslt->importStyleSheet($xsltDom);
        $page_id = cmsController::getInstance()->getCurrentElementId();
        $parent_id = "";
        $active    = "";
        
        if($page_id){
           $page = umiHierarchy::getInstance()->getElement($page_id);
           $parent_id = $page->getParentId();
           $active    = (int) $page->getIsDefault();
        }
        
        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне 
        $xslt->setParameter("", 'parent-id', $parent_id);
        $xslt->setParameter("", 'document-page-id', $page_id);
        $xslt->setParameter("", 'active', $active);
        
        $dom_new = new DOMDocument("1.0", "utf-8");
        // $xml - xml-данные для трансформации.
        $xml = file_get_contents($url);
        $dom_new->loadXML($xml);
 
        //производим трансформацию
        $result = $xslt->transformToXML($dom_new);
        //html-данные необходимо включить в CDATA и в какой либо корневой узел.
        $result = "<udata mode=\"cache\"><![CDATA[" . $result . "]]></udata>";
        file_put_contents($path, $result);
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS
        return array('plain:result' => $result);
         
      }else{
        $result = file_get_contents($path);
        return array('plain:result' => $result);
      }	
  }


Вызов может быть следующим:

<xsl:value-of select="document('udata://custom/xsltHtmlCache/3600/catalog/getCategoryList//8//1?xsl=modules/catalog/category-cache.xsl')/udata" 
disable-output-escaping="yes" />

Обратите внимание в кастомном методе на блок:

        // page_id текущей страницы сайта
        $page_id = cmsController::getInstance()->getCurrentElementId();
        $parent_id = "";
        $active    = "";
        
        if($page_id){
           $page = umiHierarchy::getInstance()->getElement($page_id);
           $parent_id = $page->getParentId();
           $active    = (int) $page->getIsDefault();
        }
        
        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне 
        $xslt->setParameter("", 'parent-id', $parent_id);
        $xslt->setParameter("", 'document-page-id', $page_id);
        $xslt->setParameter("", 'active', $active);