пятница, 13 января 2012 г.

Работа с тегами и заметками (комментариями)


Теги и заметки позволяют помечать страницы сайта SharePoint общедоступными соответственно тегами и комментариями.
Данные социальные объекты приписываются к определённому адресу и содержат в себе заголовок (не отображается на сайте), содержимое и владельца (создателя).
Программный доступ к ним осуществляется через объекты SocialTagManager и SocialCommentManager, а также объект SocialRatingManager для рейтинга. Далее будем рассматривать работу с комментариями, работа с тегами и рейтингом реализовывается аналогичным образом.

Получение списка комментариев. Рассмотрим следующий метод:
using (var site = new SPSite(SPContext.Current.Site.ID))
{
    var spServiceContext = SPServiceContext.GetContext(site);
    var socialContextManager = new SocialCommentManager(spServiceContext);
    var comments = socialContextManager.GetComments(new Uri("http://mysite/default.aspx", UriKind.Absolute));
}

Проблемы приведённого кода в том, что он позволяет получить комментарии только определённого пользователя. Для получения всех комментариев всех пользователей для определённого Url необходимо произвести операцию обнуления контекста! Например, следующим образом:
using (var site = new SPSite(SPContext.Current.Site.ID))
{
    var httpContext = HttpContext.Current;
    try
    {
        var spServiceContext = SPServiceContext.GetContext(site);
        var currentWeb = SPContext.Current.Web;
        HttpContext.Current = null; //Обнуляем текущий контекст
        var socialContextManager = new SocialCommentManager(spServiceContext);
        var comments = socialContextManager.GetComments(new Uri("http://mysite/default.aspx", UriKind.Absolute));
    }
    finally
    {
        HttpContext.Current = httpContext; //Восстанавливаем текущий контекст
    }
}

Добавление нового комментария. Пожалуй, единственная операция, которая работает без дополнительных костылей! J
var spServiceContext = SPServiceContext.GetContext(SPContext.Current.Site); //Получение контекста
var socialContextManager = new SocialCommentManager(spServiceContext); //Создание объекта менеджера комментариев
socialContextManager.AddComment(new Uri("http://mysite/default.aspx", UriKind.Absolute), "Мой комментарий!", false, "Заголовок комментария"); //Создание и добавление комментария

Изменение и удаление комментария. Рассмотрим код:
using (var site = new SPSite(SPContext.Current.Site.ID))
{
    var spServiceContext = SPServiceContext.GetContext(site); //Получаем контекст
    var socialContextManager = new SocialCommentManager(spServiceContext);
    var comments = socialContextManager.GetComments(new Uri("http://mysite/default.aspx", UriKind.Absolute)); //Получаем список комментариев

    comments[0].Comment = "Изменённый комментарий"; //Изменяем комментарий
    comments[0].Update(); //Применяем изменения

    comments[1].Delete(); //Удаляем комментарий
}

Проблема данного кода, в том, что таким образом можно удалить только «свои» комментарии, т.е. те которые созданы текущим пользователем. Для удаления комментариев, созданных другими пользователями, необходимо изменить текущего пользователя в контексте. Сделать это можно используя рефлексию:
var siteUrl = SPContext.Current.Site.Url;
using (var site = new SPSite(siteUrl))
{
    var socialCommentManager = new SocialCommentManager(SPServiceContext.GetContext(HttpContext.Current));
    var comments = socialCommentManager.GetComments(CommentsControl.CurrentUri).ToList(); //Получаем список комментариев
    var commentOwner = comments[0].Owner["AccountName"].ToString(); //Получаем логин пользователя создавшего комментарий
   
    using (var web = site.OpenWeb())
    {
        var user = web.EnsureUser(commentOwner);//Получаем нужного пользователя
        web.AllowUnsafeUpdates = true;
        var request = new HttpRequest("", siteUrl, "");
        HttpContext.Current = new HttpContext(request, new HttpResponse(new StringWriter(CultureInfo.CurrentCulture)));
        HttpContext.Current.Items["HttpHandlerSPWeb"] = web;
        var identity = WindowsIdentity.GetCurrent(); //Получаем сущность текущего пользователя
        typeof (WindowsIdentity).GetField("m_name", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(identity, user.LoginName);
        HttpContext.Current.User = new GenericPrincipal(identity, new string[0]); //Изменяем текущего пользователя текущего контекста

        var socialCommentManager2 = new SocialCommentManager(SPServiceContext.GetContext(HttpContext.Current));
        var commentsList = socialCommentManager.GetComments(CommentsControl.CurrentUri).ToList(); //Получаем список комментариев

        commentsList[0].Comment = "Изменённый комментарий"; //Изменяем комментарий
        commentsList[0].Update(); //Применяем изменения

        web.AllowUnsafeUpdates = false;
    }
}

Если нужно изменить/удалить все комментарии всех пользователей, то придётся вызывать вышеприведённый код отдельно для каждого пользователя.

Удачной социализации!

пятница, 5 августа 2011 г.

Программный доступ к элементам навигации SharePoint

Начну с того что настройка навигации осуществляется на странице «Параметры структуры переходов узла».


Доступ к этой странице можно получить через параметры сайта перейдя к пункту «Переходы», либо (при включённой публикации) через пункт главного меню «Изменить структуру переходов».

По отношению к сайтам навигация бывает
  • Глобальная
  • Текущая
По расположению на странице, навигация делится на
  • Верхнюю панель навигации
  • Панель быстрого запуска
Глобальная навигация — навигация общая для всех сайтов, в текущей коллекции сайтов.
Текущая навигация — это, соответственно, навигация, присущая текущему сайту.
Верхняя панель навигации — панель, находящаяся под заголовком и логотипом, обычно отображающая названия сайтов в коллекции:
Панель быстрого запуска — левая панель, содержащая ссылки на библиотеки документов, ссылки и т.п.:

Программный доступ к навигации осуществляется через объект Navigation, находящийся в SPWeb.
//Глобальная навигация
var globalNodes = web.Navigation.GlobalNodes;
//Ветвь домашней страницы
var homeNode = web.Navigation.Home;
//Быстрый запуск
var quickLaunch = web.Navigation.QuickLaunch;
//Верхняя панель навигации
var topNavigationBar = web.Navigation.TopNavigationBar;

Каждый из этих элементов (кроме Home) представляет собой коллекцию ветвей навигации (SPNavigationNode).
Рассмотрим основные их свойства:
foreach (SPNavigationNode node in topNavigationBar)
{
    //Название
    var nodeTitle = node.Title;
    //URL-адрес
    var nodeUrl = node.Url;
    //Видимость
    var nodeVisibility = node.IsVisible;
    //Локальность
    var nodeTargetLocation = node.IsExternal;
    //Аудитория
    var nodeAudience = node.Properties["Audience"] == null ? string.Empty : node.Properties["Audience"].ToString();
    //Тип
    var nodeType = node.Properties["NodeType"] == null ? string.Empty : node.Properties["NodeType"].ToString();
    //Описание
    var nodeDescription = node.Properties["Description"] == null ? string.Empty : node.Properties["Description"].ToString();
    //Вариант открытия ссылки
    var nodeTarget = node.Properties["Target"] == null ? string.Empty : node.Properties["Target"].ToString();
    //Вложенные ветви
    var subNodes = node.Children;
}

Рассмотрим каждый пункт отдельно.
Название, URL-адрес, Вариант открытия ссылки, Описание и Аудиторию мы можем увидеть в окне создания/изменения ссылки на сайте.

Вариант открытия ссылки — возвращает либо пустую строку или «_self», и тогда ссылка будет открываться в том же окне, либо возвращает значение «_blank» и ссылка будет открываться в новом окне.
Про аудитории мы уже говорили, см. предыдущие посты.
Видимость —  данные параметр должен определять, скрыта ли ссылка, но он, к сожалению не работает. 
Локальность — определяет, указывает ли ссылка на локальный ресурс или внешний (true — внешний)
Тип ветви — может принимать следующие значения (все возможные значения можно найти в перечислении NodeTypes):
  • Area — для элементов типа «Сайт»:
  • Heading — для элементов типа «Папка»:
  • AuthoredLinkPlain — для элементов типа «Ссылка»:
  • Page — для элементов типа «Страница»:
Теперь поговорим о настройках навигации, о программном доступе к ним:
Для доступа к ним нам понадобится объект PublishingWeb (находится в библиотеке Microsoft.SharePoint.Publishing).
var publishingWeb = PublishingWeb.GetPublishingWeb(web);

//Показать дочерние узлы
var showSubSites = publishingWeb.IncludeSubSitesInNavigation;
//Отображать страницы
var showPages = publishingWeb.IncludePagesInNavigation;
//Тип сортировки
var ordering = publishingWeb.NavigationOrderingMethod;
//Поле сортировки
var sotringField = publishingWeb.NavigationAutomaticSortingMethod;
//Направление сортировки
var sortDirection = publishingWeb.NavigationSortAscending;

(для SharePoint 2010 эти свойства располагаются в объекте publishingWeb.Navigation)
Отображать страницы — определяет, надо ли отображать страницы из системной библиотеки «Страницы»
Тип сортировки — перечисление, может принимать значения:
  • OrderingMethod.Automatic — Сортировать автоматически
  • OrderingMethod.Manual — Сортировать вручную
  • OrderingMethod.ManualWithAutomaticPageSorting — Сортировать страницы автоматически
Поле сортировки — перечисление, может принимать значения:
  • AutomaticSortingMethod.Title — Сортировка по названию
  • AutomaticSortingMethod.CreatedDate — Сортировка по дате создания
  • AutomaticSortingMethod.LastModifiedDate — Сортировка по дате изменения
Направление сортировки — по алфавиту или в обратном порядке (true — по алфавиту)
Кроме этих свойств, PublishingWeb даёт доступ к текущей структуре навигации:
var currentNodes = publishingWeb.CurrentNavigationNodes;

А ещё проверить видимость элемента. Так например проверяется видимость страниц:
if (node.GetProperty("NodeType") == NodeTypes.Page.ToString())
{
    if (!publishingWeb.IncludePagesInNavigation)
        return false;

    var pPages = publishingWeb.GetPublishingPages();
    var pPage = pPages[nn.Url];
    if (pPage != null && !pPage.IncludeInGlobalNavigation)
        return false;
} 

Всем приятного программирования!

пятница, 29 июля 2011 г.

SharePoint и Opera

Ещё со времён 2007-го SharePoint'а существует проблема работы с сайтом из Оперы.
На сайте планирования поддержки браузера для SharePoint этот браузер даже не указан, т.о. Microsoft его просто игнорирует и, следовательно, официально (или скорее не официально) он не поддерживается.

Самая большая проблема при попытке работать в SharePoint из Оперы — это полная неработоспособность меню. Также есть ряд других проблем: с полосами прокрутки, панелью настройки веб-части и т.д.

Все это решается довольно просто. Нужно лишь указать браузеру маскироваться под Firefox.
Делается это так:
Открываем сайт SharePoint.
В контекстном меню сайта выбираем пункт Edit Site Preferences… (Настройки для сайта):

В диалоговом окне Site Preferences (Настройки для сайта) переходим к вкладке Network (Сеть):

И устанавливаем в параметре Browser Identification (Идентификация браузера) значение Mask as Firefox (Маскироваться под Firefox).
После этого необходимо обновить страницу. Все меню и прочие плюшки начинают работать!

P.S. Для тех кто использует SharePoint как интернет сайт могу указать статью, решающую часть проблем с Оперой посредством редактирования главных страниц и JavaScript-файлов.

вторник, 12 июля 2011 г.

Использование ObjectDataSource в SharePoint 2010 Visual Web Part

Создаём простейшую визуальную веб-часть.

В контрол добавляем ObjectDataSource (ODS) и что-нибудь его отображающее, допустим DataGrid:

Создаём необходимые для ODS классы — для поиска и для объекта поиска. Неважно, что они делают и возвращают.
Делаем встраивание веб-части и пробуем добавить её на страницу.

Неожиданно получаем следующую ошибку:

«Не удается найти тип объекта данных, указанный в свойстве TypeName ObjectDataSource 'SearchResultsDataSource'.»
или
«The data object type specified in the DataObjectTypeName property of ObjectDataSource ' SearchResultsDataSource' could not be found»

В чём же дело??

А дело в том, что ODS не находит нашу сборку DLL. Соответственно и необходимый тип в ней.

Решения данной проблемы может быть два: 
1. Положить сборку веб-части в папку BIN необходимого сайта (по умолчанию, «C:\inetpub\wwwroot\wss\VirtualDirectories\80\bin\»). Способ не совсем удобный. Но подходит для тех кто изначально добавляет библиотеки в BIN, а не GAC.
2. Поправить файл конфигурации сайта, web.config:
  <configuration>
  <system.web>
    <
compilation>
      <
assemblies>
        <
add assembly="YourAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fed062df71e7ef1c" />
      </
assemblies>
    </
compilation>
  </
system.web>
</
configuration>