А теперь, давайте создадим XSLT функцию, при помощи которой мы будем показывать эти ссылки.
- В разделе Functions, выбираем узел XSLT Functions и нажимаем Add XSLT Function.
- В мастере заполняем поля:
- Name: DisplaySeeAlso
- Namespace: Demo
- Output type: XHTML
- Сохраняем функцию (Save)
- В редакторе функции, на вкладке Function calls добавим вызов функции Demo.SeeAlsoLinksXml.GetSeeAlsoLinksXml.
- В добавленной функции выберем параметр Selected fields (таким образом инициализируем этот обязательный параметр).
Уберем ненужные и добавим нужные поля.
- На вкладке Function Calls выберем параметр Selected fields в вызванной функции.
- Для значения параметра (Parameter value), нажмем Edit Selections.
- В появившемся окне, переместим влево (уберем) поля Id и Page.
- Переместим вправо (добавим) поля Page.Title, Page.Id и AltText.
- Нажмем ОК в окне и сохраним нашу функцию (Save).
- Посмотрим, что получилось, на вкладке Preview | Input.
<SeeAlsoLinks AltText="How to create a page" Page.Id="6f11338c-3f6a-4b2a-953d-f25ec8571dc3" Page.Title="Create a Page" xmlns="" />
В папке данных хранятся все элементы данных, добавленные под всеми страницами. Нам же нужно, чтобы отображались только те элементы, которые мы добавили в папку под конкретной страницей.
Для этого мы добавим фильтр по текущей странице для элементов данных.
- На вкладке Function Calls выберем параметр Filter в вызванной функции.
- Для значения параметра, нажмем Function... и выберем функцию Demo.SeeAlsoLinks.ActivePageReferenceFilter.
- Не будем менять значение по умолчанию для ее параметра Page Scope: Current page (текущая страница). Именно оно нам и нужно.
- Сохраняем функцию (Save).
- На вкладке Settings редактора функции в группе Debug, нажимаем в поле Page.
- Выбираем ту страницу, к которой мы добавили папку данных с элементами данных.
- Смотрим 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
Добавим функцию на страницу как обычно:
- В разделе Content выбираем страницу с папкой данных SeeAlsoLinks.
- Вставляем на страницу функцию Demo.DisplaySeeAlso в визуальном редакторе (Insert | Function) или в редакторе кода вставляем такой код:
<f:function name="Demo.DisplaySeeAlso" xmlns:f="http://www.composite.net/ns/function/1.0" />
- Сохраняем страницу и смотрим в браузере, что получилось.
Сообщения по теме:
Комментариев нет:
Отправить комментарий