none
Создание элемента списка на основании имеющегося элемента списка. RRS feed

  • Вопрос

  • Добрый день.

    Sharepoint 2013.

    Имеется список. Для удобства пользователей необходимо сделать создание нового элемента списка на основании ранее созданного элемента, при этом в новый элемент необходимо перенести часть полей.

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

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


    Подскажите как это реализовать.



    • Изменено Demon_P 6 ноября 2019 г. 6:48
    6 ноября 2019 г. 6:47

Ответы

  • Задача решена.

    Использовал тот сценарий, который описал выше.

    Скопировал NewForm.aspx в NewFormCopy.aspx. Сделал меню с переходом на URL ...\NewFormCopy.aspx?ID={ItemId}

    В NewFormCopy.aspx добавляем следующий код. Т.к. в IE 11 не работает new URL, то нашел замену в виде функции.

    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 url_string = window.location.href;
    //	var url = new URL(url_string); не работает в IE 11
    //	var id = url.searchParams.get("ID");
    	var id = getQueryString('ID');
    	var siteurl = _spPageContextInfo.webAbsoluteUrl; //получаем адрес корня сайта
           $.ajax
    	({
               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));}
            });
    
    });
    На этом все.

    Пользователь заполняет оставшиеся поля и сохраняет элемент. После сохранения запускается РП.


    13 ноября 2019 г. 7:54

Все ответы

  • Добрый день.

    нужно писать свое решение. я делал подобную задачу на js.

    добавлял кнопку на элемент с которого нужно скопировать данные.

    при нажатии на которую получаются значения из определенных полей и потом через REST оправляем запрос на создание нового элемента при этом передаем имеющиеся значения полей.

    нам возвращается id созданного элемента и можно через диалоговое окно или в новой вкладке открыть форму редактирования для нового элемента.

    это если кратко.

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


    мой блог не много о SharePoint

    6 ноября 2019 г. 13:59
    Модератор
  • Добрый день.

    Я так и планировал, но меня смущает, что в списке рабочий процесс настроен на запуск при создании элемента. Не будет ли он запущен до открытия элемента? 

    При создании элемента списка из другого списка запуска не будет, а в этом случае?

    P.S. А можно пример js :)

    7 ноября 2019 г. 7:52
  • РП отработает до закрытия элемента, и как следствие - конфликт версий.

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


    мой блог не много о SharePoint

    7 ноября 2019 г. 8:34
    Модератор
  • Добрый день.

    Я так и планировал, но меня смущает, что в списке рабочий процесс настроен на запуск при создании элемента. Не будет ли он запущен до открытия элемента? 

    При создании элемента списка из другого списка запуска не будет, а в этом случае?

    P.S. А можно пример js :)

    РП начет работу после сохранения эл-та. а вот когда он завершится) это уже зависит от того что у вас там написано) + еще некоторые факторы.

    Так что если выражаться условно кейс при котором что то пойдет не так будет следующим

    1)вы создали элемент через js и получили его ИД

    2) запустился рабочий процесс(допустим там куча операций и в конце еще есть добавление какого то текста к полю(назовем его Title) ). Допустим раб процесс выполняется 3-4 сек

    3) открытие сохраненного эл-та в новом окне...title не обновлен

    4) рабочий процесс завершился

    7 ноября 2019 г. 15:17
  • Как работают РП мне понятно.

    Вопрос был в том, запустится ли РП при создании элемента через REST.

    Так как в SP существует предотвращение рекурсии РП и если Вы создаете элемент в списке из РП другого списка, то РП в текущем списке не запустится.

    По моему вопросу пока вижу такой сценарий:

    1. Добавляем в меню элемента ссылку на новый NewForm и передаем ему ID 

    2. В новом NewForm, зная ID через REST читаем необходимые поля.

    3. JS`ом заполняем их в NewForm

    4. Пользователь заполняет оставшиеся поля и сохраняет элемент.

    5. После сохранения запускается РП.

    Я не силён в JS поэтому прошу подсказать как это сделать.

    8 ноября 2019 г. 6:43
  • Задача решена.

    Использовал тот сценарий, который описал выше.

    Скопировал NewForm.aspx в NewFormCopy.aspx. Сделал меню с переходом на URL ...\NewFormCopy.aspx?ID={ItemId}

    В NewFormCopy.aspx добавляем следующий код. Т.к. в IE 11 не работает new URL, то нашел замену в виде функции.

    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 url_string = window.location.href;
    //	var url = new URL(url_string); не работает в IE 11
    //	var id = url.searchParams.get("ID");
    	var id = getQueryString('ID');
    	var siteurl = _spPageContextInfo.webAbsoluteUrl; //получаем адрес корня сайта
           $.ajax
    	({
               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));}
            });
    
    });
    На этом все.

    Пользователь заполняет оставшиеся поля и сохраняет элемент. После сохранения запускается РП.


    13 ноября 2019 г. 7:54