Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”
отображение запроса USEL в виде запроса SQL

Автор BaceHРаздел Custom макросы

Ответов: 5
Просмотров: 2618
Последний ответ 11 Январь 2013, 19:48:58
от admin
Прошу помощи с usel - необходимо отфильтровать новости по кастомному полю

Автор AksukРаздел Шаблоны XSLT

Ответов: 11
Просмотров: 4225
Последний ответ 05 Март 2012, 23:01:29
от Aksuk
Вывод объектов каталога через USEL по элементу в справочнике

Автор AxiomateriaРаздел Шаблоны XSLT

Ответов: 6
Просмотров: 2426
Последний ответ 20 Июль 2013, 20:31:56
от NOIRMAN
Выборка USEL с несколькими параметрами для одного поля

Автор sempl84Раздел Шаблоны XSLT

Ответов: 3
Просмотров: 1649
Последний ответ 29 Ноябрь 2012, 11:05:03
от niakriss
Вывод порядковый номер (нумерация) при usel выдачи

Автор atachРаздел Custom макросы

Ответов: 5
Просмотров: 1933
Последний ответ 25 Сентябрь 2013, 13:37:27
от admin

0 Пользователей и 1 Гость просматривают эту тему.

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Кэширование протокола usel?
« : 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

Были ли примеры реализации подобного??

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #1 : 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" />

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #2 : 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!

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #3 : 16 Июль 2013, 13:14:55 »
надо разбить всю логику на части и проверить.

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

P.S. и не забывай что если файл существует и время кеширования не вышло система вернет тебе содержимое файла, который мог уже быть сформирован не верно, так что для чистоты эксперимента удаляй его или поменяй немного скрипт, чтобы он всегда перезаписывал файл

*

muldy

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

То на выходе получаю голый xml, а не html!

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #5 : 16 Июль 2013, 13:32:21 »
по идее, в макросе есть строчки специально для этого

 $result = "<udata mode=\"cache\"><![CDATA[" . $result . "]]></udata>";
        // данный принцип возвращения данных отключает xslt-трансформацию системой UMI.CMS

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #6 : 16 Июль 2013, 13:41:18 »
C этим то понятно, но я открыл закэшированный xml и там обычный вид данных umi , те в xml виде а не html!

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #7 : 16 Июль 2013, 13:43:26 »
значит, не подхватился ваш xsl шаблон

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #8 : 16 Июль 2013, 13:55:23 »
Ну если я меняю имя шаблона, так он вообще не генерирует!)
А возможно ли что вот этот блок надо дописывать, может ли это повлиять??

        // Добавляем необходимые глобальные переменные, которые можно будет использовать в xsl-шаблоне
        $xslt->setParameter("", 'parent-id', $parent_id);
        $xslt->setParameter("", 'document-page-id', $page_id);
        $xslt->setParameter("", 'active', $active);

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #9 : 16 Июль 2013, 14:04:51 »
поймите что ваш шаблон xsl это отдельный набор шаблонов, поэтому если вы в нем используете какие-то variable или param, которые не были объявлены ранее (или в макросе на примере глобальных переменных как в вашем примере) или если у вас встречаются xsl:call-template какого-то шаблона, который так же не присутствует в данном xsl или в xsl, который подключается в данном xsl, или у вас есть языковые сущности (конструкции типа &empty;) и они не объявлены в данном xsl..... то будет критическая ошибка)

так что протестите свой xsl, хотя бы уберите из него все кроме одного шаблона
<xsl:template match="/" >
           я работаю)
</xsl:template>

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #10 : 16 Июль 2013, 14:23:49 »
Протестировал, получается дело в следующем, при первом обновлении страницы шаблон срабатывает, а после того как я еще раз обновляю, выдается опять все тот же xml!

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #11 : 16 Июль 2013, 14:32:37 »
да и именно на это я обращаю ваше внимание в сообщении http://umihelp.ru/forum/index.php/topic,1563.msg6372.html#msg6372 в части p.s.  ;)

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #12 : 16 Июль 2013, 15:37:52 »
В общем все возможные варианты перепробывал, в переменную $url сделал так
$url = "usel://spec_main";
Все равно не работает, шаблон уточнил тоже его сделал все ок!
На папку стоят права 777 и она доступна для записи, в итоге все работает, но почему выдается только при первой загрузке страницы понять не могу!)

*

admin

  • *****
  • 2421
  • +172/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #13 : 16 Июль 2013, 16:40:59 »
если уже начали лазить в макрос ставьте последовательно exit() в разные места проверяя что , что все задуманное выполняется именно так как задумано.

*

muldy

  • ***
  • 222
  • +9/-1
    • Просмотр профиля
Re:Кэширование протокола usel?
« Ответ #14 : 24 Июль 2013, 13:14:27 »
Обратился в тех поддержку umi, ответили что статья не актуальна для версии 2.9!