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

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

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

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

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

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


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


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 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', т.к. при создании заполнить его не получается.

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

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