Настраиваемое действие SharePoint 2016 для запуска рабочего процесса - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать пользовательское действие, которое можно выбрать, щелкнув правой кнопкой мыши файл в любой папке определенной библиотеки SharePoint. Это пользовательское действие будет копировать файл в ту же папку, в которой имя пользователя будет добавлено в конец имени файла.

В настоящее время у меня есть приемник событий, который будет выполнять настраиваемое действие при обновлении файла, но не тогда, когда я хочу, чтобы это произошло. Мне удалось добавить пользовательское действие в контекстное меню файла с помощью SharePoint Designer, но SharePoint Designer позволяет только настраиваемому действию запускать специальные рабочие процессы, совместимые с SharePoint 2010, или загружать веб-страницу. Мне нужно сделать так, чтобы обработчик событий (или, возможно, рабочий процесс) срабатывал, когда пользователь выбирает настраиваемое действие после щелчка правой кнопкой мыши по файлу. Я не уверен, какой подход или какой проект или приложение мне нужно создать в Visual Studio 2017, чтобы получить эту функциональность.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Я нашел способ сделать это с помощью JavaScript, без SharePoint Designer. Я поместил следующий скрипт в веб-часть «Редактор контента» на странице, где находится веб-часть списка, и теперь я могу щелкнуть правой кнопкой мыши файл и получить опцию «Получить мою копию». Если у вас есть подпапка Комментарии, переименованная копия будет помещена туда.

<script type="text/javascript">

// adds the menu option to Get My Copy
function Custom_AddDocLibMenuItems(m, ctx)
{
    var strDisplayText = "Get My Copy";                  //Menu Item Text
    var strAction = "copyFile()"; 
    var strImagePath = "";                               //Menu item Image path
    CAMOpt(m, strDisplayText, strAction, strImagePath);  // Add our new menu item
    CAMSep(m);                                           // add a separator to the menu
    return false;                                        // false means standard menu items should also be rendered
}

// append current user account to filename and copy to subfolder named Comments 
function copyFile()
{
    // get web and current user from context
    var context = new SP.ClientContext.get_current();
    var web = context.get_web();
    this.currentUser = web.get_currentUser();
    context.load(currentUser);

    // load the folder
    var currentFolder = decodeURIComponent(ctx.rootFolder);
    var folderSrc = web.getFolderByServerRelativeUrl(currentFolder); 
    context.load(folderSrc,'Files');

    context.executeQueryAsync(
        function() {            
            // get the first (and hopefully only) file in the folder
            var files = folderSrc.get_files();
            var e = files.getEnumerator();
            e.moveNext()    
            var file = e.get_current();

            // get user account
            var curUserAcct = currentUser.get_loginName();
            curUserAcct = curUserAcct.substring(curUserAcct.indexOf("\\") + 1); 

            // get file without extension
            var file_with_ext = file.get_name();            
            var name_without_ext = file_with_ext.substr(0, file_with_ext.lastIndexOf("."));

            var destLibUrl = currentFolder + "/Comments/" + name_without_ext + " " + curUserAcct + ".docx";     
            file.copyTo(destLibUrl, true);

            context.executeQueryAsync(
                function() { alert("Success! File File successfully copied to: " + destLibUrl); }, 
                function(sender, args) { alert("error: " + args.get_message()) }
            );
        }, 
        function(sender, args){ alert("Something went wrong with getting current user or getting current folder '" + currentFolder + "'. " + args.get_message()); }
    );
}

</script>
0 голосов
/ 27 апреля 2018

Ваше пользовательское действие должно вызвать javascript function или выполнить GET request для вашего хоста SharePoint WCF или ASMX WebService.

  • ASMX

Официальное руководство по MSDN: создание пользовательской веб-службы ASP.NET

Для получения дополнительных ресурсов с большим количеством скриншотов проверьте это сообщение в блоге: Пошаговое руководство. Создание настраиваемой веб-службы ASP.NET (ASMX) в SharePoint 2010

  • WCF

Официальное руководство Technet: SharePoint 2013: создание пользовательской службы REST WCF, размещенной в SharePoint и развернутой в WSP

Примечание : с GET request вам потребуется web.AllowUnsafeUpdate = true

С javascript вам нужно AJAX позвонить, т.е. jQuery.ajax ()

/ редактировать

Чтобы подключить веб-службу и ваше настраиваемое действие, используйте SharePoint Desinger, удалите или измените существующее настраиваемое действие, измените тип на Navigate to URL и введите в текстовом поле:

javascript: (function() { console.log('Testing...' + {ItemId}); /* your web service call */ })();

Используйте псевдоним {ItemId} для передачи правильного идентификатора элемента вашему вызову AJAX.

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

public void StartWorkflow(SPListItem listItem, SPSite spSite, string wfName)  {
    SPList parentList = listItem.ParentList;
    SPWorkflowAssociationCollection associationCollection = parentList.WorkflowAssociations;
    foreach (SPWorkflowAssociation association in associationCollection)  {
      if (association.Name == wfName){
       association.AutoStartChange = true;
       association.AutoStartCreate = false;
       association.AssociationData = string.Empty;
       spSite.WorkflowManager.StartWorkflow(listItem, association,  association.AssociationData);
       }
     }
}
...