Теги и заметки позволяют помечать страницы сайта 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;
    }
}
Если нужно изменить/удалить все комментарии всех
пользователей, то придётся вызывать вышеприведённый код отдельно для каждого
пользователя.
Удачной социализации!

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