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

  • Вопрос

  • Здравствуйте.

    В соседней теме, Владимир, мне привел пример обновления списка. Вот он:

    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);	

    Не могли бы Вы объяснить следующие вещи, а именно - как их получить:  

    'тут listType',  
    listTitle, newItemId

    • Изменено VARD32 8 февраля 2016 г. 11:42
    8 февраля 2016 г. 11:40

Ответы

  • Отвечу сам себе :) Или кому то вдруг будет интересно..

    На самом деле, имена свойств (полей) для конкретного типа списков, хранятся не в привычном для пользователя виде (например "Статус" или "Кол-во шт") а в каком-то зашифрованом. Незнаю почему так, но чтобы посмотреть как же на самом деле называется то или иное поле списка, нужно в строку браузера ввести следующую строку: http://<SiteName>/_api/web/lists/GetByTitle('<Имя списка>')/Items(<ИД элемента списка>) И лучше это делать в каком нибудь Google chrome. Там будет xml-ка которую нужно сохранить в отдельный файл, а потом "причесать его"

    Интересовать в данном случае нас будет не всё, а конкретные тэги:

    например такие:

    		<content type="application/xml">
    		<m:properties>
    		
    		<d:FileSystemObjectType m:type="Edm.Int32">0</d:FileSystemObjectType>
    		<d:Id m:type="Edm.Int32">23</d:Id>
    		<d:Title>330</d:Title>
    		<d:OData__x041a__x043e__x043b__x0438__x04 m:type="Edm.Double">2</d:OData__x041a__x043e__x043b__x0438__x04>
    		<d:OData__x0421__x0442__x0430__x0442__x04>В работе</d:OData__x0421__x0442__x0430__x0442__x04>
    		<d:ContentTypeId>0x01007C6D4FF432E2D34D99EAC1E233ED317F</d:ContentTypeId>
    		<d:OData__x042d__x0442__x0430__x0436_>3</d:OData__x042d__x0442__x0430__x0436_>
    		
    		<d:ID m:type="Edm.Int32">23</d:ID>
    		<d:Modified m:type="Edm.DateTime">2016-02-08T04:51:14Z</d:Modified>
    		<d:Created m:type="Edm.DateTime">2016-02-02T09:06:06Z</d:Created>
    		<d:AuthorId m:type="Edm.Int32">2348</d:AuthorId>
    		<d:EditorId m:type="Edm.Int32">21</d:EditorId>
    		<d:OData__UIVersionString>1.0</d:OData__UIVersionString>
    		<d:Attachments m:type="Edm.Boolean">false</d:Attachments>
    		<d:GUID m:type="Edm.Guid">5caf085e-e308-4387-a71b-3ad153227621</d:GUID>
    		
    		</m:properties>
    		</content>
    

    И кто бы мог догадаться, что имя поля "Статус" на самом деле, для шарпоинта это поле 

    OData__x0421__x0442__x0430__x0442__x04

    !

    Его то и нужно указывать в вызове.

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

Все ответы

  • Добрый день

    List Type можно получить как к примеру в статье 

    Manipulating list items in SharePoint Hosted Apps using the REST API

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

    его можно посмотреть http://site/_api/web/lists/GetByTitle('"+listTitle+"')/ListItemEntityTypeFullName

    где listTitle - отображаемое имя списка (к примеру Задачи http://site/_api/web/lists/GetByTitle('Задачи')/ListItemEntityTypeFullName)

    что касается updateListItem(listTitle, newItemId, body);

    listtitle - описал выше

    newItemId - я скопипастил у себя с одной из задач, думаю правильнее переменную назвать itemId, т.е. ID элемента с которым будет производить манипуляции.

    а body - формируете ранее.


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


    8 февраля 2016 г. 13:46
    Модератор
  • Владимир, здравствуйте. Я, видимо, что-то не так делаю. 

    С помощью http://site/_api/web/lists/GetByTitle('"+listTitle+"')/ListItemEntityTypeFullName Подсмотрел ListType. Мне в браузере IE открылась xml-ка вот такого вида:

    <?xml version="1.0" encoding="utf-8" ?> 
      <d:ListItemEntityTypeFullName xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">SP.Data.WaterListListItem</d:ListItemEntityTypeFullName> 

    Как я понял - ListType, в моем случае будет SP.Data.WaterListListItem ?!

    С ListTitle понятно - это, в моем случае "Заказ воды". Хотя это переименованное название, оригинальное (внутреннее имя) это WaterList.

    и вот подбираемся к главному: 

    var body = "{ '__metadata': { 'type': 'SP.Data.WaterListListItem' }, 'Статус': 'Выполнен' }";
    updateListItem("Заказ воды", "23", body);

    23 - это ИД элемента списка (сделал через показ в представлении)

    "Статус" - это имя поля списка, которое может принимать два значения "В работе" и "Выполнен"

    Всё это сделал. Но обновления не происходит почему-то... ((

    Решил проверить, в каком месте происходит затык. Понаделал алертов. Оказалось что вот здесь:

    query.fail(function (error){
    									console.log('Ошибка при обновлении элемента');
    									alert('Ошибка при обновлении элемента');
    									console.log(error)
    						       }); 

    посмотрел через консоль IE что же ему не нравится:

    Получается что "Статус" - это не поле которое я хочу обновить а свойство какое то?


    • Изменено VARD32 9 февраля 2016 г. 7:40
    9 февраля 2016 г. 5:59
  • Отвечу сам себе :) Или кому то вдруг будет интересно..

    На самом деле, имена свойств (полей) для конкретного типа списков, хранятся не в привычном для пользователя виде (например "Статус" или "Кол-во шт") а в каком-то зашифрованом. Незнаю почему так, но чтобы посмотреть как же на самом деле называется то или иное поле списка, нужно в строку браузера ввести следующую строку: http://<SiteName>/_api/web/lists/GetByTitle('<Имя списка>')/Items(<ИД элемента списка>) И лучше это делать в каком нибудь Google chrome. Там будет xml-ка которую нужно сохранить в отдельный файл, а потом "причесать его"

    Интересовать в данном случае нас будет не всё, а конкретные тэги:

    например такие:

    		<content type="application/xml">
    		<m:properties>
    		
    		<d:FileSystemObjectType m:type="Edm.Int32">0</d:FileSystemObjectType>
    		<d:Id m:type="Edm.Int32">23</d:Id>
    		<d:Title>330</d:Title>
    		<d:OData__x041a__x043e__x043b__x0438__x04 m:type="Edm.Double">2</d:OData__x041a__x043e__x043b__x0438__x04>
    		<d:OData__x0421__x0442__x0430__x0442__x04>В работе</d:OData__x0421__x0442__x0430__x0442__x04>
    		<d:ContentTypeId>0x01007C6D4FF432E2D34D99EAC1E233ED317F</d:ContentTypeId>
    		<d:OData__x042d__x0442__x0430__x0436_>3</d:OData__x042d__x0442__x0430__x0436_>
    		
    		<d:ID m:type="Edm.Int32">23</d:ID>
    		<d:Modified m:type="Edm.DateTime">2016-02-08T04:51:14Z</d:Modified>
    		<d:Created m:type="Edm.DateTime">2016-02-02T09:06:06Z</d:Created>
    		<d:AuthorId m:type="Edm.Int32">2348</d:AuthorId>
    		<d:EditorId m:type="Edm.Int32">21</d:EditorId>
    		<d:OData__UIVersionString>1.0</d:OData__UIVersionString>
    		<d:Attachments m:type="Edm.Boolean">false</d:Attachments>
    		<d:GUID m:type="Edm.Guid">5caf085e-e308-4387-a71b-3ad153227621</d:GUID>
    		
    		</m:properties>
    		</content>
    

    И кто бы мог догадаться, что имя поля "Статус" на самом деле, для шарпоинта это поле 

    OData__x0421__x0442__x0430__x0442__x04

    !

    Его то и нужно указывать в вызове.

    9 февраля 2016 г. 9:15
  • все верно, обращение нужно производить по internal Name

    но т.к. Вы называли поля по русский, то получили такие значения.

    OData__x0421__x0442__x0430__x0442__x04

    при создании правильнее создавать его с английским именем, а потом переименовывать.


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


    9 февраля 2016 г. 9:47
    Модератор
  • единственно, с этим ничего нельзя поделать если поля создаются из формы InfoPath в библиотеке.

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

    9 февраля 2016 г. 9:48
    Модератор
  • Владимир, а как вот здесь:

    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;	
    //тут дальнейший код
    
    					}
    потом из items получить элементы? Ведь это по сути массив?

    9 февраля 2016 г. 10:54
  • Разобрался :)
    9 февраля 2016 г. 11:22