AXForum  
Вернуться   AXForum > Блоги > CRM, SharePoint и Черная Магия
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
  • Консалтинг
  • Проектирование
  • Разработка
  • Обучение


MVP 2010, 2011
Рейтинг: 5.00. Голосов: 2.

Пользовательские контролы с Присутствием в SharePoint

Запись от Артем Enot Грунин размещена 08.10.2009 в 14:29

Однажды я уже касался индикаторов присутствия на страницах своего блога. Если в CRM они редкость и роскошь, то SharePoint ими буквально напичкан - они по умолчанию есть в списках, на сылках и подписях, словом на всем что указывает на профиль пользователя. На всем, кроме пользовательских типов контролов... В этом есть нечто общее с CRM - нет открытого для разработчика интерфейса для реализации подобной ф-ции. В SDK на слово Precence отзывается одна единственная полезная страница NameCtrl Control, которая поможет скорее с выбором направления поисков, нежели в реализации данного функционала. Решение, тем нее менее удалось найти. Как и в CRM присутствие реализует JS код, хранимый не в файле OWS.js, как это говорит в SDK, а в init.js, который лежит в том же каталоге (может помочь при отладке). Нас в первую очередь интересуют две функции:
EnsureIMNControl
, инициирующая цепь событий, которые вдохнут жизнь в наш дохлый контрол, и IMNGetOOUILocation которая определит позицию индикатора. Реализация последней особенно интересна:
Код:
    var objRet=new Object;
    var objSpan=obj;
    var objOOUI=obj;
    var oouiX=0, oouiY=0, objDX=0;
    var fRtl=document.dir=="rtl";
    while (objSpan && objSpan.tagName !="SPAN" && objSpan.tagName !="TABLE")
    {
        objSpan=objSpan.parentNode;
    }
    if (objSpan)
    {
        var collNodes=objSpan.tagName=="TABLE" ?
            objSpan.rows(0).cells(0).childNodes :
            objSpan.childNodes;
        var i;
        for (i=0; i < collNodes.length;++i)
        {
            if (collNodes.item(i).tagName=="IMG" && collNodes.item(i).id)
            {
                objOOUI=collNodes.item(i);
                break;
            }
            if (collNodes.item(i).tagName=="A" &&
                collNodes.item(i).childNodes.length > 0 &&
                collNodes.item(i).childNodes.item(0).tagName=="IMG" &&
                collNodes.item(i).childNodes.item(0).id)
            {
                objOOUI=collNodes.item(i).childNodes.item(0);
                break;
            }
        }
    }
* * *
Вот так она будет осуществлять поиск положения индикатора. Иными словами, контрол должен быть завернут в HTML элемент SPAN или TABLE и быть либо анкером, либо картинкой. После недолгих мучений мне удалось реализовать данное требование. Ваш код на C# мог бы выглядеть следующим образом:
Код:
HtmlGenericControl lineString;
HtmlImage indicator = new HtmlImage();
 indicator.ID = "imid_" + i;
indicator.Src = "/_layouts/images/imnhdr.gif";
indicator.Attributes.Add("onload", "IMNRC('" + <UserEmail> + "')");
indicator.Attributes.Add("ShowOfflinePawn", "1");
indicator.Attributes.CssStyle.Add(HtmlTextWriterStyle.MarginRight, "2px");

// Оборачиваем индикатор в SPAN (нужно чтобы корректно привязались обработчики событий)
HtmlGenericControl indSpan = new HtmlGenericControl("SPAN");
indSpan.Controls.Add(indicator);

// Ссылка на пользователя
HtmlAnchor link = new HtmlAnchor();
link.InnerHtml = <UserName>;
link.HRef = <MySiteUri>;
link.Attributes.CssStyle.Add(HtmlTextWriterStyle.MarginRight, "15px");
lineString.Controls.Add(indSpan);
lineString.Controls.Add(link);
В данной реализации индикатор будет "натравлен" на пустую картинку перед ссылкой на профиль пользователя. Обратите внимание на тег <UserEmail>: каждый идикатор должен знать SIP адрес пользователя на которого ссылается, или на худой конец его E-Mail, которые чаще всего совпадают. Оба эти атрибута доступны через профиль пользователя, например так:
Код:
UserProfileManager profileManager = new UserProfileManager(ServerContext.Current);
UserProfile profile = profileManager.GetUserProfile(@"domen\user");
String email = (String)profile[PropertyConstants.WorkEmail].Value;
String sip = (String)profile[PropertyConstants.SipAddress].Value;
Размещено в OCS, SharePoint
Просмотров 70441 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:26.