вторник, 25 января 2011 г.

Создание и использование папок данных (2)

Итак, в предыдущем сообщении мы создали папку данных SeeAlsoLinks для хранения ссылок на страницы сайта, связанные с текущей страницей тематически, добавили эту папку к нужным страницам и добавили во все эти папки данные.

А теперь, давайте создадим XSLT функцию, при помощи которой мы будем показывать эти ссылки.

  1. В разделе Functions, выбираем узел XSLT Functions и нажимаем Add XSLT Function.
  2. В мастере заполняем поля:
    • Name: DisplaySeeAlso
    • Namespace: Demo
    • Output type: XHTML
  3. Сохраняем функцию (Save)
Воспользуемся функцией получения данных (Get<тип>Xml), которая автоматически создается системой для каждого типа. В нашем случае, это будет функция Demo.SeeAlsoLinksXml.GetSeeAlsoLinksXml. Именно ее мы вызовем в нашей функции Demo.DisplaySeeAlso.
  1. В редакторе функции, на вкладке Function calls добавим вызов функции Demo.SeeAlsoLinksXml.GetSeeAlsoLinksXml.
  2. В добавленной функции выберем параметр Selected fields (таким образом инициализируем этот обязательный параметр).
Теперь перейдем на вкладку Preview, и увидим, что для каждого элемента SeeAlsoLinks выбраны поля Id и Page, значениями которых являются идентификаторы: элемента данных и страницы соответственно. Нам не хватает значений поля AltText из типа и названия страницы (page title).

Уберем ненужные и добавим нужные поля.
  1. На вкладке Function Calls выберем параметр Selected fields в вызванной функции.
  2. Для значения параметра (Parameter value), нажмем Edit Selections.
  3. В появившемся окне, переместим влево (уберем) поля Id и Page.
  4. Переместим вправо (добавим) поля Page.Title, Page.Id и AltText.
  5. Нажмем ОК в окне и сохраним нашу функцию (Save).
  6. Посмотрим, что получилось, на вкладке Preview | Input.
<SeeAlsoLinks AltText="How to create a page" Page.Id="6f11338c-3f6a-4b2a-953d-f25ec8571dc3" Page.Title="Create a Page" xmlns="" />

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

Для этого мы добавим фильтр по текущей странице для элементов данных.
  1. На вкладке Function Calls выберем параметр Filter в вызванной функции.
  2. Для значения параметра, нажмем Function... и выберем функцию Demo.SeeAlsoLinks.ActivePageReferenceFilter.
  3. Не будем менять значение по умолчанию для ее параметра Page Scope: Current page (текущая страница). Именно оно нам и нужно.
  4. Сохраняем функцию (Save).
Теперь, чтобы в Preview появились элементы из папки для конкретной страницы, нужно явно указать, какую именно страницу сайта считать текущей. Выбрать текущую страницу для Preview нужно так. (Это не влияет на функцию, это всего лишь отладочная информация).
  1. На вкладке Settings редактора функции в группе Debug, нажимаем в поле Page.
  2. Выбираем ту страницу, к которой мы добавили папку данных с элементами данных.
  3. Смотрим Preview.
Теперь будут показаны только элементы в папке, относящейся к этой странице (в режиме отладки).

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

На вкладке Template между тегами <body></body> добавляем:


<p><strong>See also</strong></p>
<p>
  <xsl:for-each select="/in:inputs/in:result[@name='GetSeeAlsoLinksXml']/SeeAlsoLinks">
    <a href="~/Renderers/Page.aspx?pageId={@Page.Id}">
      <xsl:choose>
        <xsl:when test="@AltText=''">
          <xsl:value-of select="@Page.Title" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@AltText" />
        </xsl:otherwise>
      </xsl:choose>
    </a><br />
  </xsl:for-each>
</p>

Поясню немного код выше:
  • При помощи элемента <xsl:for-each> мы проходим каждый элемент из папки данных.
  • При помощи элементов <xsl:choose>, <xsl:when>, <xsl:otherwise> мы выбираем источник названия ссылки. Если поле AltText не пустое, тогда мы используем его значение, иначе - значение Page.Title.
  • В C1 полноценный веб-адрес страницы генерируется системой на основе идентификатора страницы. Это удобно, так как, напр., перемещая страницу на сайте, нам не нужно будет менять код. Ее правильный адрес мы получим благодаря обработчику страниц. Для этого нужно в ссылке указать путь к обработчику страниц /Renderers/Page.aspx и передать в параметре pageId - идентификатор страницы (у нас это значение поля Page.Id).
  • Тильда ("~") заменяется системой на имя сервера, например www.contoso.com
  • Если вы посмотрите на ссылку в браузере, то она будет корректно сгенерирована: что-то вроде http://www.contoso.com/Manual/CreatePage.aspx
Добавим функцию на страницу как обычно:
  1. В разделе Content выбираем страницу с папкой данных SeeAlsoLinks.
  2. Вставляем на страницу функцию Demo.DisplaySeeAlso в визуальном редакторе (Insert | Function) или в редакторе кода вставляем такой код:

    <f:function name="Demo.DisplaySeeAlso" xmlns:f="http://www.composite.net/ns/function/1.0" />

  3. Сохраняем страницу и смотрим в браузере, что получилось.
В одном из следующих сообщений, я собираюсь рассказать об использовании метатипов.


Сообщения по теме:

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

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