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

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

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

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

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

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

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

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

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

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

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

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

*

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

  • *****
  • 2444
  • +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

  • *****
  • 2444
  • +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

  • *****
  • 2444
  • +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

  • *****
  • 2444
  • +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

  • *****
  • 2444
  • +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

  • *****
  • 2444
  • +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

  • *****
  • 2444
  • +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!