четверг, 28 августа 2014 г.

SharePoint 2013. ClientPeoplePicker & Custom forms

Многие уже знают, что в SharePoint 2013 появился новый замечательный элемент управления для работы с данными типа "Пользователь". Выглядит он так:
И именно этот элемент управления, с возможность предлагать возможные значения, отображается во всех формах элементов списка по умолчанию. И это очень хорошо.
Проблемы возникают когда Вы создаете новую форму.
Напомню, что в формах по умолчанию, за генерацию полей отвечает ListFormWebPart. Но если Вы создаете новую форму, то функцию генерации html полей на себя берет DataFormWebPart. При этом каждое отдельное поле генерируется элементом управления FormField. Кастомизировать форму становиться намного легче. Но при этом вместо нового ClientPeoplePicker мы видим старый контрол, без автокомплита и с кнопками проверки пользователя и кнопки для открытия всплывающего окна для поиска пользователя:
Как я уже упомянул, каждое поле генерируется SharePoint:FormField. Я пытался найти возможность "попросить" его вывести именно новый ClientPeoplePicker, но тщетно.
Мы сами можем добавить новый контрол на страницу, для этого добавим на форму такой код:


После этого у нас появится прекрасно работающий ClientPeoplePicker. Вот только нужно его привязать к полю и делать это нужно самому. Я сделал это спрятав основной контрол, который без автокомплита, но только спрятал, с самой формы не убирал. Дальше, используя JavaScript, в методе PreSaveAction() перед сохранением формы брал данные из ClientPeoplePicker и вставлял их в старый PeoplePicker. Что бы мне было удобно работать, я использовал библиотеку SPSservices.
// Заполняем поля в PeoplePicker
var arrUserField = [];
$("#UserFieldCPP_TopSpan span span span[class='ms-entity-resolved']").each(function(index, elem){
    arrUserField.push($(this).text());
});
var strUserField = arrUserField.join(";");

$().SPServices.SPFindPeoplePicker({
 peoplePickerDisplayName: "Сотрудник",
 valueToSet: strUserField ,
 checkNames: true
});
Т.е. перед сохранение формы данные из ClientPeoplePicker копируются в обычный PeoplePicker.
Приведенный код подходит для формы создания элемента, для формы редактирования нам нужно из обычного PeoplePicker'а скопировать в ClientPeoplePicker. Используйте этот код:

// Заполняем поля в ClientPeoplePicker
var UserFieldPP = $().SPServices.SPFindPeoplePicker({
 peoplePickerDisplayName: "Сотрудник" 
});

var UserFieldPPPeopleList = UserFieldPP.currentValue.split(";");
UserFieldPPPeopleList.pop(); 
var picker = SPClientPeoplePicker.SPClientPeoplePickerDict["UserFieldCPP_TopSpan"]

for (i = 0; i < UserFieldPPPeopleList.length; i++) { 
    var name = UserFieldPPPeopleList[i];
 $("#UserFieldCPP_TopSpan_EditorInput").val(name);
 picker.AddUnresolvedUserFromEditor(true)
}
Теперь кастомные формы могут иметь ClientPeoplePicker привязанный к полю в списке.
Код работает в т.ч. для множественных значений. Так же, что бы приведенный выше код работал, ID у ClientPeoplePicker должно быть "UserFieldCPP".

воскресенье, 24 августа 2014 г.

SharePoint 2013. Тип поля "Связанные элементы"

В списке задач у нас есть замечательная возможность добавить связанные с задачей файлы:

Рабочий процесс автоматически делает элемент, вокруг которого идет рабочий процесс, связанным элементов задачи.
Процесс добавления связанного элемента(ов) выглядит это так:

Т.е. обычный диалог выбора файла из SharePoint.
После добавления:
При попытке добавить такое же поле в свой настраиваемый список - я его не нашел.
Используя SharePoint Manager 2013 я посмотрел какие есть поля у коллекции сайтов и нашел среди них "Связанные элементы":

Сделаем как на картинке - переименуем из "_Hidden" в "Related Items".
Теперь мы сможем добавить поле "Связанные элементы" к нашему списку:
Все отлично. Теперь можно использовать!

Но есть нюанс с его удалением. Я так его и не смог удалить. Удалить его через веб-интерфейс нельзя. Через SharePoint Designer тоже:

Если определить его обратно в группу столбцов "_Hidden", это так же не поможет. Сделать его невидимым на форме через его свойства, поменяв "ShowInDisplayForm" на "False" не вышло:


Удалить через SharePoint Manager 2013:



Не вышло... Поскольку это поле отображается только на форме просмотра, я решил что-то с формой сделать. Для начала создал новую форму просмотра и заметил что теперь поле отображает только общее количество связанных элементов. Но просмотреть их или добавить нельзя:
 Дальше, используя SharePoint Designer 2013, я посмотрел код формы и добавил стиль, что бы спрятать столбец:
 
Теперь поля нет.

UPD:
Есть более расширенный и ранее написанный пост, ознакомитесь.











суббота, 23 августа 2014 г.

SharePoint 2013. Предпросмотр PDF в поиске

В поиске SharePoint 2013 есть возможность предпросмотра некоторых типов документов, например Word. Так же поиск может искать по содержимому PDF, но не показывает содержимое в панели предпросмотра:


Это можно исправить. Изначально возможность показывать содержимое есть, но не включена. Ее надо включить и мы сейчас попытаемся это сделать. Для начала обновите ферму до Service Pack 1. Теперь перейдите в Параметры сайта -> Управление типами результатов:

Вы увидите множество типов результатов, в том числе и PDF. Найдите "Элемент Word" и скопируйте его:

 Появиться диалог создания, но уже частично заполненный. Теперь надо поменять имя и тип контента. Сделайте как на картинке:
Отлично, теперь попробуйте посмотреть как выглядит предпросмотр документа PDF:
Все прекрасно отображается. Правда отображается значок Word. Что бы его поменять на pdf - необходимо создать свой Hover Display Template.

четверг, 7 августа 2014 г.

SharePoint 2013. Windows Workflow Foundation, part of .Net Framework 3.0, must be installed to use this feature

При попытке отредактировать созданный ранее рабочий процесс в SharePoint Designer 2013 на ферме SharePoint Server 2013 с установленным Workflow manager 1.0 возникла ошибка:
[Ру] Не удалось загрузить этот рабочий процесс. Чтобы устранить эту проблему.
[En] Failed to load this workflow. To correct this problem, restart SharePoint Designer.

Потом другая ошибка:
[Ру] Для использования этой возможности необходимо установить Windows Workflow Foundation (входит в состав .Net Framework 3.0).[En] Windows Workflow Foundation, part of the .NET Framework 3.0, must be installed to use this feature.

Для начала я попробовал очистить кэш SharePoint Designer 2013, для этого надо удалить все по этим путям в файловой системе на клиенте:
%APPDATA%\Microsoft\Web Server Extensions\Cache
%APPDATA%\Microsoft\SharePoint Designer\ProxyAssemblyCache
%USERPROFILE%\AppData\Local\Microsoft\WebsiteCache

Если это не помогло, то необходимо выполнить все обновления SharePoint Designer 2013.
Если и это не помогло, то попробуйте выполнить редактирование с другого компьютера.
Мне это тоже не помогло. 
Позже, пытаясь найти решение в сети, я наткнулся на сообщение господина John Scott.
Суть его сообщения в том, что если описанные выше решения не сработали, то это известная ошибка, надо ждать исправление от Microsoft. И еще John Scott выявил, какие действия приводят к поломке, описав их в этом сообщении.
После прочтения этих сообщений я был глубоко обеспокоен необходимость снова сделать огромнейший рабочий процесс. Позже я посмотрел дату сообщения John Scott - ON 4/30/2014 9:00 PM. Почти 3 месяца прошло. Потом я проверил статус обновления фермы, с которой работал - Service Pack 1. Я обновил ферму используя June 2014 CU for SharePoint 2013


И это помогло. При этом я точно не установил какое именно обновление исправляет ошибку.

Ошибка при обновлении SharePoint. System.ServiceModel.EndpointNotFoundException

При обновлении SharePoint 2013 фермы у меня появилась ошибка:
Создано исключение типа System.ServiceModel.EndpointNotFoundException. Дополнительные сведения об исключении: Прослушивание на http://localhost:32843/SecurityTokenServiceApplication/securitytoken.svc не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием  SOAP. Подробнее см. в описании InnerException (если имеется).

Для начала исключаем проблемы из-за LoopbackCheck,  исполняем из PowerShel:
New-ItemProperty HKLM:\System\CurrentControlSet\Control\Lsa -Name "DisableLoopbackCheck" -value "1" -PropertyType dword


Подробнее про LoopbackCheck можно почитать здесь.

В моём случае отключение LoopbackCheck  не помогло, ошибка осталась.
В IIS manager я заметил, что все сайты отключены, а пулы работают.
При попытке включить сайты я получил ошибку:

Служба веб-публикаций (W3SVC) остановлена. Запуск веб-сайтов невозможен без службы публикации (W3SVC).

Я запустил службу и снова начал процесс обновления. Получил снова ошибку. Сайты опять выключены, как и служба W3SVC.
Служба PSCONFIG после 2 и 4 шага пытается перезагрузить W3SVC. Она выключается и самостоятельно не включается. Я включал службу самостоятельно после 2 и 4 шага. Процесс завершился удачно. Так же порой SharePoint 2013 Products Configuration Wizard "виснет", перестает потреблять процессорное время, просто ждем.


SharePoint 2013. Microsoft.SharePoint.Administration.SPUpdatedConcurrency Exception'

При обновлении SharePoint 2013 фермы у меня появилась ошибка:
Создано исключение типа Microsoft.SharePoint.Administration.SPUpdatedConcurrency
Exception. Дополнительные сведения об исключении: Возник конфликт обновлений, де
йствие необходимо повторить. Объект SPUpgradeSession Name=Upgrade-20140723-16302
8-3 был обновлен пользователем Domain\User в рамках процесса PSCONFIG (3920
) на компьютере PCNAME. Дополнительные сведения о конфликте см. в журнале трассиров
ки.

В моём случае я просто запустил процесс обновления снова и ошибка пропала.