вторник, 17 марта 2015 г.

Создание опроса с картинками в SharePoint 2013

Для того, чтобы можно было использовать картинки в опросах, необходимо скачать jquery (я использовал jquery-1.11.1.min.js). Затем в формах создания, просмотра, редактирования и просмотра всех ответов добавить следующее:
1) В форме NewForm.aspx ищем раздел
</SharePoint:UIVersionedContent>
                <table class="ms-core-tableNoSpace" id="onetIDListForm">
                 <tr>
                  <td>
И после него вставляем
 <script type="text/javascript" src="../../JS/jquery-1.11.1.min.js"></script>
<script type="text/javascript">$(document).ready(function() {$(".ms-RadioText").parent().parent().parent().parent().css("position","relative").css("top","10px");$(".ms-RadioText").each(function(){img =$(this).attr("Title");$(this).attr("Title","");$(this).find("label").html("");$(this).append(img);})});</script>

2) В форме DispForm.aspx ищем раздел
</SharePoint:UIVersionedContent>
                <table class="ms-core-tableNoSpace" id="onetIDListForm">
                 <tr>
                  <td>
 И после него вставляем:
<script type="text/javascript" src="../../JS/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(".ms-formbody").each(function(){
var newtext=$(this).html().replace("&lt;","<").replace("&gt;",">").replace("&lt;","<").replace("&gt;",">").replace("&lt;","<").replace("&gt;",">");
$(this).html(newtext)
});
});
</script>
3) В форме EditForm.aspx ищем раздел
</SharePoint:UIVersionedContent>
                <table class="ms-core-tableNoSpace" id="onetIDListForm">
                 <tr>
                  <td>
 И после него вставляем:
<script type="text/javascript" src="../../JS/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".ms-RadioText").parent().parent().parent().parent().css("position","relative").css("top","10px");
$(".ms-RadioText").each(function(){
img =$(this).attr("Title");
$(this).attr("Title","");
$(this).find("label").html("");
$(this).append(img);
})
});
</script>
 4) В форме summary.aspx ищем раздел
<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
И после него вставляем:
<script type="text/javascript" src="../../JS/jquery-1.11.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(".ms-vb").each(function(){
var newtext=$(this).html().replace("&lt;","<").replace("&gt;",">").replace("&lt;","<").replace("&gt;",">").replace("&lt;","<").replace("&gt;",">");
$(this).html(newtext)
});
});
</script> 
 Каждый вариант ответа в опросе должен выглядеть следующим образом:
<a href="../../PublishingImages/Original/Patrioty/dementevich_anna.jpg" target="_blank"><img src="../../PublishingImages/Preview/Patrioty/dementevich_anna.jpg"></a>

При этом соответствующий jQuery должен лежать в папке «JS» в корне сайта (если будет другое место – необходимо поменять путь до файла во всех кусках кода) 

Разрешения доступа на сайт SharePoint через группы безопасности Active Diretory применяются не сразу

Если Вы используете доменные группы доступа к ресурсам SharePoint 2013, то наверняка заметили, что при добавлении пользователя в группу AD реально доступ к ресурсу появляется далеко не сразу. Может уйти очень много времени.
Эту ситуацию можно поправить, используя следующие команды:
$sts = Get-SPSecurityTokenServiceConfig
$sts.FormsTokenLifetime = (New-TimeSpan -minutes 10)
$sts.WindowsTokenLifetime = (New-TimeSpan -minutes 10)
$sts.LogonTokenCacheExpirationWindow = (New-TimeSpan -minutes 5)
$sts.Update()
iisreset

Не доступно изменение прав на элемент SharePoint 2013

Столкнулся с проблемой: после назначения уникальных прав на элемент списка невозможно просмотреть эти права и поправить их каким-либо образом:
Отсутствует кнопка "Дополнительно".
А должно быть так:
Данная проблема решается следующим способом:
1) Переходим в папку C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\LAYOUTS
2) В файле sharing.debug.js заменяем строку
cctx.load(listItem, 'ID', 'FileRef', 'FileLeafRef', 'Client_Title');
на
cctx.load(listItem, 'Title', 'ID', 'FileRef', 'FileLeafRef', 'Client_Title');
3) В sharing.js заменяем строку:
&&k.load(g,"ID","FileRef","FileLeafRef","Client_Title")
на
&&k.load(g,"Title", "ID","FileRef","FileLeafRef","Client_Title") 
 
 

понедельник, 16 марта 2015 г.

Кастомизация AccessDenied.aspx в SharePoint 2013

Для возможности подмены стандартной страницы "К сожалению у вас нет доступа к даному сайту" своей кастомизированной страницей, необходимо, чтобы обязательно стоял April 2014 CU.
Далее выполняем по пунктам следующее:
1) Создаем папку, к примеру CustomPages и свою собственную страницу в этой папке, которая будет отображаться пользователям, у которых не будет прав доступа к определенному ресурсу.
2) Копируем эту папку с файлом на каждой WFE сервер в папку:
C:\Program files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\
В итоге должно получиться следующее:
C:\Program files\Common Files\Microsoft Shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\CustomPages\CustomAccessDenied.aspx
3) В PowerShell выполняем команду по установке своей собственной страницы:
Set-SPCustomLayoutsPage -Identity AccessDenied -RelativePath /_layouts/15/custompages/CustomAccessDenied.aspx -WebApplication http://portalural
 4) Для просмотра установленных кастомных страниц можно воспользоваться следующей командой:
Get-SPCustomLayoutsPage –WebApplication "http://<web application URL>"
 В данном случае не требуется ни перезагрузки сервера, ни перезапуска IIS - все меняется "на лету"!

Скрытие полей списка с формы SharePoint

Для скрытия полей необходимо:

  1. В Sharepoint Designer добавить файлы jquery-1.11.1.js и spjs-utility.js (скачиваем последний релиз, использовал релиз v1.183).
  2. На форме, на которой надо скрыть поля, добавляем веб-часть «Редактор сценариев» из группы «Среда и контент». Расположить ее надо ниже веб-части с формой, поля которой скрываются.
  3. В текст редактора сценариев вставляем следующий код:
<script type="text/javascript" src="../../../../../JS/jquery-1.11.1.js"></script>
<script type="text/javascript" src="../../../../../JS/spjs-utility.js"></script>
<script type="text/javascript">
var fields = init_fields_v2();
var arrToShowForMembersInTheGroup = ['Status','Answer'];
$.each(fields,function(fin){
if($.inArray(fin,arrToShowForMembersInTheGroup)!=-1){
$(fields[fin]).hide();
}
else{
$(fields[fin]).show();
}
});
</script>
    4. В скрипте нужно откорректировать путь к файлам, а в переменной arrToShowForMembersInTheGroup вместо Status и Answer указать имена требуемых полей.

суббота, 7 марта 2015 г.

Новости на портале SharePoint

Передо мной встала задача отображать новости на корпоративном портале в удобном виде, чтобы можно было оставлять комментарии к каждой новости, ставить "лайки" и т.д.
В интернет есть масса статей на эту тему, в том числе использовать встроенный список "Извещения", но это не очень красиво и удобно. Поэтому пришлось изобрести нечто свое, собрав несколько идей воедино. И вот что получилось:

Создаем сайт типа "Блог".
Теперь нам надо добавить столбец для отображения краткого содержания статьи и столбец для отображения первоначальной картинки.
Идем в контент сайта, библиотеку нашего блога (Posts), открываем параметры списка,
добавляем столбец из существующих столбцов сайта. В поле "Выбрать столбцы сайта из" выбираем группу "Столбцы макета страниц".
Для краткого содержания статьи мы будем использовать столбец «Автор». Это однострочный текст ограниченной длины.
 
Для отображения первоначальной картинки используем столбец «Сводное изображение»
Изменим порядок столбцов:

Переименуем добавленные столбцы в соответствии с их назначением.

Теперь нам надо красиво вывести записи из блога на главной странице сайта в сокращенном виде и упорядочив их по убыванию даты публикации.
По умолчанию не получится отсортировать по дате публикации, т.к. данное поле несортируемое. Сделаем его сортируемым.
Заходим в ЦА >  Управление приложениями > Управление приложениями-службами (Manage Service Applications) > Приложение службы поиска (Search Service Application) Схема поиска (Search Schema)
Находим свойство "PublishedDateOWSDATE", заходим в него и делаем сортируемым:

После этого идем на страницу, на которой будем размещать сводку новостей (обычно, домашняя страница портала). Добавляем веб-часть «Недавно измененные элементы» из раздела «Контент на основе поиска». Открываем свойства веб-части.

В свойствах веб-части жмем кнопку «Изменить запрос». В открывшемся построителе запросов на закладке «Основы» в параметре «Ограничить приложением» устанавливаем «Указать URL-адрес» и ниже пишем путь к нашему списку (блогу) новостей. При этом в секции предварительного просмотра результатов поиска мы должны увидеть ссылки на наши записи в блоге.

Переходим на закладку «Проверка» и копируем в буфер обмена получившийся текст запроса.
path:"http://portal/news/Lists/Posts" (IsDocument:"True" OR contentclass:"STS_ListItem") 
Его нам надо будет вставить в другое место.
Закрываем построитель запроса «Отмена» и окно свойств веб-части «Отмена». Саму веб-часть оставим на странице – она нам пригодится в дальнейшем.

Далее идем на главный сайт портал, в его параметры, «Поиск» - «Источники результатов».

Добавляем новый источник результатов.

Нажимаем «Запустить построитель запросов».

На закладке «Основы» в поле «Текст запроса» вставляем из буфера обмена скопированный текст запроса. На закладке «Сортировка» настраиваем сортировку по дате публикации. Выбираем свойство «PublishedDateOWSDATE», по убыванию.

Сохраняем настройки запроса «ОК». Сохраняем свой источник результатов.
Возвращаемся на страницу размещения сводки новостей (домашнюю страницу).

Открываем страницу на изменение, ранее добавленную веб-часть «Недавно измененные элементы» пока оставляем нетронутой, а добавляем веб-часть «Результаты поиска» из раздела «Поиск». Переходим в свойства этой веб-части.

Нажимаем кнопку «Изменить запрос». В открывшемся построителе запросов на закладке «Основы» выбираем источник результатов, который мы создали ранее в параметрах сайта:
Закрываем с сохранением «ОК».
В свойствах этой веб-части необязательно, но желательно, изменить название на понятное. Например, так «Результаты поиска записей в новостном блоге».
Сохраняем изменения в свойствах веб-части «ОК». А саму веб-часть надо свернуть:

Мы ее свернули, т.к. пользователи не должны ее видеть. Она нам нужна для того, чтобы получить записи блога с сортировкой по дате публикации по убыванию. Результаты ее поиска мы будем использовать в другой веб-части – «Недавно измененные элементы». Открываем свойства этой веб-части.
В разделе «Параметры» в реквизите «Результаты запроса предоставлены» указываем нашу только что свернутую веб-часть с нашим измененным именем «Результаты поиска записей в новостном блоге»:

В разделе «Сопоставления свойств» ставим галочку «Измените сопоставление управляемых свойств для полей в шаблоне элемента отображения» и указываем в «Строка 2» дату публикации статьи «PublishedDateOWSDATE», а в «Строка 3» - краткое содержание статьи со странным именем «ArticleByLineOWSTEXT»:

В разделе «Вид» меняем название веб-части на «Новости компании», а «Тип хрома» - «Только заголовок»:

Сохраняем изменения в веб-части «ОК».

Получается примерно следующее:


Возвращаем страницу после извлечения, публикуем и получаем красоту:
Остальные доработки отображения можно провести с помощью изменения CSS.

Замечание: после добавления записи в блог, в сводке новостей она появится не сразу, а после того, как поисковый обходчик ее найдет. У нас на это требуется около 10 минут, т.к. настроен Непрерывный обход контента: