Введение в работу со списками с использованием SPServices

Microsoft стремительно движется в сторону предоставления SharePoint по модели SaaS в облаке.
Разработка решений для SharePoint Online имеет ряд особенностей, которые можно охаректеризовать тем, что нельзя использовать серверную объектную модель. Решения для SharePoint Online - это Sandboxed Solutions, CSOM, JSOM, APPs.

Не смотря на то, что CSOM/JSOM охватывают еще не все возможности SSOM, все большую роль начинает играть JavaScript и работа через клиентскую объектную модель.

В данной статье я хочу поговорить о библиотеке SPServices, позволяющую работать с веб-сервисами SharePoint, в удобном абстрактном виде. И как по мне, так в более простом с точки разработки виде, по сравнению с написанием аналогичного кода на JSOM.

SPServices является открытой библиотекой для jQuery.
Проект находится на codeplex'е: http://spservices.codeplex.com
Автор проекта - замечательный разработчик из Массачусетса - Marc Anderson.

Для работы необходимы jQuery и сама SPServices.
Скачиваем нужные версии и объявляем:

<script src="/_layouts/arvo/jquery/jquery-1.8.2.min.js"></script>
<script src="/_layouts/arvo/SPServices/jquery.SPServices-0.7.2.min.js"></script>

Так же можно воспользоваться ссылками CDN.
С версионностью jQuery и SPServices могут быть особенности совместимости.
Лучше всего смотреть в онлайн документацию https://spservices.codeplex.com/documentation.
В документации по SPServices можно найти много чего интересного и на многие случаи "шарепойнтбытия". ;)

Ниже я опишу самые часто используемые, по крайней мере мной, сценарии.

1. Получение данных списков / библиотек докуменов:

$().SPServices({
    // Действие получения элементов списка / библиотеки - GetListItems
    operation: "GetListItems", 
    // Режим true - асинхронный, false - синхронный
    async: false, // По умолчанию, в случае отсутствия свойства async, его значение будет равным true 
    // Отображаемое наименование списка / библиотеки 
    listName: "<Имя списка/библиотеки>", 
    // CAML перечисление получаемых полей
    CAMLViewFields: "<ViewFields><FieldRef Name='ID' /><FieldRef Name='Title' /></ViewFields>", 
    // CAML условие фильтрации элементов
    CAMLQuery: "<Query><Where><Eq><FieldRef Name='Status'/>"+
                      "<Value Type='Text'>Не действующий</Value>"+
               "</Eq></Where>"+
               "<OrderBy><FieldRef Name='Title' /></OrderBy></Query>",
    // Опции CAML запроса
    CAMLQueryOptions: "<QueryOptions><ViewAttributes Scope='RecursiveAll' "+
                      "IncludeRootFolder='True' /></QueryOptions>",
    // Функция, выполняемая по результату, возвращаемого веб-сервисом
    completefunc: function(xData, Status) {
        // Цикл по элементам XML ответа от веб-сервиса
        $(xData.responseXML).SPFilterNode("z:row").each(function() {
            // Пример получения атрибутов элемента. 
            // Перед внутренним именем в большинстве случаев должен фигурировать префикс "ows_"
            // ows - неймспейс SharePoint, расшифровывающийся как Office Web Server
            var owsID = $(this).attr("ows_ID");
            var owsTitle = $(this).attr("ows_Title");
        });
    }
});

2. Создание элемента списка / библиотеки:

$().SPServices({
    // За создание отвечает действие обновления
    // Действие обновления элементов списка / библиотеки - UpdateListItems
    operation: "UpdateListItems",
    // Режим true - асинхронный, false - синхронный
    async: false, // По умолчанию, в случае отсутствия свойства async, его значение будет равным true
    // Тип команды для создания нового элемента - New
    batchCmd: "New",
    // Отображаемое наименование списка / библиотеки 
    listName: "<Имя списка/библиотеки>",
    // Перечисление пар "Наименование поля" - "Значение элемента"
    valuepairs: [["Title", "<Наименование элемента>"], ["Description", "<Описание элемента>"]],
    // Функция, выполняемая по результату работы веб-сервиса
    completefunc: function(xData, Status) {}
});

3. Обновление элемента списка / библиотеки:

$().SPServices({
    // За создание отвечает действие обновления
    // Действие обновления элементов списка / библиотеки - UpdateListItems
    operation: "UpdateListItems",
    // Режим true - асинхронный, false - синхронный
    async: false, // По умолчанию, в случае отсутствия свойства async, его значение будет равным true
    // Отображаемое наименование списка / библиотеки 
    listName: "<Имя списка/библиотеки>",
    // Идентификатор обновляемого элемента
    // Для обновления элемента параметр batchCmd задавать не требуется
    ID: "<Идентификатор элемента, например: 42>",
    // Перечисление пар "Наименование поля" - "Значение элемента"
    valuepairs: [["Title", "<Наименование элемента>"], ["Description", "<Описание элемента>"]],
    // Функция, выполняемая по результату работы веб-сервиса
    completefunc: function(xData, Status) {}
});

Множественное обновление - используем метод SPUpdateMultipleListItems. Пример:

$().SPServices.SPUpdateMultipleListItems({  
   listName: "<Имя списка/библиотеки>",  
   CAMLQuery: "<Query><Where><Eq><FieldRef Name='Status'/>"+
              "<Value Type='Text'>Не действующий</Value>"+
              "</Eq></Where>",  
   valuepairs: [["Status", "Действующий"]]
});  

4. Удаление элемента списка / библиотеки:

$().SPServices({
    // Действие обновления элементов списка / библиотеки - UpdateListItems
    operation: "UpdateListItems",
    // Режим true - асинхронный, false - синхронный
    async: false, // По умолчанию, в случае отсутствия свойства async, его значение будет равным true 
    // Тип команды для удаления элемента - Delete
    batchCmd: "Delete",
    // Отображаемое наименование списка / библиотеки 
    listName: "<Имя списка/библиотеки>",
    // Идентификатор удаляемого элемента
    ID: "<Идентификатор элемента, например: 42>",
    // Функция, выполняемая по результату работы веб-сервиса
    completefunc: function(xData, Status) {}
});    

Множественное удаление - так же используем метод SPUpdateMultipleListItems. Пример:

$().SPServices.SPUpdateMultipleListItems({  
   listName: "<Имя списка/библиотеки>",  
   CAMLQuery: "<Query><Where><Eq><FieldRef Name='Status'/>"+
              "<Value Type='Text'>Не действующий</Value>"+
              "</Eq></Where>",  
   batchCmd: "Delete"
});

Как видно, код получается стройным, можно достойно снизить объем "макоронных изделий", особенно оценят адепты jQuery.
SPServices может значительно снизить трудоемкость разработки клиентской логики, конечно если Вы не противник jQuery в проекте SharePoint (хотя сам Microsoft использует форк jQuery под названием mQuery в SharePoint 2013) или принципиально хотите JSOM в своих проектах (особенно в силу значимых изменений в CSOM и веб-сервисах в новой версии платформы).

Кстати, в SharePoint 2013 SPServices тоже отлично работают, как и в 2010.

UPD: CRUD операции с элементами списков SharePoint на чистом JSOM.


Опубликовано: 25.09.2012
Автор: Андрей Кольтяков