вторник, 19 апреля 2011 г.

Вызов C1 функций в XSLT

Как вы уже знаете, в C1 широко используются функции. По происхождению - это могут быть XSLT, внешние и встроенные C#, SQL или визуальные функции. Но при их использовании - это уже не имеет значение, это просто C1 функции.

Так вот, эти функции можно вызывать из XSLT функций. В зависимости от ваших целей, вы можете вызывать эти функции до, во время или после того, как XSLT будет выполнен.

Рассмотрим каждый вариант.

До

Чтобы выполнить функцию и воспользоваться ее результатом до выполнения XSLT, нужно добавить ее в редакторе XSLT функции на вкладке “Вызов функций”.


Когда вы добавляете вызов такой функции, ее результат можно посмотреть в предварительном просмотре (вкладка “Просмотр”) в разделе “Ввод”.



XML, который там отображается можно использовать в вашем XSLT.


После

Функцию, можно добавить и непосредственно в ваш XSLT на вкладке “Шаблон” (Добавить | Код функции). В этом случае, вызванная C1 функция отработает после выполнения вашего XSLT.

Пример:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xsl f">
  <xsl:template match="/">
    <html>
      <head />
      <body>
        <xsl:variable name="daystoadd" select="1" />
        <function name="Composite.Utils.Date.AddDays" xmlns="http://www.composite.net/ns/function/1.0">
          <param name="DaysToAdd" value="{$daystoadd}" />
        </function>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

В данном примере добавлен вызов функции, которая покажет дату завтрашнего дня, используя динамическая составляющая - переменная $daystoadd.

Переключившись в предварительный просмотр (вкладка “Просмотр”) в разделе “Вывод” можно проверить, как именно будет включена добавленная С1 функция.

Пример:

<html xmlns="http://www.w3.org/1999/xhtml">
  <head />
  <body>
    <function name="Composite.Utils.Date.AddDays" xmlns="http://www.composite.net/ns/function/1.0">
      <param name="DaysToAdd" value="1" />
    </function>
  </body>
</html>

Благодаря обработке динамических составляющих, можно выстраивать целую иерархию вызовов C1 функций - используя вызов функции (дочерней) в качестве значения для параметра другой функции (родительской)

<f:function name="Shop.Presentation.ListMinimizer" xmlns:f="http://www.composite.net/ns/function/1.0">
  <f:param name="Style" value="Compact" />
  <f:param name="ItemRenderings">
    <for-each select="$shoppingbasket/Product" xmlns="http://www.w3.org/1999/XSL/Transform">
      <f:function name="Shop.Presentation.ProductListItem">
        <f:param name="ProductId" value="{@ProductId}" />
      </f:function>
    </for-each>
  </f:param>
</f:function>


Во время

Выполнение же C1 функции во время выполнения XSLT - то есть в на определенном шаге выполнения XSLT - требует дополнительных шагов.

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

Во-вторых, вам нужно саму функцию оформить как переменную, и вызывать эту функцию через эту переменную.

Итак:
  1. Добавьте такое пространство имен в ваш XSLT: xmlns:c1="http://c1.composite.net/StandardFunctions"
  2. Добавьте переменную для вызова вашей функции, напр.:

    <xsl:variable name="SendMailFunction">
    </xsl:variable>

  3. В качестве значения переменной (между тегами <xsl:variable></xsl:variable>) сделайте вызов функции через меню Добавить | Код функции, напр: функцию Composite.Mail.SendMail
  4. … и если нужно установите значения для ее параметров.
  5. Далее вызывайте функцию при помощи c1:CallFunction(), передавая в качестве параметра имя переменной для вызова функции.

CallFunction вернет значение такого же типа, как и сама функция. И вы можете использовать это значение далее в вашем XSLT. Наиболее употребительные типы -это XElement, XhtmlDocument, IEnumerable<XElement>, string, int и bool.

Пример:

<xsl:template match="User" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:variable name="SendMailFunction">
    <function name="Composite.Mail.SendMail" xmlns="http://www.composite.net/ns/function/1.0">
      <param name="From" value="us@bazinga.com" />
      <param name="To" value="{@EMail}" />
      <param name="Subject" value="Hello {@Name}" />
      <param name="IsHtml" value="false" />
      <param name="Body">Hello there...</param>
    </function>
  </xsl:variable>
  <xsl:variable name="emailSentSuccessfully" select="c1:CallFunction($SendMailFunction)" />
  <xsl:if test="$emailSentSuccessfully=false">   Error sending mail...  </xsl:if>
</xsl:template>

В данном примере, мы инициализируем некоторые параметры функции SendMail при помощи динамических значений. Так как функция возвращает значение логического типа, мы проверяем его и используем далее в коде.

(Написано по мотивам статьи на официальном сайте Composite C1: Calling C1 Functions. Примеры взяты из статьи.)

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

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