none
Обновление элементов списка SharePoint 2013 по условию? RRS feed

  • Вопрос

  • Приветствую.

    Есть настраиваемый список. Мне необходимо пробежаться по всем его элементам, где поле "Статус" = "В работе" и заменить значение на "Выполнено". Сделать это нужно при щелчке по ссылке под этим списком.

    Подскажите пожалуйста как это можно сделать? Может как то при помощи JQuery? Или ещё как? Желательно без привлечения таких страшных вещей как VisualStudio (( Может быть есть возможность средствами веб- частей "Редактор сценариев" или типа того?

    Заранее благодарю.

    1 февраля 2016 г. 15:14

Ответы

  • получение элементов 

    			 function getRest (listTitle,itemId,filter,select,expand,orderby,asyncVal)
    			{
    				orderby = orderby ? orderby : "" ;
    				var webUrl = _spPageContextInfo.webAbsoluteUrl;
    				var listItemUri = webUrl + "/_api/web/lists/GetByTitle('"+ listTitle + "')/Items("+itemId+")?$filter="+filter+"&$select="+select+"&$expand=" + expand+ "&$orderby=" + orderby;
    				listItemUri = encodeURI(listItemUri);
    				console.log(decodeURI(listItemUri));
    				//console.log("asyncVal", asyncVal); 
    				asyncVal = ("") ? false : true;
    				
    				queryAjax = jQuery.ajax({
    									async: asyncVal,
    									url: listItemUri,
    									type: "GET",
    									headers: { "accept": "application/json;odata=verbose" }
    								});	
    				queryAjax.done(function (data){ console.log('данные REST полученны')});		
    				queryAjax.fail(function (){console.log('Ошибка при вылнении запроса REST')}); 
    				return queryAjax;	
    			}

    использовать

    var listTitle = "Задачи";
    var selectFields = ["ID","Title"];
    var expandFields = [];
    var filter = "тут условие";
    var orberBy = "";//сортировка
    query = getRest(listTitle,"",filter, selectFields.join() , expandFields.join(), orberBy);
    query.done(function (data, status, xhr) {		
    					if(data.d.results.length > 0)
    					{
    						var items = data.d.results;	
    //тут дальнейший код
    
    					}
    					else{
    						console.log("Ответственные не найдены");						
    					}
    				});
    				query.fail(function (){console.log('Ошибка при получении Ответственные ');  
    				});	

    обновление

    function updateListItem(listTitle, itemId, body)
    {
    	var webUrl = _spPageContextInfo.webAbsoluteUrl;
    	var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/Items("+ itemId +")";	
    	var query = jQuery.ajax({
    					url: uri,
    					type: "POST",
    					data: body,
    					contentLength: body.length,
    					headers: {  "accept": "application/json; odata=verbose", 
    								"content-type" : "application/json; odata=verbose",
    								"X-HTTP-Method":"MERGE",
    								"IF-MATCH": "*",
    								"X-RequestDigest" : jQuery("#__REQUESTDIGEST").val() }
    				});	
    	query.done(function (data){ console.log('элемент обновлен'); console.log(data)
    	
    		});		
    	query.fail(function (error){console.log('Ошибка при обновлении элемента'); console.log(error)}); 
    	return query;
    }

    использовать

    var body = "{ '__metadata': { 'type': 'тут listType' },  'Status': 'тут новый статус"' }"; 
    updateListItem(listTitle, newItemId, body);		


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


    2 февраля 2016 г. 10:55
    Модератор
  • на последний вопрос, что то вроде этого, нужно только свои размеры задать и аргументы убрать.

    <script type="text/javascript">
    function OpenEditDialog(item_title, item_id)
    {
        var options = {  url:"http://sp2010dev/SitePages/NewComment.aspx?ItemID=" + item_id + "&title=" + item_title + "&IsDlg=1",  width: 500, height: 300, dialogReturnValueCallback: DialogCallback
        };
        SP.UI.ModalDialog.showModalDialog(options); 
    }  
    function DialogCallback(dialogResult, returnValue){ }
    </script>



    2 февраля 2016 г. 8:46
  • хорошо

    function fillingCurrentUser()
    {
    	if (SP.ClientContext != null) {
    	  SP.SOD.executeOrDelayUntilScriptLoaded(getCurrentUser, 'sp.js');
    	}
    	else {
    	  SP.SOD.executeFunc('sp.js',null, getCurrentUser);
    	}
    	
    	
    	
    	function getCurrentUser() {
    		
    	  var context = new SP.ClientContext.get_current();
    	  var web = context.get_web();
    	  currentUser = web.get_currentUser();	
    	  context.load(currentUser);
    	  context.executeQueryAsync(onSuccessMethod, onRequestFail);
    	}
    
    	function onSuccessMethod(sender, args) {
    	  var account = currentUser.get_loginName();
    	  var currentUserAccount = account.substring(account.indexOf("|") + 1);
    	 alert(currentUserAccount);
    	 var name = currentUser.get_title()
    	 alert(name)
      
    	}
    	// This function runs if the executeQueryAsync call fails.
    	function onRequestFail(sender, args) {
    	  console.log('request failed' + args.get_message() + '\n' + args.get_stackTrace());
    	}	
    	
    }; 
    fillingCurrentUser()


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

    3 февраля 2016 г. 7:11
    Модератор
  • Мне нужно будет и то и другое.

    В идеале, я хочу сделать следующее:

    Пользователь попадает на страницу, жмет кнопочку.

    Скрипт смотрит, нет ли среди элементов списка поля с ФИО совпадающими с текущим пользователем нажавшим кнопку. Если есть - посылает лесом. Если нет - выводит диалог.

    Тут я бы подумал над полем. 
    Если ФИО - это пипл пикер, то просто поставил бы в настройках поля - Применять уникальные значения.
    Если ФИО это метаданные - "Кем создано", то добавил бы WF с олицетворением, которе бы отнимало права на создание.
    2 февраля 2016 г. 10:49
  • Если ФИО это метаданные - "Кем создано", то скрыть во View :)
    2 февраля 2016 г. 10:54
  • Огромное Вам спасибо, но..Страх то какой! xD

    Подскажите пожалуйста, как получить DisplayName доменного пользователя открывшего сайт на SP.Я пробовал так:

    var net = new ActiveXObject("wscript.network");
    alert(net.UserName);

    Работает но не много не то. Выводится логин доменной учетной записи а не DisplayName. ((

    не знаю контекст задачи, но я использовал SPServices
    ну это если служба профилей пользователей развернута

    документация
    2 февраля 2016 г. 11:09
  • Есть затруднения в установке службы профилей пользователей? (у вас фоундешн?)
    в SPService  - хороший пример
    3 февраля 2016 г. 6:36

Все ответы

  • вот я уже "прикрутил" JQuery к Sharepoint. Воткнул вэб-часть "Редактор сценариев" с кодом:

    <button class="OrderBtn" value=1 style="font-size: 13px; width: 200px;">Новый заказ</button>

    <script type="text/javascript">
          $(document).ready(function ()
            {
            $('.OrderBtn').click(function ()
                {
                    alert("Спасибо! Мы свяжемся с вами в ближайшее время.")
            });
        });
    </script>

    Теперь вместо алерта мне надо для начала вызвать форму диалога создания нового элемента списка SharePoint.

    но пока не могу найти как это сделать ((

    2 февраля 2016 г. 7:01
  • Добрый день
    скажите, а сколько будет элементов для обновления? хотелось бы понять порядок. 10, 50 или 2 000?

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

    2 февраля 2016 г. 7:58
    Модератор
  • Добрый день,

    так вам надо вызвать новую форму создания или все-таки изменить статус у всех элементов?

    2 февраля 2016 г. 7:58
  • на последний вопрос, что то вроде этого, нужно только свои размеры задать и аргументы убрать.

    <script type="text/javascript">
    function OpenEditDialog(item_title, item_id)
    {
        var options = {  url:"http://sp2010dev/SitePages/NewComment.aspx?ItemID=" + item_id + "&title=" + item_title + "&IsDlg=1",  width: 500, height: 300, dialogReturnValueCallback: DialogCallback
        };
        SP.UI.ModalDialog.showModalDialog(options); 
    }  
    function DialogCallback(dialogResult, returnValue){ }
    </script>



    2 февраля 2016 г. 8:46
  • Добрый день.

    В самом лучшем случае, штук 700 - не больше.

    2 февраля 2016 г. 10:02
  • Мне нужно будет и то и другое.

    В идеале, я хочу сделать следующее:

    Пользователь попадает на страницу, жмет кнопочку.

    Скрипт смотрит, нет ли среди элементов списка поля с ФИО совпадающими с текущим пользователем нажавшим кнопку. Если есть - посылает лесом. Если нет - выводит диалог.

    2 февраля 2016 г. 10:06
  • Мне нужно будет и то и другое.

    В идеале, я хочу сделать следующее:

    Пользователь попадает на страницу, жмет кнопочку.

    Скрипт смотрит, нет ли среди элементов списка поля с ФИО совпадающими с текущим пользователем нажавшим кнопку. Если есть - посылает лесом. Если нет - выводит диалог.

    Коллега, это уже третий вопрос в одной теме, мы тут так все тут запутаемся ...
    2 февраля 2016 г. 10:15
  • Коллега, это уже третий вопрос в одной теме, мы тут так все тут запутаемся ...

    Это я для полноты картины :)

    Первый вопрос это обновление элемента списка средствами JQuery.

    Второй вопрос - вызов стандартного диалога SP для создания элемента списка.

    2 февраля 2016 г. 10:37
  • Мне нужно будет и то и другое.

    В идеале, я хочу сделать следующее:

    Пользователь попадает на страницу, жмет кнопочку.

    Скрипт смотрит, нет ли среди элементов списка поля с ФИО совпадающими с текущим пользователем нажавшим кнопку. Если есть - посылает лесом. Если нет - выводит диалог.

    Тут я бы подумал над полем. 
    Если ФИО - это пипл пикер, то просто поставил бы в настройках поля - Применять уникальные значения.
    Если ФИО это метаданные - "Кем создано", то добавил бы WF с олицетворением, которе бы отнимало права на создание.
    2 февраля 2016 г. 10:49
  • Если ФИО это метаданные - "Кем создано", то скрыть во View :)
    2 февраля 2016 г. 10:54
  • получение элементов 

    			 function getRest (listTitle,itemId,filter,select,expand,orderby,asyncVal)
    			{
    				orderby = orderby ? orderby : "" ;
    				var webUrl = _spPageContextInfo.webAbsoluteUrl;
    				var listItemUri = webUrl + "/_api/web/lists/GetByTitle('"+ listTitle + "')/Items("+itemId+")?$filter="+filter+"&$select="+select+"&$expand=" + expand+ "&$orderby=" + orderby;
    				listItemUri = encodeURI(listItemUri);
    				console.log(decodeURI(listItemUri));
    				//console.log("asyncVal", asyncVal); 
    				asyncVal = ("") ? false : true;
    				
    				queryAjax = jQuery.ajax({
    									async: asyncVal,
    									url: listItemUri,
    									type: "GET",
    									headers: { "accept": "application/json;odata=verbose" }
    								});	
    				queryAjax.done(function (data){ console.log('данные REST полученны')});		
    				queryAjax.fail(function (){console.log('Ошибка при вылнении запроса REST')}); 
    				return queryAjax;	
    			}

    использовать

    var listTitle = "Задачи";
    var selectFields = ["ID","Title"];
    var expandFields = [];
    var filter = "тут условие";
    var orberBy = "";//сортировка
    query = getRest(listTitle,"",filter, selectFields.join() , expandFields.join(), orberBy);
    query.done(function (data, status, xhr) {		
    					if(data.d.results.length > 0)
    					{
    						var items = data.d.results;	
    //тут дальнейший код
    
    					}
    					else{
    						console.log("Ответственные не найдены");						
    					}
    				});
    				query.fail(function (){console.log('Ошибка при получении Ответственные ');  
    				});	

    обновление

    function updateListItem(listTitle, itemId, body)
    {
    	var webUrl = _spPageContextInfo.webAbsoluteUrl;
    	var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/Items("+ itemId +")";	
    	var query = jQuery.ajax({
    					url: uri,
    					type: "POST",
    					data: body,
    					contentLength: body.length,
    					headers: {  "accept": "application/json; odata=verbose", 
    								"content-type" : "application/json; odata=verbose",
    								"X-HTTP-Method":"MERGE",
    								"IF-MATCH": "*",
    								"X-RequestDigest" : jQuery("#__REQUESTDIGEST").val() }
    				});	
    	query.done(function (data){ console.log('элемент обновлен'); console.log(data)
    	
    		});		
    	query.fail(function (error){console.log('Ошибка при обновлении элемента'); console.log(error)}); 
    	return query;
    }

    использовать

    var body = "{ '__metadata': { 'type': 'тут listType' },  'Status': 'тут новый статус"' }"; 
    updateListItem(listTitle, newItemId, body);		


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


    2 февраля 2016 г. 10:55
    Модератор
  • правда не могу сказать на сколько долго будет происходить обновление большого числа элементов.

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

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


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

    2 февраля 2016 г. 11:01
    Модератор
  • если хотите лучше понимать как работать с SharePoint через js то предлагаю глянуть

    Знакомство со службой REST для SharePoint 2013


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

    2 февраля 2016 г. 11:04
    Модератор
  • Огромное Вам спасибо, но..Страх то какой! xD

    Подскажите пожалуйста, как получить DisplayName доменного пользователя открывшего сайт на SP.Я пробовал так:

    var net = new ActiveXObject("wscript.network");
    alert(net.UserName);

    Работает но не много не то. Выводится логин доменной учетной записи а не DisplayName. ((

    2 февраля 2016 г. 11:06
  • Огромное Вам спасибо, но..Страх то какой! xD

    Подскажите пожалуйста, как получить DisplayName доменного пользователя открывшего сайт на SP.Я пробовал так:

    var net = new ActiveXObject("wscript.network");
    alert(net.UserName);

    Работает но не много не то. Выводится логин доменной учетной записи а не DisplayName. ((

    не знаю контекст задачи, но я использовал SPServices
    ну это если служба профилей пользователей развернута

    документация
    2 февраля 2016 г. 11:09
  • ну это если служба профилей пользователей развернута

    документация

    Нет, не развернута.

    Блин, как то странно, неужели нет способа выкупить ФИО пользователя в правом верхнем углу сайта SharePoint. По сути это то и надо. ((

    2 февраля 2016 г. 11:20
  • попробуйте

    function fillingCurrentUser() { if (SP.ClientContext != null) { SP.SOD.executeOrDelayUntilScriptLoaded(getCurrentUser, 'sp.js'); } else { SP.SOD.executeFunc('sp.js',null, getCurrentUser); } function getCurrentUser() { var context = new SP.ClientContext.get_current(); var web = context.get_web(); currentUser = web.get_currentUser(); context.load(currentUser); context.executeQueryAsync(onSuccessMethod, onRequestFail); } function onSuccessMethod(sender, args) { var account = currentUser.get_loginName(); var currentUserAccount = account.substring(account.indexOf("|") + 1); alert(currentUserAccount); console.log(currentUser) } // This function runs if the executeQueryAsync call fails. function onRequestFail(sender, args) { console.log('request failed' + args.get_message() + '\n' + args.get_stackTrace()); } };

    fillingCurrentUser()



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



    2 февраля 2016 г. 12:41
    Модератор
  • Здравствуйте, Владимир.

    Ваш пример работает, но проблема в том, что мне нужен не логин пользователя а DisplayName этой учетной записи.

    К примеру доменная учётка CORUS\inv может иметь DisplayName = "Иванов Николай Владимирович". Вот его то (Иванов Николай Владимирович) мне и нужно. По сути, это то же самое что выводится в правом верхнем углу любого стандартного сайта SharePoint - т.е. ФИО пользователя домена открывшего сайт. Надеюсь понятно объяснил.

    Вот как здесь:

    • Изменено VARD32 3 февраля 2016 г. 4:20
    3 февраля 2016 г. 3:11
  • Есть затруднения в установке службы профилей пользователей? (у вас фоундешн?)
    в SPService  - хороший пример
    3 февраля 2016 г. 6:36
  • хорошо

    function fillingCurrentUser()
    {
    	if (SP.ClientContext != null) {
    	  SP.SOD.executeOrDelayUntilScriptLoaded(getCurrentUser, 'sp.js');
    	}
    	else {
    	  SP.SOD.executeFunc('sp.js',null, getCurrentUser);
    	}
    	
    	
    	
    	function getCurrentUser() {
    		
    	  var context = new SP.ClientContext.get_current();
    	  var web = context.get_web();
    	  currentUser = web.get_currentUser();	
    	  context.load(currentUser);
    	  context.executeQueryAsync(onSuccessMethod, onRequestFail);
    	}
    
    	function onSuccessMethod(sender, args) {
    	  var account = currentUser.get_loginName();
    	  var currentUserAccount = account.substring(account.indexOf("|") + 1);
    	 alert(currentUserAccount);
    	 var name = currentUser.get_title()
    	 alert(name)
      
    	}
    	// This function runs if the executeQueryAsync call fails.
    	function onRequestFail(sender, args) {
    	  console.log('request failed' + args.get_message() + '\n' + args.get_stackTrace());
    	}	
    	
    }; 
    fillingCurrentUser()


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

    3 февраля 2016 г. 7:11
    Модератор