Есть определенный список в 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.
На этом все.
Теперь пользователи, зайдя в список могут нажать меню элемента, выбрать “Копировать”, в открывшемся элементе будут скопированные поля.
Далее пользователь заполняет оставшиеся поля и сохраняет новый элемент.
После сохранения запускается РП, настроенный на запуск при создании элемента.