четверг, 15 января 2015 г.

Дни рождения пользователей - SharePoint 2013 (Part 2)

В продолжении статьи Дни рождения пользователей - SharePoint 2013 (Part 1) я сегодня расскажу, как вывести дату рождения в веб-часть.




1. Выведение дня рождения в веб часть

Для того чтобы отобразились дни рождения, нам нужно изменить шаблон отображения. Сейчас должен быть шаблон «Элемент Люди» и нам нужно на основании него создать свой.

Что мы делаем, это подключаем сайт как внешний диск. Для этого открываем "Мой компьютер ", нажимает "Подключить сетевой диск"


выбираем букву диска и указываем адрес сайта http://site/_catalogs/masterpage/



в итоге получается такой внешний диск (при подключении диска возможно потребуется ввести учетные данные)


переходим с каталог с шаблонами Z:\Display Templates\Search (у вас может быть другая буква диска)
находим и копируем к себе на компьютер файл "Item_Person.html"

На локальном компьютере я переименовал файл в "Item_Person_BirthDay.html" и открыл его редактором (использую Notepad ++)
Первое что отредактируем, это название шаблона

 <title>Элемент "Люди"</title> на <title>Элемент "Дни рождения"</title>

далее нужно что бы веб-чать запрашивала свойство  "BirthDay", для этого добавляем 'BirthDay':'BirthDay' в перечень других запрашиваемых свойств.


добавляем проверку, что свойство  "BirthDay" не пусто 

var has_birth = !$isNull(ctx.CurrentItem.BirthDay);



далее необходимо добавить блок, который будет отображать день рождения, для этого нужно вставить после блока "NameField" следующий код:

<!--#_ 
                                        if(has_birth == true) {
_#-->
                                            <div id="BirthDay">
<!--#_
                                                var tempBirthDay  = (ctx.CurrentItem.BirthDay).toLocaleDateString()
var encodedBirthDay = tempBirthDay
                                                var displayBirthDay = Srch.U.getSingleHHXMLNodeValue(hhProps, "birthday");
                                                if ($isEmptyString(displayBirthDay)) { displayBirthDay = encodedBirthDay }
_#--> 
                                                <div id="BirthDayValue" class="ms-srch-ellipsis" title="_#= encodedBirthDay =#_"> _#= displayBirthDay =#_ </div>
                                            </div>
<!--#_ 
                                        }
_#-->

должно быть так:


копируем вновь созданный файл "Item_Person_BirthDay.html" в каталог с шаблонами 

как вы могли заметить рядом со всеми шаблонами есть файлы js, так вот, после копирования нашего фала"Item_Person_BirthDay.html", SharePoint сам создает файл js.

Открываем страницу с нашей веб-частью в режиме редактирования, переходим в свойства веб-части и меняем шаблон на "Элемент Дни рождения"
Сохраняем страницу и смотрим
уже не плохо, но согласитесь, так оставлять нельзя.
я использовал следующий код
<!--#_ 
                                        if(has_birth == true) {
_#-->
                                            <div id="BirthDay">
<!--#_
                                                var tempBirthDay  = (ctx.CurrentItem.BirthDay).format("dd.MM")
var encodedBirthDay = $htmlEncode('День рождения: ' + (tempBirthDay));
                                                var displayBirthDay = Srch.U.getSingleHHXMLNodeValue(hhProps, "birthday");
                                                if ($isEmptyString(displayBirthDay)) { displayBirthDay = encodedBirthDay }
_#--> 
                                                <div id="BirthDayValue" class="ms-srch-ellipsis" title="_#= encodedBirthDay =#_"> _#= displayBirthDay =#_ </div>
                                            </div>
<!--#_ 
                                        }
_#-->

результат такой

У меня английский SharePoint и при использовании полного месяца (ctx.CurrentItem.BirthDay).format("dd MMMM") 
получалось вот так
Может у кого русский ShrePoint может там будет отображать нормально, я не знаю.

в следующей статье я расскажу, как как сортировать результаты и как заменить текст при отсутствии результатов.

ОБНОВЛЕНИЕ:
переработал способ получения даты рождения

<!--#_
                                        if(has_birth == true) {

_#-->
                                            <div id="BirthDay">
<!--#_                                              
var tempMonth = ((ctx.CurrentItem.BirthDay).getMonth()+1)
var tempDay = (ctx.CurrentItem.BirthDay).getDate()

                                                if (tempMonth == "1") { var newMonth = " января" }
else if (tempMonth == "2") { var newMonth = " февраля" }
else if (tempMonth == "3") { var newMonth = " марта" }
else if (tempMonth == "4") { var newMonth = " апреля" }
else if (tempMonth == "5") { var newMonth = " мая" }
else if (tempMonth == "6") { var newMonth = " июня" }
else if (tempMonth == "7") { var newMonth = " июля" }
else if (tempMonth == "8") { var newMonth = " августа" }
else if (tempMonth == "9") { var newMonth = " сентября" }
else if (tempMonth == "10") { var newMonth = " октября" }
else if (tempMonth == "11") { var newMonth = " ноября" }
else if (tempMonth == "12") { var newMonth = " декабря" }
else { var newMonth = "Не известно - " + (tempDay) + (tempMonth) };
var encodedBirthDay = $htmlEncode('День рождения: ' + tempDay  + newMonth );
                                                var displayBirthDay = Srch.U.getSingleHHXMLNodeValue(hhProps, "birthday");

                                                if ($isEmptyString(displayBirthDay)) { displayBirthDay = encodedBirthDay }
_#-->
                                                <div id="BirthDayValue" class="ms-srch-ellipsis" title="_#= encodedBirthDay =#_"> _#= displayBirthDay =#_ </div>
                                            </div>
<!--#_
                                        }
_#-->

в итоге: