Link blog.vitalyzhukov.ru

Блог переехал вот сюда: Blog.VitalyZhukov.ru

20 окт. 2010 г.

SharePoint 2007. Получение элементов списка из нескольких списков и узлов

Что делаем
Получаем коллекцию элементов списка из различных списков разных веб-узлов. CrossList-CrossWeb. Как-то так.
Для конкретизации исходных данных сделаем:

  • три дочерних узла (web01, web02, web03) в корневом узле;
  • список на каждом из этих узлов;
  • тип содержимого Public ListItem. Будем искать элементы этого типа;
  • несколько элементов типа Public ListItem на каждом из созданных списков, предварительно добавив этот тип содержимого в списки.

Попробуем отобразить информацию об этих элементах в веб-парте на корневом узле.


Зачем
Например для получения списка документов, измененных текущим пользователем за последнюю неделю. Или, если элементы одно и тоже типа располагаются в различных списках (например, в списках "Договора 2008", "Договора 2009", ...)


Что понадобится
Для формирования запроса будем использовать SPSiteDataQuery. Для получения элементов будем вызывать метод GetSiteData класса SPWeb и передавать туда наш запрос.
В классе SPSiteDataQuery нас интересуют следующие его свойства:

  • Lists. содержит информацию о списках, по которым будет осуществлять поиск;
  • ViewFields. содержит список полей, которые попадут в результирующий набор. Поля WebId, SiteId и ID включаются в список по-умолчанию (содержимое полей понятно из названия);
  • Webs. содержит информацию о веб-узлах, по спискам (библиотекам) которых будет осуществляться поиск;
  • Query сам запрос для фильтрации элементов в списках.
Для того чтобы добавить в список тип содержимого надо:
  • перейти на страницу параметров списка;
  • перейти по ссылке Дополнительные параметры;
  • разрешить управление типами содержимого:


Реализация
Сделаем веб-части, которая будет отображать GridView, содержащий информацию об элементах.
namespace ZhukPoint.Portal2007.WebParts
{
    public class SiteQueryWebPart : Microsoft.SharePoint.WebPartPages.WebPart
    {
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            // Текущий контекст
            SPContext ctx = SPContext.Current;
            // GridView, который будет содержать информацию об элементах списка
            GridView gv = new GridView();
            // Чтоб не отваливалась, если нет прав
            SPSecurity.RunWithElevatedPrivileges(
                delegate
                    {
                        using (SPSite site = new SPSite(ctx.Site.ID))
                        {
                            // Запрос
                            var siteQuery = new SPSiteDataQuery
                            {
                                // Ищем элементы в списках
                                Lists = "<Lists BaseType='0' />",
                                // Выбираем поле "Название"
                                ViewFields = "<FieldRef Name='Title' />",
                                // Ищем по всем узлам
                                Webs = "<Webs Scope='SiteCollection' />",
                                // Ищем элементы конкретного типа
                                // Ищем элементы, созданные текущим пользователем
                                Query =
                                    @"<Where>
                                        <And>
                                            <BeginsWith>
                                                <FieldRef Name='ContentTypeId' />
                                                <Value Type='Text'>0x010001A7BD983B790C41B06A3399D2E850D7</Value>
                                            </BeginsWith>
                                            <Eq>
                                                <FieldRef Name='Author' />
                                                <Value Type='User'><UserID Type='Integer'/></Value>
                                            </Eq>
                                        </And>
                                    </Where>"
                            };
                            // Выполняем запрос. В результате получаем DataTable
                            DataTable dt = site.RootWeb.GetSiteData(siteQuery);
                            // "Привязываем" DataTable к GridView и заполняем его
                            gv.DataSource = dt;
                            gv.DataBind();
                        }
                    });
            // Добавляем GridView на страницу
            Controls.Add(gv);
        }
    }
}

В результате получаем:



Теперь немного изменим параметры запросы, чтобы получить информацию о документах, созданных текущим пользователем:
...
// Запрос
var siteQuery = new SPSiteDataQuery
{
    // Ищем элементы в библиотеках док-ов
    Lists = "<Lists BaseType='1' />",
    // Выбираем поле "Название", "Создан", "Версия"
    ViewFields = "<FieldRef Name='Title' /><FieldRef Name='Created' /><FieldRef Name='_UIVersionString' />",
    // Ищем по всем узлам
    Webs = "<Webs Scope='SiteCollection' />",
    // Ищем элементы, созданные текущим пользователем
    Query =
        @"<Where>
            <Eq>
                <FieldRef Name='Author' />
                <Value Type='User'><UserID Type='Integer'/></Value>
            </Eq>
        </Where>"
};
...

В результате получим:

Более подробное о классе SPSiteDataQuery можно прочитать на MSDN.

Комментариев нет:

Отправить комментарий