Настройка передачи данных между веб-частями DataView с помощью XSL

Поиск по сайту
    

Настройка передачи данных между веб-частями DataView с помощью XSL

Наиболее простой и удобный способ персонализировать представление данных в SharePoint  – с помощью использования веб-частей DataView. Которые позволяют с помощью XSL-кода преобразовывать данные списков и библиотек в HTML, позволяя добиться абсолютно любого их отображения.
Ситуации, когда необходимо передать данные в виде параметров из одной веб-части DataView в другую (или в ту же самую), возникают довольно часто. Для веб-частей со стандартной версткой SharePoint Designer делает это автоматически, без детализации происходящего процесса. Некоторую информацию по этому поводу можно получить через MSDN, но с расчётом исключительно на программное решение этих проблем (на C# или VB.Net). Значение тегов, используемых в стандартном XSL-коде SharePoint, подробно не разъясняется.
Рассмотрим возможности по созданию фильтров с помощью XSL на следующем примере:  существует список категорий и список новостей, которые могут принадлежать к одной или нескольким категориям. Необходимо иметь возможность фильтровать новости по категориям, не  используя стандартные представления SharePoint, чтобы иметь  полный контроль над тем, что, как и где отображается.
Рассмотрим два случая:
1) Передача данных из веб-части в саму себя;
2) Передача данных из одной веб-части в другую.

  1. Передача данных из веб-части в саму себя

Этот способ является наиболее простым. Внутрь тега <ParameterBindings> существующей веб-части DataView добавляем:
<ParameterBinding Name="Category" Location="Postback" DefaultValue="none"/> Где Location="Postback" указывает на то, что данные для этого параметра будут получены из запроса пользователя.
Получаем этот параметр в XSL (сразу после тега <xsl:stylesheet>):
<xsl:param name="Category"/> Теперь можно использовать этот параметр для фильтрации данных (если данные фильтруются на уровне запроса, то в XSL параметр можно не передавать).
Следующим этапом научимся отправлять данные. Делается это с помощью специальной функции ddwrt:GenFireServerEvent().Чтобы получить возможность использовать функции из пространства имён ddwrt, нужно подключить его в теге <xsl:stylesheet>:
<xsl:stylesheet version="1.0"  xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> После чего создаём ссылки, которые будут отправлять данные на сервер:
<a  href='javascript:{ddwrt:GenFireServerEvent("Category={HotNews}")}'>Show HotNews</a> В данном случае передаем в параметр Category значение HotNews (если значение параметра может содержать специальные символы, его нужно пропустить через функцию ddwrt:ConnEncode(string), которая заменяет символы, недопустимые в URL, на их шестнадцатиричные представления). Если нам нужно отправить значение сразу нескольких параметров, они перечисляются через «;»:
ddwrt:GenFireServerEvent("Category={HotNews};Rating={Important}")

  1. Передача данных из одной веб-части в другую

Для передачи данных из одной веб-части в другую необходимо использовать WebPart Connections, вследствие этого функция для отправки данных  будет намного сложнее.
Для создания WebPart Connection предпочтительно пользоваться стандартным интерфейсом SharePoint Designer, поскольку верное заполнение всех параметров является довольно сложной процедурой. Кроме того, для самого connection требуется отдельный id.
Чтобы создать соединение веб-частей через Designer, нужно вначале определить у веб-части-получателя параметр, в который она будет получать результаты (для него Location должно быть None). Затем у веб-части-отправителя создать соединение для отправки строки данных в параметр веб-части-получателя (можно отправлять данные не только в веб-часть DataView; при отправке в другие веб-части возможны другие настройки соединения и веб-части-получателя, но для веб-части-отправителя всё будет то же самое).
Для отправки данных через соединение веб-частей используется функция ddwrt:GenFireConnection(). Для её использования требуется подключить пространство имён ddwrt, про это см. выше.
Сама функция имеет следующий синтаксис:
ddwrt:GenFireConnection(szConnectStr, szOtherPostback) Где szConnectStr – это данные, передаваемые через соединение, в следующем формате:
[Receiver-id]*@[Parameter]=[value] где  [Receiver-id] – ID веб-части-получателя, [Parameter] – имя параметра, [value] – значение параметра. Например:
g_db4bd15d_b70b_4130_b87f_641d7acaae1b*@Category=HotNews Второй параметр функции, szOtherPostback, задаёт данные, которые передаются обратно в веб-часть-отправитель. Это используется для отображения выбранных настроек фильтра. Этот параметр имеет такой же формат, как и при простой передаче данных веб-части самой себе, см. выше.
Итак, целиком наша функция может выглядеть так:
ddwrt:GenFireConnection('g_db4bd15d_b70b_4130_b87f_641d7acaae1b*@Category=HotNews', 'Category={HotNews}') При вызове этой функции веб-часть-получатель и веб-часть-отправитель получат в параметр Category значение HotNews. В этом случае первая сможет верно отфильтровать новости, показав только те, которые имеют категорию HotNews, а вторая — показать настройки фильтров.

Проблемы с кодировкой

Чтобы передавать в качестве значения параметров не только базовые ASCII-символы, но и кириллические буквы и специальные символы, их необходимо закодировать в формат URL с помощью функции ddwrt:UrlEncode(string).  К сожалению,  для всех этих функций поддержка кодировок реализована недостаточно хорошо. В результате чего получаем неприятный «симбиоз» ошибок браузера и сервера.
Передача параметров значения набранных кириллицей, будут работать только в  Internet Explorer. Кроме того, и для работы в  IE иногда нужно применить некоторую хитрость. В правильном для сервера формате данные передаются, если они были получены IE как ссылка, а не как функция JavaScript.
Таким образом будут работать:
<a href="javascript:{ddwrt:....}">link</a>; или
<script type="text/javascript">window.location = javascript:<xsl:value-of select="ddwrt:......."/>;</script>; Однако самый простой вариант работать не будет:
<script type="text/javascript"><xsl:value-of select="ddwrt:......."/>;</script>  —  данный код будет выдавать данные в неправильной кодировке или просто ничего не выдавать.
Суть проблемы состоит в следующем:  при вводе символов UTF-8 в кодировке URL в адресную строку IE, браузер не определяет, что это Юникод.  Каждый байт текста (в UTF-8 кириллические символы записываются 2 байтами) рассматривается как отдельный символ.  Слово «События»  («%D0%A1%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F» в кодировке URL) преобразуется в «Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ», но это как раз то, что необходимо получить. Ни один другой браузер такой «способностью» не обладает, поэтому это больше нигде работать не будет.

Заключение

Безусловно, в большинстве случаев значение параметров описанных функций следует заполнять автоматически. Это можно делать как с помощью XSL на этапе генерации страницы, так и с помощью JavaScript уже в браузере пользователя. Но  использование этой функции на практике, не входит в область рассмотрения данной статьи.

Василий Алексеев,
старший веб-верстальщик компании ИТТИЛАН