Утилит для извлечения клиентских скриптов из файла кастомизации Microsoft Dynamics CRM существует несколько: одни являются надстройками над MS Word, другие - обычными Windows-приложениями.
На самом деле, задача эта не простая, а очень простая - файл кастомизации представляет собой XML-документ (схема и описание появились в SDK последних версий).
А где XML, там и XSLT : )
Извлекать скрипты будем динамически верстая HTML-таблицу с навигацией. И чтобы применить трансформацию к нашей кастомизации достаточно нескольких строк на javascript.
function LoadXml()
{
/* получаем путь к выбранному файлу кастомизации */
var customizationFile = document.getElementById("file");
/* в элемент DIV отобразим результат */
var result = document.getElementById("result");
/* загружаем таблицу стилей - наш XSL */
var xsl = new ActiveXObject("MSXML.DOMDocument");
xsl.load("ScriptXtractor.xsl");
/* загружаем XML с кастомизацией из выбранного файла */
var xmlCustomization = new ActiveXObject("MSXML.DOMDocument");
xmlCustomization.load(customizationFile.value);
/* тут-то и происходит трансформация */
var str = xmlCustomization.transformNode(xsl);
/* эскейпим символы для корректного отображения */
str = str.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
result.innerHTML = str;
}
Содержимое XSL-файла полностью не привожу, он есть в архиве и никакой сложности для понимания не представляет. Остановлюсь лишь на двух основных вещах: формировании выпадающего списка с перечнем сущностей и вёрсткой таблицы.
<!-- определяем выпадающий список -->
<select onchange="NavigateToTheEntity(this)">
<!-- перебираем в файле кастомизации все элементы сущностей CRM -->
<xsl:for-each select="ImportExportXml/Entities/Entity">
<!-- определяем сортировку по имени сущности -->
<xsl:sort select="Name" order="ascending"/>
<!-- определяем переменную для хранения ObjectTypeCode сущности для скрипта навигации -->
<xsl:variable name="otc" select="ObjectTypeCode"></xsl:variable>
<!-- создаём элемент списка с именем сущности -->
<option value="{$otc}" >
<xsl:value-of select="Name"/> (<xsl:value-of select="ObjectTypeCode"/>) <xsl:value-of select="LocalizedName"/>
</option>
</xsl:for-each>
</select>
Думаю, основная идея XSL-преобразования понятна. Далее проходим по каждой сущности и формируем таблицу со скриптами: сначала получаем скрипты формы (события OnLoad/OnSave), затем для каждого поля.
<!-- перебираем скрипты формы -->
<xsl:for-each select="FormXml/forms/entity/form/events/event">
<xsl:choose>
<!-- это скрипт приложения - доступный для редактирования пользователем -->
<xsl:when test="self::node()[@application = 'true']">
<tr class="appScript">
<td class="fieldNameCell">
<!-- имя события хранится в атрибуте name -->
<div class="eventLabel">Form event: <xsl:value-of select="@name"/></div>
</td>
<td class="scriptCell">
<!-- текст скрипта - в элементе script -->
<xsl:value-of select="script"/>
</td>
</tr>
</xsl:when>
<xsl:otherwise>
<!-- а это уже системные скрипты CRM (они не видны при настройке) -->
...
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
Cкрипты не извлекаются из файла в прямом смысле слова, просто исходную кастомизацию преобразуем (трансформируем) в таблицу.

Скачать утилиту со всеми приведёнными в статье кодами можно по ссылке снизу.
Добавить комментарий