среда, 30 апреля 2014 г.

Спам фильтр Outlook.com

У меня возник вопрос и я его отправил в службу поддержки MVA.
Мне пришел ответ:


Письмо было помечено: Будьте осторожны. Этот отправитель не прошел нашу проверку и, возможно, является мошенником.Обратите внимание на отправителя. Домен microsoft.

вторник, 29 апреля 2014 г.

Отправить ссылку на элемент из рабочего процесса

В ходе выполнения рабочего процесса может возникнуть необходимость уведомить определенного пользователя о необходимости изменить поля в элементе списка.
Для уведомления можно использовать электронную почту.

Сформировать письмо и отправить пользователю ссылку:

К сожалению, если использовать способ как картинке выше, то мы получим следующую ссылку:
http://server/Lists/ListName/81_.000

Где 81 - это Id текущего элемента. Такая ссылка на элемент работать не будет.
Что бы создать рабочую ссылку нужно использовать встроенный в SharePoint Designer 2013 построитель строк и сформировать такое:
[%Контекст рабочего процесса:URL адрес текущего сайта %]/Lists/listname/Dispform.aspx?ID=[%Текущий элемент:ID%]




Для этого получаем URL текущего сайта:



И Id текущего элемента:


Теперь у нас есть рабочая ссылка на элемент.

Стоить отметить, что в приведенном примере мы указываем ссылку на форму просмотра.
У нас остается возможность формировать ссылку сразу на форму изменения элемента.


UPD:
Можно использовать контекст рабочего процесса и получить ссылку на документ:
Но при этом нельзя будет сформировать ссылку сразу на форму редактирования.
Создается ссылка на форму просмотра, чего почти всегда достаточно.




понедельник, 28 апреля 2014 г.

Как сменить отображаемое имя поля Id

Порой заказчик просит добавить поле, которое будет уникальным и увеличиваться на 1 для каждого нового элемента. Писать свой custom field type не имеет смысла, т.к. этим требованиям полностью удовлетворяет поле Id. Его же часто просят переименовать. Что невозможно.
Но заказчик требует что-то вроде этого:

Для того, что бы это реализовать необходимо создать ново поле с типом Integer(Целое) и добавить его в представление:


Потом создаем рабочий процесс списка, который после добавления присвоит значение поля 'Id' полю 'Номер':


Нужно отметить, что поле не сразу будет заполнено после добавления. Необходимо некоторое время, что бы Ваш рабочий процесс отработал.


Показать поле "Создан" на форме элемента

Некоторые поля, например 'Id' или 'Создано' ('Created') невозможно отображать изначально на формах. В SharePoint Designer они в списке столбцов не отображаются. Заказчик просит изобразить на форме примерно следующее:


Для этого необходимо создать новую форму и добавить в нужное Вам место следующий серверный элемент SharePoint:


В итоге у нас получится примерно следующее:
Не очень красиво, необходимо сменить формат даты. Что бы было еще и на нашем языке.
Для этого мы с Вами попробует библиотеку momentjs.com

Для этого ее надо скачать и подключить к странице. Что бы мы могли отобразить время на нашем языке - качать необходимо moment-with-langs.min.js
Теперь получаем дату в старом формате, меняем и вставляем обратно в страницу.
Что бы пользователь не видел сам процесс обработки - прячем контейнер со старой датой:

<tr>
    <td colspan="2">
        <h1>
            Заявка создана:
            <span id="DateCreationLabel" style="color:navy;display:none">
                <SharePoint:ListItemProperty Property="Created" ID="CreatedDateField" runat="server" />
            </span>
        </h1>
    </td>
</tr>

Над html выше - выполняем JS ниже:

var date = $('#DateCreationLabel').text();
    if (moment(date).isValid()) {
        moment.lang('ru');
        date = moment(date).format('LL');
        $('#DateCreationLabel').text(date);
    }
    $('#DateCreationLabel').show();
После выполнения кода видим следующее:
Вполне приемлемо.

Tabs in SharePoint form

Опишу краткий пример как добавить функционал jQuery UI к формам SharePoint на примере табов.
Каких то особых изменений при добавлении на обычную страницу не имеется.
Создайте новую форму просмотра.
Добавьте на нее html перед таблицей с полями:
<div id="tabs">
    <ul>
        <li><a href="#FieldGroup1">Поле 1 и 2</a></li>
        <li><a href="#FieldGroup2">Поле 3 и 4</a></li>    
    </ul>
    <div id="FieldGroup1"></div>     
    <div id="FieldGroup2"></div>
</div>

Потом сделайте ссылки на необходимые файлы В нашем случае это сама библиотека jQuery, библиотека jQuery UI и на CSS:
<script type="text/javascript" src="/ScriptLibrary/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="/ScriptLibrary/jquery-ui-1.10.4.min.js"></script>
<link href="/ScriptLibrary/jquery-ui-1.10.4.min.css" rel="stylesheet">
<script type="text/javascript">
function myOnload(){
    $('#tabs').tabs();
}
_spBodyOnLoadFunctionNames.push("myOnload");
</script>

Как результат Вы увидите табы. Теперь необходимо в них добавить поля. Представим что в нашем списке 2 поля: Title; Title2. Добавьте в div c id="FieldGroup1" html:
<div id="FieldGroup1">
<table border="0" cellspacing="0" width="100%">    
 <tr>
  <td width="190px" valign="top" class="ms-formlabel">
   <H3 class="ms-standardheader">
    <nobr>Title<span class="ms-formvalidation"> *</span>
    </nobr>
   </H3>
  </td>
  <td width="400px" valign="top" class="ms-formbody">
   <SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}"/>
   <SharePoint:FieldDescription runat="server" id="ff1description{$Pos}" FieldName="Title" ControlMode="New"/>
  </td>
 </tr>
</table>

а в div c id="FieldGroup2" html:
<div id="FieldGroup2">
<table border="0" cellspacing="0" width="100%">    
 <tr>
  <td width="190px" valign="top" class="ms-formlabel">
   <H3 class="ms-standardheader">
    <nobr>Title2<span class="ms-formvalidation"> *</span>
    </nobr>
   </H3>
  </td>
  <td width="400px" valign="top" class="ms-formbody">
   <SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title2" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title2')}"/>
   <SharePoint:FieldDescription runat="server" id="ff1description{$Pos}" FieldName="Title2" ControlMode="New"/>
  </td>
 </tr>
</table>

Для скриншотов я использовал вариант с 4 столбцами: Title,Title2,Title3,Title4.
Все нажатия кнопки "сохранить" все данные удачно попадают в список.

Должен Вас заранее предупредить, что Вам придется самим реализовать механизм, который будет подсвечивать вкладки, в которых имеются незаполненные, но обязательные к заполнению поля. В противном случае пользователь подумает что форма сломалась.

InfoPath умер. Редактирование форм. Замена и аналоги.

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

Как можно редактировать формы сейчас? Ниже перечислены основные способы:

  1. JavaScript
  2. Nintex Forms
  3. SPForm
  4. K2
Есть и менее популярные решения, например pistachio.

П. 2 разработан нашими соотечественниками.
Все платные, кроме п. 1, он же и самый трудоемкий.
При самостоятельном редактировании форм, используя JavaScript, помимо привычного jQuery есть крайне полезная библиотека SPServices.

Редактирование JS для SharePoint

JSOM становиться все популярнее. Разработчиков SharePoint все плотнее толкают в сторону клиентской разработки. Так же появился CSR и TypeScript c полезными дополнениями. И несмотря на явное сопротивление, я все же начинаю все активнее писать JavaScript код. Создав несколько решений используя JavaScript, вместо Custom field type, удалось получить небольшой опыт удачного использования окружения и инструментов. Главный вывод который я сделал - не использовать для редактирования JS кода SharePoint Designer 2013.
Необходимо делать ссылку на файл c JS кодом, а сам файл класть в библиотеку. Подключать по WebDav к проводнику. Включить версионность в библиотеке со скриптами. Дальше Вы можете редактировать код в Visual Studio или Webstorm:


Для JS рекомендую использовать webstorm. Он не много стоит.