MS CRM ScriptXtractor

Утилит для извлечения клиентских скриптов из файла кастомизации 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крипты не извлекаются из файла в прямом смысле слова, просто исходную кастомизацию преобразуем (трансформируем) в таблицу.

Microsoft Dynamics CRM ScriptXtractor

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

Прикрепленный файлРазмер
Package icon MSCRMScriptXtractor.zip3.01 KB
Русский
field_vote: 
2.925925
Average: 2.9 (27 votes)

Добавить комментарий