четверг, 5 марта 2015 г.

Дни рождения пользователей SharePoint 2013

Итак приступим.
1) Создаем свойство профиля пользователя, сопоставленное с атрибутом в AD.
У меня в AD день рождения сотрудника хранится в атрибуте «extensionAttribute15». И представлен в виде строки день.месяц (29.09).
Заходим в ЦА >  Управление приложениями > Управление приложениями-службами (Manage Service Applications) > Приложение-служба профилей пользователей. В разделе Люди открываем Управление свойствами пользователейЩелкаем Новое свойство.
Задаем «Имя», «Отображаемое имя», тип «Строка (одно значение)». Длины достаточно 5 символов, но мы перестрахуемся сделаем 10. Остальные реквизиты – как на скриншоте:
Добавляем сопоставление атрибута AD и нашего нового свойства профиля:
Выбираем нужный нам атрибут extensionAttribute15, направление «Импорт» и нажимаем кнопку «Добавить». Потом «ОК».
Теперь добавляем другое свойство (Организация) и сопоставляем с атрибутом «company».
Всегда после добавления необходимых свойств и/или их сопоставления необходимо запустить полную синхронизацию профилей пользователей.

2) Создаем управляемое свойство
Заходим в ЦА >  Управление приложениями > Управление приложениями-службами (Manage Service Applications) > Приложение службы поиска (Search Service Application) Схема поиска (Search Schema) 
Кликаем Создать управляемое свойство (New Managed Property) 
Вводим название и ставим необходимые галочки:


Добавляем сопоставление свойств:
Сохраняем наше свойство, нажав «ОК».
Добавляем еще одно свойство Организация (строка, длина 200). Сопоставляем его с атрибутом AD “company”.
Запускаем полный индекс. Перед запуском индексирования необходимо дождаться окончания полной синхронизации профилей пользователей, которую мы запустили ранее.
После окончания обхода контента можно использовать поиск для отбора сотрудников по дню рождения.
3) Теперь добавим веб-часть с днями рождениями. Добавляем веб-часть результатов поиска
Пока оставим веб-часть нетронутой и пройдем в параметры сайта для настройки запроса, т.к. в веб-части мы не сможем настроить сортировку в запросе.
Переходим в параметры сайты, в разделе «Поиск» открываем «Источники результатов» и добавляем новый источник результата:
Запускаем построитель запроса. На закладке «Основы» в «Фильтре свойств» выбираем «Показать все управляемые свойства». После этого опять щелкаем по «Фильтру свойств» и находим наше свойство «DateOfBirth»:
Выбираем сравнение «равно» и значение «На текущую дату (-5 дней)». Нажимаем кнопку «Добавить фильтр свойств». Подкорректируем вручную текст запроса и нажмем кнопку «Пробный запрос». В правом окне должны появиться первые 10 сотрудников, у которых день рождения в указанные в запросе даты:
 
Настраиваем сортировку. Сначала сортируем по дате рождения, потом по ФИО. Закрываем построитель запроса, нажав «ОК». Закрываем наш новый источника результатов, нажав «Сохранить».
Заходим в настройки нашей веб-части и нажимаем кнопку «Изменить запрос». Выбираем запрос, который мы создали в параметрах сайта «Дни рождений». Закрываем построитель запроса «Сохранить».
Для того чтобы отобразились дни рождения, нам нужно изменить шаблон отображения. Сейчас должен быть шаблон «Элемент Люди» и нам нужно на основании него создать свой. Заходим в Designer, открываем сайт и переходим в папку http://ВашПортал/_catalogs/masterpage/Display Templates/Searchнаходим и копируем файл "Item_Person.html".
Первое что отредактируем, это название шаблона.
<title>Элемент "Люди"</title> на <title>People + Birthday + Organization</title>
Далее нужно что бы веб-часть запрашивала свойство "DateOfBirth ", которое мы создали ранее. Для этого добавляем DateOfBirth: DateOfBirth в перечень других запрашиваемых свойств в сроку "ManagedPropertyMapping msdt". То же делаем для Организации ('Organization':'Organization').
Добавляем проверку, что свойство "DateOfBirth" не пусто: 
var has_birth = !$isNull(ctx.CurrentItem.DateOfBirth);
Далее необходимо добавить блок, который будет отображать день рождения, для этого нужно вставить после блока "NameField" следующий код:

<!--#_

                                        if(has_birth == true) {

_#-->

                                            <div id="DateOfBirth">

<!--#_   
                                                var tempBirthDay  = (ctx.CurrentItem.DateOfBirth).format("dd.MM");
                                                                                                                                                                                            var tempMonth = tempBirthDay.slice(3);
                                               
                                                if (tempMonth == "01") { var newBirthDay = tempBirthDay.replace(".01"," января") }
                                                else if (tempMonth == "02") { var newBirthDay = tempBirthDay.replace(".02"," февраля") }
                                                else if (tempMonth == "03") { var newBirthDay = tempBirthDay.replace(".03"," марта") }
                                                else if (tempMonth == "04") { var newBirthDay = tempBirthDay.replace(".04"," апреля") }
                                                else if (tempMonth == "05") { var newBirthDay = tempBirthDay.replace(".05"," мая") }
                                                else if (tempMonth == "06") { var newBirthDay = tempBirthDay.replace(".06"," июня") }
                                                else if (tempMonth == "07") { var newBirthDay = tempBirthDay.replace(".07"," июля") }
                                                else if (tempMonth == "08") { var newBirthDay = tempBirthDay.replace(".08"," августа") }
                                                else if (tempMonth == "09") { var newBirthDay = tempBirthDay.replace(".09"," сентября") }
                                                else if (tempMonth == "10") { var newBirthDay = tempBirthDay.replace(".10"," октября") }
                                                else if (tempMonth == "11") { var newBirthDay = tempBirthDay.replace(".11"," ноября") }
                                                else if (tempMonth == "12") { var newBirthDay = tempBirthDay.replace(".12"," декабря") }
                                                else { var newBirthDay = "Не известно - " + tempMonth };
                                                
                                                                                                                                             var encodedBirthDay = $htmlEncode('День рождения: ' + (newBirthDay));
                                                var displayBirthDay = Srch.U.getSingleHHXMLNodeValue(hhProps, "DateOfBirth");

                                                if ($isEmptyString(displayBirthDay)) { displayBirthDay = encodedBirthDay }
_#-->
                                                <div id="BirthDayValue" class="ms-srch-ellipsis" title="_#= encodedBirthDay =#_"> _#= displayBirthDay =#_ </div>
                                            </div>
<!--#_
                                        }
_#-->
Как вы могли заметить рядом со всеми шаблонами есть файлы js. Так вот, после копирования нашего файла "Item_Person_BirthDay_Organization.html", SharePoint сам создает файл js.
Открываем страницу с нашей веб-частью в режиме редактирования, переходим в свойства веб-части и меняем шаблон на "People + Birthday + Organization".
Далее настраиваем веб-часть по своему вкусу.
Но что будет, если в ближайшие три дня не будет дней рождений?

А будет такое сообщение:
Согласитесь, это не то, что хочет увидеть пользователь. Я нашел быстрый, но не самый правильный способ.
Я добавил веб-часть «Редактор сценариев», в него добавил следующий код:
<script src="/SiteAssets/jquery-1.11.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$("div[id$='NoResult']").replaceWith( '<span class="NoResult">В ближайшие время дней рождений нет...</span>' );
  
});
</script><script type="text/javascript" src="/SiteAssets/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("div[id$='NoResult']").replaceWith( '<span class="NoResult">В ближайшие время дней рождений нет...</span>' );
  
});
</script>
Результат:
Но стоит быть внимательным, если на этой странице будет другая веб-часть поиска и в ней не будет результатов, то там будет аналогичный текст.

На этом всё!

2 комментария:

  1. Добрый день, Евгений! Подскажите, данный алгоритм подойдет для SharePoint Online? Спасибо.

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Честно говоря, я не работал с SharePoint Online, поэтому мне сложно ответить.
      Вы попробуйте по моей инструкции проделать все этапы, я думаю, что не должно быть отличий для Online-версии, все же платформа одна и та же!
      Просьба, отпишитесь о результатх!

      Удалить