Получение данных SharePoint на клиенте с помощью SPServices

от автора

Не так давно мне понадобилось построить нестандартный интерфейс для элементов списка в одном из проектов на 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> 

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

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

ссылка на оригинал статьи http://habrahabr.ru/post/272549/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *