UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: muldy от 15 Июля 2013, 17:18:32

Название: Кэширование протокола usel?
Отправлено: muldy от 15 Июля 2013, 17:18:32
Здравствуйте!
Возможно ли закэшировать протокол usel?
Вот здесь есть инструкция как кэшировать xstl но как я понял работает только для протокола, udata: http://wiki.umisoft.ru/%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B4%D0%BB%D1%8F_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_html-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%B2_XSLT

Были ли примеры реализации подобного??
Название: Re:Кэширование протокола usel?
Отправлено: admin от 15 Июля 2013, 19:11:17
можно, только надо немного поправить (или написать еще один для usel),хотя если углубиться в тему можно и один общий для всех протоколов написать, но покажу путь с минимальным набором действий

вот код, жирным выделено то, что поправил я.

  public function xsltHtmlCache($expire = 3600, $module){
      $xslFilePath = getRequest('xsl');
        // $filePath - путь к xsl-шаблону трансформации.
      $filePath = CURRENT_WORKING_DIR . '/xsltTpls/' . $xslFilePath;
      if(!is_file($filePath)) return;
 
      $args = func_get_args();
      $params = array_slice($args, 2);
      $params_str = implode('/', $params);
      $url = "usel://" . $module . '/'. $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)) {   
   $data = file_get_contents($url);
        file_put_contents($path, $data);
 
        $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>";
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS
        return array('plain:result' => $result);
 
      }else{
        $result = file_get_contents($path);
        return array('plain:result' => $result);
      }   
  }


P.S. в итоге вы вызываете свой usel метод примерно так
<xsl:value-of select="document('udata://custom/xsltHtmlCache/3600/usel_xml_file_name/param1/param1/?xsl=modules/catalog/category-cache.xsl')/udata"
disable-output-escaping="yes" />
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 16 Июля 2013, 12:42:15
Спасибо за кастом, но почему то не выводится?

Отсюда есть пара вопросов: Обязательно ли включить кэширование в настройках сайта?

И второй по шаблонам:

Вызов делаю таким:

<xsl:value-of select="document('udata://custom/xsltHtmlCache/36000/spec_main/1/10/?xsl=modules/catalog/specCache.xsl')/udata"
disable-output-escaping="yes" />

А сам шаблон обработки начинатся так:

    <xsl:template match="/" >
            <xsl:apply-templates select="udata" mode="spec_main"/>
   </xsl:template>

А дальше идет стандартная обработка шаблона xslt!

А и забыл уточнить я хочу закэшировать топ товаров, который выбирается uselom!
Название: Re:Кэширование протокола usel?
Отправлено: admin от 16 Июля 2013, 13:14:55
надо разбить всю логику на части и проверить.

1. проверить что тебе пришло в кастом и что оказалось в переменной $url (выведи её и попробуй ручками вставить в адресную строчку, тот ли xml получиться)
2. проверить что твой шаблон modules/catalog/specCache.xsl вообще отрабатывается, убрать все лишнее, оставив только головной шаблон и вписав него что-нибудь, посмотрим выведется или нет
3. проверить что файл с кешем (/sys-temp/udatacache/что_то_там_через_md5.xml) создается в том месте где у тебя указанно (может прав на папку не хватает) и что он содержит то что тебе надо.

P.S. и не забывай что если файл существует и время кеширования не вышло система вернет тебе содержимое файла, который мог уже быть сформирован не верно, так что для чистоты эксперимента удаляй его или поменяй немного скрипт, чтобы он всегда перезаписывал файл
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 16 Июля 2013, 13:23:30
В общем разобрался была проблема в том что у umi сменились места хранения шаблонов в версии 2.8.5!
Но одна проблема осталась, если я в файле usel уже указал параметры и и мне не надо передовать их в кэш, вот так: udata://custom/xsltHtmlCache/36000/1/5/spec_main/?xsl=modules/specCache.xsl

То на выходе получаю голый xml, а не html!
Название: Re:Кэширование протокола usel?
Отправлено: admin от 16 Июля 2013, 13:32:21
по идее, в макросе есть строчки специально для этого

 $result = "<udata mode=\"cache\"><![CDATA[" . $result . "]]></udata>";
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 16 Июля 2013, 13:41:18
C этим то понятно, но я открыл закэшированный xml и там обычный вид данных umi , те в xml виде а не html!
Название: Re:Кэширование протокола usel?
Отправлено: admin от 16 Июля 2013, 13:43:26
значит, не подхватился ваш xsl шаблон
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 16 Июля 2013, 13:55:23
Ну если я меняю имя шаблона, так он вообще не генерирует!)
А возможно ли что вот этот блок надо дописывать, может ли это повлиять??

        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне
        $xslt->setParameter("", 'parent-id', $parent_id);
        $xslt->setParameter("", 'document-page-id', $page_id);
        $xslt->setParameter("", 'active', $active);
Название: Re:Кэширование протокола usel?
Отправлено: admin от 16 Июля 2013, 14:04:51
поймите что ваш шаблон xsl это отдельный набор шаблонов, поэтому если вы в нем используете какие-то variable или param, которые не были объявлены ранее (или в макросе на примере глобальных переменных как в вашем примере) или если у вас встречаются xsl:call-template какого-то шаблона, который так же не присутствует в данном xsl или в xsl, который подключается в данном xsl, или у вас есть языковые сущности (конструкции типа &empty;) и они не объявлены в данном xsl..... то будет критическая ошибка)

так что протестите свой xsl, хотя бы уберите из него все кроме одного шаблона
<xsl:template match="/" >
           я работаю)
</xsl:template>
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 16 Июля 2013, 14:23:49
Протестировал, получается дело в следующем, при первом обновлении страницы шаблон срабатывает, а после того как я еще раз обновляю, выдается опять все тот же xml!
Название: Re:Кэширование протокола usel?
Отправлено: admin от 16 Июля 2013, 14:32:37
да и именно на это я обращаю ваше внимание в сообщении http://umihelp.ru/forum/index.php/topic,1563.msg6372.html#msg6372 в части p.s.  ;)
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 16 Июля 2013, 15:37:52
В общем все возможные варианты перепробывал, в переменную $url сделал так
$url = "usel://spec_main";
Все равно не работает, шаблон уточнил тоже его сделал все ок!
На папку стоят права 777 и она доступна для записи, в итоге все работает, но почему выдается только при первой загрузке страницы понять не могу!)
Название: Re:Кэширование протокола usel?
Отправлено: admin от 16 Июля 2013, 16:40:59
если уже начали лазить в макрос ставьте последовательно exit() в разные места проверяя что , что все задуманное выполняется именно так как задумано.
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 24 Июля 2013, 13:14:27
Обратился в тех поддержку umi, ответили что статья не актуальна для версии 2.9!
Название: Re:Кэширование протокола usel?
Отправлено: admin от 24 Июля 2013, 13:25:00
сегодня поищу, так как у меня на 2.9 было похожее решение, найду, отпишу.
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 26 Июля 2013, 18:11:53
Спасибо, буду очень признателен!
Название: Re:Кэширование протокола usel?
Отправлено: muldy от 13 Августа 2013, 19:08:00
сегодня поищу, так как у меня на 2.9 было похожее решение, найду, отпишу.
Подскажите нашли ли вы решение свое???