Есть определенный список в Sharepoint, в нем сделан рабочий процесс, который запускается при создании элемента.
Появилась необходимость создавать новый элемент списка на основании уже существующего элемента, с переносом части данных в создаваемый элемент, последующим заполнением остальных полей и запуском РП по сохранению.
На основе РП это сделать нельзя, так как будет создан элемент с заполненными полями и уже сохранен в списке. Далее пользователю нужно будет открыть этот новый элемент добавить поля и заново сохранить, а в силу логики данного списка РП должен работать, только при создании элемента.
Решение следующее:
-
- Копируем NewForm.aspx данного списка в NewFormCopy.aspx
- В дополнительных действиях добавляем меню с именем “Копировать” и типом действия “Перейти к URL-адресу” /Lists/List1/NewFormCopy.aspx?ID={ItemId}
- Далее в NewFormCopy.aspx, после <asp:Content ContentPlaceHolderId=”PlaceHolderMain” runat=”server”> добавляем код который-
- Из строке URL вытащит наш ID элемента из которого мы хотим скопировать часть данных.
- Через AJAX выполнит REST запрос и получит данные нашего элемента.
- Запишет в нужные поля данные из соответствующих поле копируемого элемента.
function getQueryString() { var key = false, res = {}, itm = null; // get the query string without the ? var qs = location.search.substring(1); // check for the key as an argument if (arguments.length > 0 && arguments[0].length > 1) key = arguments[0]; // make a regex pattern to grab key/value var pattern = /([^&=]+)=([^&]*)/g; // loop the items in the query string, either // find a match to the argument, or build an object // with key/value pairs while (itm = pattern.exec(qs)) { if (key !== false && decodeURIComponent(itm[1]) === key) return decodeURIComponent(itm[2]); else if (key === false) res[decodeURIComponent(itm[1])] = decodeURIComponent(itm[2]); } return key === false ? res : null; } $( document ).ready(function() { var id = getQueryString('ID'); //получаем ID из URL var siteurl = _spPageContextInfo.webAbsoluteUrl; //получаем адрес корня сайта $.ajax //Делаем REST запрос ({ url: siteurl + "/_api/web/lists/getbytitle('List1')/items("+id+")", method: "GET", headers: { "Accept": "application/json; odata=verbose" }, success: function (data) { if (data.d.Created.length) { //Записываем значения в поля $('input[title="Поле 1"]').val(data.d.field1); //filed1 - изначальное название поля в SP $('input[title="Поле 2"]').val(data.d.field2); //filed2 - изначальное название поля в SP ... } }, error: function (error) {alert("Error: "+ JSON.stringify(error));} }); });
Изначально ID элемента из URL получал следующим кодом
var url_string = window.location.href; var url = new URL(url_string); var id = url.searchParams.get("ID");
Но он не отрабатывает в IE 11, а именно new URL. Поэтому нашел функцию, которая извлекает параметр ID.
На этом все.
Теперь пользователи, зайдя в список могут нажать меню элемента, выбрать “Копировать”, в открывшемся элементе будут скопированные поля.
Далее пользователь заполняет оставшиеся поля и сохраняет новый элемент.
После сохранения запускается РП, настроенный на запуск при создании элемента.