среда, 31 августа 2011 г.

Изменение содержимого файлов на сайте пакетами расширения

Продолжим тему ручного редактирования пакетов (модулей) расширения, начатую в прошлом сообщении. И так вы создали свой пакет расширения при помощи Package Creator'а.

И вам нужно добавить параметр в web.config сайта. Как это сделать при установке пакета?

Вы уже знаете, что установкой пакета в C1 занимаются "фрагментарные инсталляторы". Поэтому, все что нам нужно - это добавить запись о нужном инсталляторе в install.xml пакета и сконфигурировать инсталляцию с его помощью.

В С1 есть фрагментарный инсталлятор, который позволяет при установке пакета производить трансформацию указанного XML-файла с помощью XSL-файла, находящегося в пакете - FileXslTransformationPackageFragmentInstaller.

А так как web.config - это XML-файл, то так мы и сделаем:
  1. создадим  XSL-файл(ы) и добавим их в наш пакет
  2. добавим  в install.xml пакета запись о фрагментарный инсталляторе, указав какой XML-файл менять и с помощью какого XSL-файла.
Создание XSL-файлов

Если вы посмотрите внутренности некоторых пакетов C1, которые меняют файлы на сайте при установке, то обычно вы увидите папку Config, в которой присутствуют два файла Install.xsl и Uninstall.xsl. Будем придерживаться обычаев и добавим в пакет такую же папку, а в нее такие же файлы.

Второй файл необязателен и используется тем же фрагментарным инсталлятором при удалении пакета - с его помощью изменения откатываются. "Чистить за собой" - это хорошо, но не всегда можно. При тех же изменениях web.config, некоторые настройки могут использоваться другими пакетами, поэтому их откатывание - не всегда целесообразно.

В качестве содержимого XSL-файлов, я воспользуюсь примерами из оригинальной статьи на английском: Modifying Files.

При помощи файла Install.xsl, мы добавим такой параметр: <authentication mode="Forms"/> - в web.config сайта при условии, что такого  параметра там нет.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="configuration/system.web">
    <xsl:copy>
      <xsl:if test="count(authentication) = 0">
        <authentication mode="Forms" />
      </xsl:if>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

А при помощи Uninstall.xsl мы удалим этот параметр.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="configuration/system.web/authentication" />

</xsl:stylesheet>

Добавление записи об инсталляторе в install.xml

А теперь добавим в раздел  mi:PackageInstaller/mi:PackageFragmentInstallers запись об инсталляторе:

<mi:PackageInstaller xmlns:mi="http://www.composite.net/ns/management/packageinstaller/1.0">
<!-- остальной  XML -->
  <mi:PackageFragmentInstallers>
<!-- остальной XML -->
    <mi:Add installerType="Composite.Core.PackageSystem.PackageFragmentInstallers.FileXslTransformationPackageFragmentInstaller, Composite" uninstallerType="Composite.Core.PackageSystem.PackageFragmentInstallers.FileXslTransformationPackageFragmentUninstaller, Composite">

      <XslFiles>
        <XslFile pathXml="~\Web.config" installXsl="~\Config\Install.xsl" uninstallXsl="~\Config\Uninstall.xsl" />
      </XslFiles>

    </mi:Add>
  </mi:PackageFragmentInstallers>
</mi:PackageInstaller>

Вы видите, что указание о том, какой файл менять при установке и удалении пакета, дается в XML-элементе XslFile в атрибутах:
  • pathXml: относительный (к корню веб-сайта) путь к изменяемому XML-файлу 
  • installXsl:  относительный (к корню ZIP-архива) путь к XSL-файлу, который вносит изменения при установке пакета
  • uninstallXsl: относительный (к корню ZIP-архива) путь к XSL-файлу, который вносит изменения при установке пакета. Этот атрибут необязательный. Используйте если у вас есть соответствующий файл.
Вот и все. Теперь при установке пакета, в web.config будет добавлен нужный нам параметр, а при удалении - удален. 

Если вы хорошо знаете XSLT, то для вас не составит труда создать нужные XSL-файлы, которые будут не просто добавлять, но и изменять что-то в указанных XML-файлах.

Комментариев нет:

Отправить комментарий