понедельник, 10 августа 2015 г.

Создание элемента списка в папке используя REST

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

Для начала нужно проверить есть ли папка или папку нужно ее создать:
Пример :
1
checkingExistenceFolder("Билеты", "Folder 10")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
function checkingExistenceFolder(listTitle, folderTitle)
{
 filter = "ContentTypeId eq '0x0120001EE026E991F8644A85A5F2888FADB06D' and Title eq '" + folderTitle +"'";
 query =  getRest(listTitle,"",filter,"","")
 query.done(function (data, status, xhr) {
  if(data.d.results.length > 0)
  {
   console.log(data.d.results.length);
   console.log("папка '" + folderTitle + "' найдена ")
  }
  else{
   console.log("папка '" + folderTitle + "' не найдена"); 
   createFolder(listTitle,folderTitle)
  }
   
   
 });
 query.fail(function (){
  console.log("папка '" + folderTitle + "' не найдена"); 
 });
  
}
function createFolder(listTitle,folderName)
{
 var webUrl = _spPageContextInfo.webAbsoluteUrl;
 var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/Items/";
 console.log(uri);
 var getlistType = getListEntityTypeName(listTitle);
 getlistType.done(function (data, status, xhr) {
  console.log(data.d.EntityTypeName)
  var listType = data.d.EntityTypeName
  
  var body = "{ '__metadata': { 'type': 'SP.Data." + listType + "Item' },  'Title': '" + folderName + "', 'FileLeafRef': '" + folderName + "', 'ContentTypeId': '0x0120001EE026E991F8644A85A5F2888FADB06D'}"
  var newItem = addListItem(listTitle, body);
  newItem.done (function (data, status, xhr) {
   console.log(data)
   var newItemId = data.d.Id;
   var body = "{ '__metadata': { 'type': 'SP.Data." + listType + "Item' },  'FileLeafRef': '" + folderName + "' }";
   updateListItem(listTitle, newItemId, body);
    
    
  });
   
 }); 
}
 
 
function addListItem(listTitle,body)
{
 var webUrl = _spPageContextInfo.webAbsoluteUrl;
 var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/Items/";
 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-RequestDigest" : jQuery("#__REQUESTDIGEST").val() }
    });
 query.done(function (data){ console.log('элемент создан'); console.log(data)
  
  }); 
 query.fail(function (error){console.log('Ошибка при создании элемента'); console.log(error)});
 return query;
}

Хорошо, теперь нужно создать элемент в требуемой папке, но вот не задача, у элемента нет свойства заполнив которое получим требуемое.
Для решения этой проблемы нашел обходной путь.
Для начала создаём элемент в корне списка, а потом переносим в требуемую папку.


перемещение 
1
moveListItem( "Билеты", "Folder 10", 26)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function moveListItem( listTitle, folderTitle, itemId)
{
 var getlistType = getListEntityTypeName(listTitle);
 getlistType.done(function (data, status, xhr) {
  console.log(data.d.EntityTypeName) 
  var listType = data.d.EntityTypeName;
  var listInternalName = listType.substring(0, listType.length - 4 )
  console.log(listInternalName)
    var webUrl = _spPageContextInfo.webAbsoluteUrl;
  var uri = webUrl+ "/_api/web/getfilebyserverrelativeurl('/Lists/"+ listInternalName + "/" + itemId+ "_.000')/moveto(newurl='/Lists/"+ listInternalName + "/" + folderTitle + "/" + itemId+ "_.000',flags=1)";
  var query = jQuery.ajax({
   url: uri,
   type: "POST",
   headers: {  "accept": "application/json; odata=verbose",
      "content-type" : "application/json; odata=verbose",
   "X-RequestDigest" : jQuery("#__REQUESTDIGEST").val()}
   });
   query.done(function (data){ console.log('элемент создан'); console.log(data) }); 
   query.fail(function (error){console.log('Ошибка при создании элемента'); console.log(error)});
   
 
 });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getListEntityTypeName(listTitle)
{
 var webUrl = _spPageContextInfo.webAbsoluteUrl;
 var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/EntityTypeName";
 var queryAjax = jQuery.ajax({
      url: uri,
      type: "GET",
      headers: {  "accept": "application/json; odata=verbose",
         "content-type" : "application/json; odata=verbose",
         "X-RequestDigest" : jQuery("#__REQUESTDIGEST").val() }
     });
 queryAjax.done(function (data){ console.log('EntityTypeName полученны'); console.log(data)}); 
 queryAjax.fail(function (){console.log('Ошибка при вылнении запроса EntityTypeName')});
 return queryAjax;
}
Если заметили, то мне пришлось еще использовать доп функцию которая возвращает  EntityTypeName. в первом случае я его использую для создания папки, а второй раз при перемещении элемента, т.к. нужно указывать путь (Url)

Еще пришлось обновлять элемент при создании папки, т.к. при ее создании путь и Title верный, но вот Name имеет вид "12_.000"

По этому у созданной папки указываем 'FileLeafRef', т.к. при создании заполнить его не получается.

скрипт целиком

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
function checkingExistenceFolder(listTitle, folderTitle)
{
 filter = "ContentTypeId eq '0x0120001EE026E991F8644A85A5F2888FADB06D' and Title eq '" + folderTitle +"'";
 query =  getRest(listTitle,"",filter,"","")
 query.done(function (data, status, xhr) {
  if(data.d.results.length > 0)
  {
   console.log(data.d.results.length);
   console.log("папка '" + folderTitle + "' найдена ")
  }
  else{
   console.log("папка '" + folderTitle + "' не найдена"); 
   createFolder(listTitle,folderTitle)
  }
   
   
 });
 query.fail(function (){
  console.log("папка '" + folderTitle + "' не найдена"); 
 });
  
}
function createFolder(listTitle,folderName)
{
 var webUrl = _spPageContextInfo.webAbsoluteUrl;
 var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/Items/";
 console.log(uri);
 var getlistType = getListEntityTypeName(listTitle);
 getlistType.done(function (data, status, xhr) {
  console.log(data.d.EntityTypeName)
  var listType = data.d.EntityTypeName
  
  var body = "{ '__metadata': { 'type': 'SP.Data." + listType + "Item' },  'Title': '" + folderName + "', 'FileLeafRef': '" + folderName + "', 'ContentTypeId': '0x0120001EE026E991F8644A85A5F2888FADB06D'}"
  var newItem = addListItem(listTitle, body);
  newItem.done (function (data, status, xhr) {
   console.log(data)
   var newItemId = data.d.Id;
   var body = "{ '__metadata': { 'type': 'SP.Data." + listType + "Item' },  'FileLeafRef': '" + folderName + "' }";
   updateListItem(listTitle, newItemId, body);
    
    
  });
   
 }); 
}
 
 
function addListItem(listTitle,body)
{
 var webUrl = _spPageContextInfo.webAbsoluteUrl;
 var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/Items/";
 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-RequestDigest" : jQuery("#__REQUESTDIGEST").val() }
    });
 query.done(function (data){ console.log('элемент создан'); console.log(data)
  
  }); 
 query.fail(function (error){console.log('Ошибка при создании элемента'); console.log(error)});
 return query;
}
function moveListItem( listTitle, folderTitle, itemId)
{
 var getlistType = getListEntityTypeName(listTitle);
 getlistType.done(function (data, status, xhr) {
  console.log(data.d.EntityTypeName) 
  var listType = data.d.EntityTypeName;
  var listInternalName = listType.substring(0, listType.length - 4 )
  console.log(listInternalName)
    var webUrl = _spPageContextInfo.webAbsoluteUrl;
  var uri = webUrl+ "/_api/web/getfilebyserverrelativeurl('/Lists/"+ listInternalName + "/" + itemId+ "_.000')/moveto(newurl='/Lists/"+ listInternalName + "/" + folderTitle + "/" + itemId+ "_.000',flags=1)";
  var query = jQuery.ajax({
   url: uri,
   type: "POST",
   headers: {  "accept": "application/json; odata=verbose",
      "content-type" : "application/json; odata=verbose",
   "X-RequestDigest" : jQuery("#__REQUESTDIGEST").val()}
   });
   query.done(function (data){ console.log('элемент создан'); console.log(data) }); 
   query.fail(function (error){console.log('Ошибка при создании элемента'); console.log(error)});
   
 
 });
}
 
 
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;
}
function getListEntityTypeName(listTitle)
{
 var webUrl = _spPageContextInfo.webAbsoluteUrl;
 var uri = webUrl + "/_api/web/lists/GetByTitle('"+listTitle+"')/EntityTypeName";
 var queryAjax = jQuery.ajax({
      url: uri,
      type: "GET",
      headers: {  "accept": "application/json; odata=verbose",
         "content-type" : "application/json; odata=verbose",
         "X-RequestDigest" : jQuery("#__REQUESTDIGEST").val() }
     });
 queryAjax.done(function (data){ console.log('EntityTypeName полученны'); console.log(data)}); 
 queryAjax.fail(function (){console.log('Ошибка при вылнении запроса EntityTypeName')});
 return queryAjax;
}