Не так давно мне понадобилось построить нестандартный интерфейс для элементов списка в одном из проектов на SharePoint 2013. Задачу можно разбить на две подзадачи: получение данных и вывод на страницу. Если вторую более или менее понятно как решать (существует множество JavaScript-фреймворков для вывода данных), то решением первой навскидку можно назвать только веб-сервисы платформы. Уже собравшись писать что-то, что работало бы с ними, я обнаружил, что это уже сделано в виде jQuery-библиотеки SPServices, которая позволяет использовать функции, работающие поверх веб-сервисов SharePoint. Признаться, немало удивился, когда нашел, что тема почти не освещена на Хабре, есть лишь упоминания в двух постах. В этой статье постараемся исправить это упущение.

SPServices – jQuery-библиотека, написанная Марком Андерсоном, которая позволяет достаточно просто работать с веб-сервисами SharePoint 2007/2010/2013 на клиентской стороне. Библиотека содержит много возможностей для манипуляции данными: от получения текущего пользователя до обновления элементов списков.

В качестве примера посмотрим на решение одной из самых распростроненных задач – получение данных из списка, выведем на страницу всех сотрудников с фамилией Иванов из списка People list.

Для начала воспользуемся функцией GetListItems библиотеки и получим JSON-объект с нужными нам элементами.

<script type="text/javascript" src="/SiteAssets/libs/SPServices.js"></script>

<script>
var JSONdata;

$(document).ready(function() {
    $().SPServices({
        operation: "GetListItems",
        webURL: "/PeopleDataWeb",
        async: false,
        listName: "People list",
        CAMLQuery: "<Query><Where><Eq><FieldRef Name='LastName' /><Value Type='Text'>Иванов</Value></Eq></Where></Query>';
        CAMLViewFields: "<ViewFields><FieldRef Name='FirstName' /><FieldRef Name='LastName' /><FieldRef Name='Age' /></ViewFields>",
        completefunc: function (xData, Status) {
            JSONdata = $(xData.responseXML).SPFilterNode("z:row").SPXmlToJson({
                mapping: {
                    ows_FirstName: {mappedName: "FirstName", objectType: "Text"},
                    ows_LastName: {mappedName: "LastName", objectType: "Text"},
                    ows_Age: {mappedName: "Age", objectType: "Integer"}
                },   
                includeAllAttrs: true
            });
        }
    });
});
</script>

Рассмотрим, что здесь происходит:

  • В operation мы задаем тип операции. Типов операции немало, в документации они удобно сгруппированы по объектам.
  • webURL позволяет указать относительный адрес узла, на котором находится необходимый нам список. Этот параметр необязательный, если не указывать его явно, узел будет браться текущий.
  • Параметр async задает асинхронность операции. По умолчанию выставлен true.
  • listName – здесь, думаю, понятно. Указывается отображаемое имя (DisplayName) списка. Можно задать в виде {GUID}. Важный момент: список должен находиться на сайте, указываемом в параметре webURL, даже если мы указываем его через GUID.
  • CAMLQuery позволяет указать CAML-запрос для элементов списка. Если параметр не задан, выбираются все элементы. Напомню, для примера мы берем из списка всех сотрудников с фамилией Иванов.
  • А в CAMLViewFields необходимо указать поля списка, которые нам нужны.
  • В функции completefunc описываем, что должно происходить при удачном выполнении запроса к веб-сервису. Так как в данном примере нас интересует получение данных в виде JSON, мы применяем две другие функции библиотеки: SPFilterNode и SPXmlToJson – для парсинга XML-ответа и конвертации в JSON соответственно. Параметр mapping последней позволяет указать внутреннее имя (Internal Name) столбца списка и сопоставить его с полем в JSON, указав тип.

Итак, у нас есть JSON на клиентской стороне. Для полноты примера выведем его на страницу. Я воспользуюсь фреймворком Kendo UI от Telerik, который позволяет с легкостью отображать данные на странице.

<link href="/SiteAssets/kendo/styles/kendo.common.min.css" rel="stylesheet" />
<link href="/SiteAssets/kendo/styles/kendo.default.min.css" rel="stylesheet" />
<script src="/SiteAssets/kendo/js/kendo.kendo.min.js"></script>
<script src="/SiteAssets/kendo/js/kendo.all.min.js"></script>

<script>
$("#grid").kendoGrid({
    columns: [
        { title:  "First name", field: "FirstName" },
        { title:  "Last Name", field: "LastName" },
        { title:  "Age", field: "Age" }
    ],
    dataSource:  {
        data: JSONdata,           
    },
    height: 600
});
</script>

<div id="grid"></grid>

Используемая литература:



Если есть вопросы, пожелания или проклятья, добро пожаловать в комментарии.

Комментарии (2)


  1. doctorsolberg
    08.12.2015 10:24

    Добрый день. А почему не использовали JSOM? Не было доступа или какие-то недостатки по сравнению с SPServices?


    1. timiskhakov
      08.12.2015 12:37

      Добрый день. Спасибо за вопрос. Для этой задачи мне фактически необходимо было получить JSON-объект для грида в Kendo UI, который активно использовался в проекте. Быстрее всего, как я думаю, это можно сделать с помощью SPServices с использованием функций SPFilterNode и SPXmlToJson.