Показаны сообщения с ярлыком WorkFlow. Показать все сообщения
Показаны сообщения с ярлыком WorkFlow. Показать все сообщения

вторник, 30 июня 2015 г.

SharePoint. Как послать email используя JavaScript


У меня возникла необходимость послать email сообщение c формы элемента, сделав это асинхронно из JavaScript. В JSOM я не нашел такой возможности.

Способ № 1
Первое что пришло в голову - сделать на C# веб-часть, которая будет брать данные из url и отсылать почту, код выглядит достаточно коротким:

using (var oSite = new SPSite(SPContext.Current.Web.Url))
using (var oWeb = oSite.OpenWeb(SPContext.Current.Web.ServerRelativeUrl))
{
    string to, subject, body;
    to = Page.Request.QueryString["to"];
    subject = Page.Request.QueryString["subject"];
    body = Page.Request.QueryString["body"];
                
    var headers = new StringDictionary
        {
            {"to", to},
            {"subject", subject},
            {"content-type", "text/html"}
        };
        SPUtility.SendEmail(oWeb, headers, body);
}


Теперь нам необходимо вызвать серверной код GET запросом, код на JavaScript & jQuery будет выглядеть так:

// Отсылаем уведомление
function  SendMail(to, subject, body) {
    $.ajax({
        url: '/SitePages/SendMail.aspx',
        type: 'GET',
        data: { to: to, subject: subject, body: body },
        contentType: 'application/json; charset=utf-8',
        success: function  (response) {
            console.log("success send email to secretary");
        },
        error: function  () {
            console.log("error");
        }
    });
}


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

Способ № 2
Есть другой пусть. Как известно, мы можем слать письма используя рабочий процесс, так же мы знаем о возможности создавать элементы списка используя JSOM. Т.е. можем создать JavaScript'ом элемент списка, на создании которого запуститься рабочий процесс и отошлет письмо. Чтобы у рабочего процесса была информация куда, с какой темой и что слать - создадим соответствующие поля в списке. Наш элемент списка  должен  иметь 3 столбца:
  • Кому
  • Тема
  • Тело
Итак, у нас будет функция которая будет написана на JavaScript и использовать JSOM для создания элемента в списке:

// Создаем элемент списка
function CreateEmailListItem(emailListTitle, to, subject, body) {
    var clientContext = new SP.ClientContext.get_current();
    var oList = clientContext.get_web().get_lists().getByTitle(emailListTitle);
    var itemCreateInfo = new SP.ListItemCreationInformation();
    this.oListItem = oList.addItem(itemCreateInfo);

    oListItem.set_item('To', to);
    oListItem.set_item('Subject', subject);
    oListItem.set_item('Body', body);
    oListItem.update();
    clientContext.load(oListItem);

    clientContext.executeQueryAsync(function.createDelegate(this, this.onQuerySucceededEmailListItem), function.createDelegate(this, this.onQueryFailedEmailListItem));
}

function onQuerySucceededEmailListItem() {
    console.log('(Успех. Элемент списка создан.)Item created: ' + oListItem.get_id());
}

function onQueryFailedEmailListItem(sender, args) {
    console.log('Request failed. (Ошибка. Элемент списка не создан.)' + args.get_message() + '\n' + args.get_stackTrace());
}

После создания элемента будет срабатывать рабочий процесс отсылающий письмо. Для этого нам нужно одно действие рабочего процесса:



В редакторе необходимо настроить действие:


Для начала заполним отправителя:


Аналогично необходимо заполнить поля "Тема" и "Тело":


Теперь действие рабочего процесса заполнено:

 Необходимо опубликовать рабочий процесс и обязательно отметить пункт "Автоматически запускать рабочий процесс при создании элемента":
 Теперь попробуем вызвать нашу JavaScript функцию:

CreateEmailListItem('emailList', 'Ulmaskulov_ar@Borets.ru', 'subject', 'body')

После выполнения функции в списке можно увидеть созданный элемент:
После создания выполнится рабочий процесс и отправит письмо. Это решает проблему.

P. S. Не забудьте разобраться с правами на список, иначе пользователи смогут читать сообщения отправленные не им.
Рекомендую перейти в настройки списка: Параметры -> Дополнительные параметры -> Разрешения на уровне элементов -> Доступ на чтение и отметить "Чтение элементов, созданных пользователем". Выглядит это так:


Способ № 3
После публикации ссылки на пост в фейсбуке, в комментариях, мне подсказали еще один способ. Вероятно, это самый удобный из всех возможных. Спасибо Denis Molodtsov и Иван Горбадей.
Суть способа заключается в отправке запроса к SharePoint REST API.
Код выглядит так:

function SendEmail(from, to, body, subject) {
    var siteurl = _spPageContextInfo.webServerRelativeUrl;
    var urlTemplate = siteurl + "/_api/SP.Utilities.Utility.SendEmail";
    $.ajax({
        contentType: 'application/json',
        url: urlTemplate,
        type: "POST",
        data: JSON.stringify({
            'properties': {
                '__metadata': { 'type': 'SP.Utilities.EmailProperties' },
                'From': from,
                'To': { 'results': [to] },
                'Body': body,
                'Subject': subject
            }
        }
        ),
        headers: {
            "Accept": "application/json;odata=verbose",
            "content-type": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val()
        },
        success: function(data) {
            alert("Email sent");
        },
        error: function(err) {
            alert(err.responseText);
        }
    });
};

четверг, 30 апреля 2015 г.

SharePoint 2013 Workflow error. Exception details: System.FormatException: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).


В ходе выполнения рабочего процесса возникла ошибка:
RequestorId: f54a5d97-39ba-7d44-0000-000000000000. Details: An unhandled exception occurred during the execution of the workflow instance. Exception details: System.FormatException: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx). at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException) at System.Guid.TryParseGuidWithNoStyle(String guidString, GuidResult& result) at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result) at System.Guid.Parse(String input) at System.Activities.CodeActivity`1.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

Вот так выглядит на странице состояния рабочего процесса (wrkstat.aspx):


В своем рабочем процессе я создал свой тип контента на основе задачи рабочего процесса 2013 версии. Пользователь при выполнении задачи заполняет добавленное мною кастомное поле. После завершения задачи я пытаюсь использовать значение заполненного поля. В действии назначения задачи есть возможность сохранять GUID созданной задачи в переменную. Используя эту переменную (TaskId14 на картинке) в подстановке я могу получить значение моего кастомного поля "Примечание":

Ошибка, описанная в начале статьи, возникает в случае если Вы пробуете достать элемент задачи используя не GUID. Т.е. просто перепутали поле и вместо TaskId14, как в моем случае, используете любое другое значение, которое не является GUID.

среда, 25 марта 2015 г.

SharePoint 2013 Workflow error: HTTP 401 & HTTP 423

В моём решение я использовал рабочий процесс. Причем не встроенные 2010 версии, а новые, используя Workflow manager 1.0. После старта рабочего процесса возникала ошибка, в который в самом начале фигурирует:
HTTP 423 или HTTP Unauthorized
Так же может быть:
HTTP 401

Пример:



















Чаще всего встречалась ошибка:
RequestorId: 37edfcab-8717-2a41-0000-000000000000. Details: An unhandled exception occurred during the execution of the workflow instance. Exception details: System.ApplicationException: HTTP 401 {"Transfer-Encoding":["chunked"],"X-SharePointHealthScore":["0"],"SPClientServiceRequestDuration":["98"],"SPRequestGuid":["37edfcab-8717-2a41-9647-2cd739cfd2c0"],"request-id":["37edfcab-8717-2a41-9647-2cd739cfd2c0"],"X-FRAME-OPTIONS":["SAMEORIGIN"],"MicrosoftSharePointTeamServices":["15.0.0.4569"],"X-Content-Type-Options":["nosniff"],"X-MS-InvokeApp":["1; RequireReadOnly"],"Cache-Control":["max-age=0, private"],"Date":["Thu, 26 Feb 2015 08:47:18 GMT"],"Server":["Microsoft-IIS\/8.5"],"WWW-Authenticate":["NTLM"],"X-AspNet-Version":["4.0.30319"],"X-Powered-By":["ASP.NET"]} at Microsoft.Activities.Hosting.Runtime.Subroutine.SubroutineChild.Execute(CodeActivityContext context) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)


Дело в том, что если Вы используете Workflow manager 1.0, то для работы со списком списком истории рабочего процесса будут использоваться права инициатора рабочего процесса. И у инициатора может быть недостаточно прав для работы с этим списком. Имейте это в виду.
Для решение проблемы необходимо повысить права пользователя на список истории рабочего процесса до уровня разрешений  "Совместная работа", сам список скрытый. Можно использовать SharePoint manager 2013, с его помощью поменять свойство списка "hidden" на false. Список появится в веб-интерфейсе и с ним можно будет работать как с обычным списком:



Теперь можно назначить необходимые права для пользователя.
Но есть способ несколько проще. Для этого достаточно использовать Microsoft SharePoint Designer. Откройте Ваш сайт, слева выберите пункт "Все файлы", если подвиснет на этапе "Создание отчёта" - обновите контент. Это баг с 2010 версии еще остался.

В основном окне выберите папку "Lists", потом "Workflow History", правый клик и выбрать свойства:
Потом на ленте выбрать "Веб-страница администрирования":

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

среда, 18 марта 2015 г.

SharePoint 2013. Workflow error: System.ArgumentException: ContentTypeId at Microsoft.Activities.Hosting.Runtime.Subroutine.SubroutineChild...

Рабочий процесс перешел в состояние Приостановлено.

Так же выдает ошибку:
Details: An unhandled exception occurred during the execution of the workflow instance. Exception details: System.ArgumentException: ContentTypeId at Microsoft.Activities.Hosting.Runtime.Subroutine.SubroutineChild.Execute(CodeActivityContext context) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)



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

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

пятница, 30 января 2015 г.

Sharepoint designer. Рабочий процесс не обновляется после публикации

Создавая рабочий процесс для SharePoint 2010 и используя SharePoint Designer 2010 я столкнулся с проблемой, новый процесс не начинал работать с новой логикой. Причем ошибка появилась после решения такой ошибки.
SharePoint "видел", что процесс именно новый, т.к. к отработанным в прошлом добавлялось время публикации, в скобках. Но работать продолжал по старой логике.
Как выяснилось, причина на стороне клиента, а именно в SharePoint Designer. Причем ошибка появилась в 2010 и 2013 версиях.
Что бы побороть проблему надо почистить кэш, для этого необходимо удалить все данные по следующим путям:

%USERPROFILE%\AppData\Local\Microsoft\WebsiteCache
%APPDATA%\Microsoft\Web Server Extensions\Cache

Для SharePoint Designer 2010 еще надо сделать несколько движений:
Файл->Параметры->Общие->Кэшировать данные сайта во время сеансов в SharePoint Designer(Снять галочку)

Это решило проблему.

SharePoint 2010 Ошибка при публикации рабочего процесса


При попытке публикации очень большого рабочего процесса, я получил ошибку на этапе валидации (Validating the workflow):
Errors were found when compiling the workflow. The workflow files were saved but cannot be run:

В подробностях написано:
Unexpected error on server associating the workflow

В общем не особо говорящая ошибка, но все же ясно что проблема на сервере.
Я пробовал обновить сервер, но это так же не помогло.

Решением стало выполнение этого PowerShell скрипта:

$application = get-spwebapplication http://portal
$application .UserDefinedWorkflowMaximumComplexity = 10000
$application .Update()

SharePoint Ошибка рабочего процесса: An IfElseActivity must have at least...


Сделав совсем маленький рабочий процесс я попытался опубликовать его.
Ферма 2013 версии, а рабочий процесс 2010.
Часть процесса, из-за которой возникла ошибка выглядит так:

Публикация рабочего процесса прошла неудачно:


Текст ошибки:
При компиляции рабочего процесса были обнаружены ошибки. Файлы рабочего процесса сохранены, но не могут быть выполнены.
Дополнительно:
(0,0) Activity 'ID38' validation failed: An ifElseActivity must have at least one child of type ifElseBranchActivity.)

Пытаясь найти решение, я обнаружил невидимый элемент, который все же можно сделать доступным для просмотра, если выполнить клик по нему:

Каким именно образом мне удалось сотворить такое "Действие рабочего процесса" мне не удалось выяснить. После его удаления процесс нормально опубликовался.

четверг, 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


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

пятница, 6 июня 2014 г.

Как возвращаться на форму элемента после старта рабочего процесса

После старта рабочего процесса из формы элемента - Вас вернет на представление списка.
Поменять такое поведение можно, если добавить немного JavaScript кода на страницу с представлением списка. Код будет читать referrer, брать ID и делать редирект на форму элемента списка. В нашем случае на форму просмотра. При это важно, что бы код отработал только если Вы перешли на страницу после старта рабочего процесса. Это мы сможем понять по присутствию "Workflow.aspx" в referrer.

Код выглядит так:
// Функция позволяет взять параметр из referrer
function getParameterByName(name, url) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(url);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

// Получаем referrer
var ref = document.referrer
// Получаем ID из referrer
var ID = getParameterByName("ID", ref)
if (ref.indexOf("Workflow.aspx") > -1){
// Делаем редирект
    window.location = "/office/Lists/Contractors/DispForm.aspx?ID=" + ID
}

Теперь надо добавить это все в представление списка, воспользуемся SharePoint Designer 2013:
В моем случая я имею только одно представление, откроем его в расширенном режиме и добавим код, как на картинке:
Сохраните изменение и проверьте работу.

пятница, 23 мая 2014 г.

Рабочие процессы SharePoint 2013 шаблон "Пустой сайт"

У шаблона "Пустой сайт" есть серьёзное ограничение. В нем не будут работать рабочие процессы версии 2013:


Я попробовал активировать некоторые возможности сайта


  • Тип контента задачи рабочего процесса
  • Рабочие процессы могут использовать разрешения приложения
Не помогло. Потом я пробовал включить все остальные возможности. При это без активации каких то фич на уровне коллекции сайтов, т.к. на других узлах все работало. Выяснилось, что необходимо активировать фичу, это возможно через PowerShell. Попробуем выполнить команду PowerShell:

Get-SPFeature | Where-Object {($_.Scope -eq 'Web') -and ($_.CompatibilityLevel -eq '15') -and ($_.DisplayName -like '*Work*')}


В этом списке нас интересует фича WorkflowServiceStore, давайте ее активируем:

Enable-SPFeature -Identity WorkflowServiceStore -Url http://urlOfBlankSite

Пробуем и видим, что появилась возможность создавать рабочие процессы версии 2013:


вторник, 20 мая 2014 г.

Установка Workflow manager 1.0 для SharePoint 2013 на отдельной машине вне фермы.

Про обновление рабочих процессов в SharePoint 2013 написано достаточно много. Если кратко, то они обросли циклами, стадиями. Создать форму в InfoPath для задач нельзя. Создать задачу без отправки письма нельзя. И теперь надо производить отдельную настройку фермы Workflow manager. При этом, сразу же после установки SharePoint, Вы можете использовать рабочие процессы в режиме 2010 версии.
Если пробовать создать процесс через SharePoint Designer 2013, то Вы увидите следующее:
Будем настраивать. В нашем сценарии ферма Workflow manager будет работать на отдельной машине, в том же домене, но она не будет частью SharePoint фермы. Сразу поясню - Workflow manager тоже ферма, в которую можно добавлять машины. SharePoint ферма будет подключаться к ферме Workflow manager. В общем то Microsoft решил выделить эту часть SharePoint и действовать по той же схеме, что и с Office WebApps.
Архитектурно все выглядит следующим образом:
HOSTA - SharePoint Web Front End
HOSTB - SharePoint Application
HOSTC - Workflow manager farm
HOSTSQL - SharePoint Backend\Workflow manager DB

Т.е. на том же экземпляре, что мы используем для фермы SharePoint, будут и базы Workflow Manager.
Для установки Workflow manager на HOSTB можно использовать Web platform installer.
Выбирайте в списке WorkFlow manager 1.0. Что бы все заработало на Windows Server 2012 R2 необходимо обязательно обновиться до CU2. Так же надо установить CU1 для Service Bus.
CU1 для Service Bus через Web platform installer у меня не ставиться. Использовал оффлайн пакет.




Теперь необходимо выполнить обновления. Хотя это можно сделать и после конфигурирования фермы Workflow manager. После установки каждого обновления - перезагружайте сервер, иначе следующее может не поставиться.



Теперь приступаем к конфигурированию фермы Workflow manager. Перед нами появится окно, выбирайте средний пункт:
Этот пункт нужно выбирать обязательно. В противном случае у нас не будет выбора какую группу назначить администраторами. Т.е. будет назначена группа BUILTIN\Administrators. Скорее все это приведет к ошибке 403 (Forbidden). Ее воспроизвести можно если попытаться зайти на одно из веб-приложений созданных Workflow managers. На картинке ниже их 2. Для http и https соответственно. Что бы было и для http - необходимо ставить отдельную галку. Итак:
Если перейти по HOSTC, то увидим:

Пробуем с правами администратора:
И все получиться. Мы увидим:
Но пока параметр WorkflowAdminGroupName равен BUILTIN\Administrators - подключиться удаленно скорее всего не получится. Обновить это значение через PowerShell мне не удалось. Где то в базе можно поправить или в конфиге. Мы же не будем выбирать стандартный тип установки, а воспользуемся расширенным. В нем же нужно будет задать установки для Service Bus. Все настройки достаточно тривиальные.
Кроме этого:
Замените как на следующем снимке:
Т.е. исключение составляет Configure Admin Group, создайте группу в AD, ее же вписывайте в настройках. Поместите в эту группу Вашу учётную запись для фермы Workflow manager.
После окончания настройки необходимо подключить ферму SharePoint к Workflow manager. Перед этим обновите на всех машинах в ферме SharePoint Workflow client. Его так же можно найти в Web platform installer. Теперь необходимо открыть консоль PowerShell с подключенными оснастками SharePoint на любом сервере SharePoint и выполнить PowerShell скрипт:
Register-SPWorkflowService –SPSite "http://www.HOSTA" –WorkflowHostUri "http://HOSTC:12291" –AllowOAuthHttp -Force -Scope "SharePoint"

Теперь при создании рабочего процесса у нас должен быть диалог как на снимке:


Работоспособность можно проверить если перейти в Центр администрирования -> Управление приложениями-службами -> Прокси нашего Workflow service applocation:


Позже, при увеличении нагрузки, Вы можете добавить еще несколько компьютеров к ферме Workflow manager.




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

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

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

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

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

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




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



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


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

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


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