Логотип

Документация по макросам и шаблонам UMI.CMS

Отладка и тестирование XSLT-шаблонов

Иногда в результате верстки XSLT-шаблонов могут возникать различного рода ошибки или опечатки. При запросе страниц, обрабатываемых по таким шаблонам, можно видеть в браузере либо пустую страницу (в частности так будут выглядеть все ошибки валидации), либо частичный вывод итогового HTML-кода.

Включение режима отладки

В подобных случаях очень полезным может оказаться включение "режима отладки". Для этого необходимо установить параметр enabled="1" (Секция [debug]) в файле config.ini (для версий до 2.8 создайте файл с названием debug в корне вашего сайта). Также полезной может быть установка параметра show-backtrace="1". Теперь можно обновить страницу и посмотреть, что именно препятствует корректной обработке результатов запроса по интересующему XSLT-шаблону.

Например, в случае забытого закрывающего тега, вы увидите строки на подобие этой:

Warning: DOMDocument::load() [function.DOMDocument-load]: Opening and ending tag mismatch: div line 26 and body in file:///.../xsltTpls/default.xsl, line: 65

Если режим отладки выключен, вместо этого сообщения вы увидите страницу без какого-либо HTML-кода.

Просмотр всех вызовов с текущей страницы

Кроме того, во многих шаблонах может происходить вызов дополнительных данных по внутренним протоколам UMI.CMS («Макросы: протокол UData», «Объекты: протокол UObject», «Страницы: протокол UPage», «Файловая система: протокол UFS» и «Выборки из БД: протокол USel»).

В этих случаях, ситуация, когда итоговый HTML-код страницы отображается частично, скорее всего означает, что имеют место ошибки в одном или в нескольких подобных вызовов из этого шаблона (см. «Общие сведения»), либо при обработке результатов этих вызовов.

Для того, чтобы посмотреть, что именно запрашивается на конкретной странице и по каким протоколам, нужно добавить к адресу страницы ?showStreamsCalls. Этот способ работает для любой страницы, отображаемой по xslt-шаблону.

Например, если добавить ?showStreamsCalls к странице отображения анонсов нескольких новостей можно увидеть следующее:

<streams-call>
   <call generation-time="0.010039">udata://content/menu/</call>
   <call generation-time="0.207189">udata://news/lastlist/(3)(4)/notemplate/3</call>
   <call generation-time="0.001159">udata://system/convertDate/1254225989/(d.m.Y)/</call>
   <call generation-time="0.027854">udata://comments/countComments/9</call>
   <call generation-time="0.001385">udata://system/convertDate/1254225671/(d.m.Y)/</call>
   <call generation-time="0.013974">udata://comments/countComments/8</call>
   <call generation-time="0.001651">udata://system/convertDate/1254225480/(d.m.Y)/</call>
   <call generation-time="0.010212">udata://comments/countComments/7</call>
</streams-call>

В полученном ответе мы видим какие именно макросы вызываются с этой страницы, с какими параметрами, а также время выполнения каждого из них.

Замечание

Если включено кэширование, то вызовы по протоколам с параметром ?expire не будут показаны в этом списке. Рекомендуется в процессе разработки сайта отключать кэширование.

Просмотр результатов работы макроса в контексте определенной страницы

Макросы UMI.CMS при запуске их непосредственно из адресной строки при помощи вызова http://ваш_сайт/udata/имя_модуль/имя_макроса, возвращают XML вне контекста какой либо страницы. Однако иногда возникает необходимость посмотреть ответ макроса в том виде, в каком он будет возвращаться именно с этой страницы.

В таком случае можно воспользоваться вспомогательным шаблоном. Создайте в папке ~/xsltTpls/ файл под названием debug.xsl и скопируйте в него этот код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="UTF-8" indent="yes"/>

 <xsl:param name="macro"/>

 <xsl:template match="/">

   <form method="post">
     <span style="font-weight:bold; margin-right:10px">udata://</span>
     <input type="text" name="macro" value="{$macro}" style="width:400px; margin-right:10px"/>
     <input value="Показать" class="submit" type="submit"/>
   </form>

   <textarea style="height:500px; width:900px;">
     <xsl:copy-of select="document(concat('udata://', $macro))"/>
   </textarea> 

 </xsl:template>

</xsl:stylesheet>

Далее подключите этот шаблон к системе в настройках модуля "Структура" (см. «Создание и подключение XSLT-шаблона»). Теперь следует для интересующей нас страницы выбрать этот шаблон и открыть страницу на просмотр.

Вместо содержимого страницы вы увидите поле ввода, где можно ввести макрос с параметрами в виде имя_модуля/имя_макроса/параметр1/параметр2 и нажать "Показать". В области ниже будет показан результат работы этого макроса, запущенного именно с этой страницы.

WIKI: база знаний и готовые решения

Рекомендуем к прочтению: Использование кастомных макросов в XSLT