Неизвестные ошибки с JSOM API - Sharepoint 2013 (добавление нескольких уникальных столбцов сайта в несколько уникальных типов контента) - PullRequest
1 голос
/ 30 марта 2020

Я прошел через несколько итераций о том, как это сделать, и я не уверен, что именно происходит. В настоящее время я работаю над инструментом администрирования, который позволит легко дублировать наши сайты SharePoint. Передо мной стояла задача добавить столбцы сайта в типы контента, и благодаря моим исследованиям я знаю, как это сделать, через API JSOM. Я могу добавить несколько колонок сайта (макс. 7 - 8). Однако независимо от того, что я делаю, я получаю 1 из 2 ошибок при попытке выполнить полный объем столбцов сайта (17 или 22) в зависимости от типа контента.

  1. Не удалось получить столбцы и содержимое Тип. Ошибка: неверное имя поля. {b0af08d3-136 c -43c6-8c0 c -df48df70c2c3} - это основано на начальном вызове функции SPPostCTFIeldLinksData. Это не идентификатор поля, почему он заполняется?

  2. Неизвестная ошибка. - Это странная проблема для меня. Я не совсем уверен, откуда это вытекает, но кажется, что запрос выполняется, он просто возвращает ошибку без заметных сообщений.

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

Код ниже:

var ctx = new SP.ClientContext.get_current();
var web = ctx.get_web();
var columns = new Array();

function SPPostCTFieldLinksData(configData) {
    document.getElementById('text').value += 'Posting Site Columns to Content Types...\n';
    $.get({
        url: siteURL,
        method: 'GET',
        headers: {
            "Accept": "application/json;odata=verbose"
        },
        async: false
    }, function (data) {
        for (var i = 0; i < data.d.results.length; i++) {
            IDs.push({ id: data.d.results[i].Id.StringValue, name: data.d.results[i].Name });
        }
    });
    for (var iFieldsCounter = 0; iFieldsCounter < configData[IDs[0].name]["FieldLinksTitle"].length; iFieldsCounter++) {
        columns[iFieldsCounter] = web.get_fields().getByInternalNameOrTitle(configData[IDs[0].name]["FieldLinksTitle"][iFieldsCounter]);
        ctx.load(columns[iFieldsCounter]);
    }
    cttypes = web.get_contentTypes();
    ctx.load(cttypes);
    ctx.executeQueryAsync(
        function () {
            addColumns(IDs[0].name, configData[IDs[0].name]["FieldLinksTitle"], columns);
        },
        function onItemsRefetchedFail(sender, args) {
            console.log('Failed to fetch columns and Content Type. Error:' + args.get_message() + '\n' + args.get_stackTrace());
        });
}

function addColumns(ctypeName, fieldsInternalName, createdFields) {
    var createdContentType;  
    var contentTypeEnumerator = cttypes.getEnumerator();  
    while (contentTypeEnumerator.moveNext()) {
        var contentType = contentTypeEnumerator.get_current();
        if (contentType.get_name() === ctypeName) {
            createdContentType = contentType;
            var fieldRef = new Array();
            for (var iAddFieldsCounter = 0; iAddFieldsCounter < 11; iAddFieldsCounter++) {
                fieldRef[iAddFieldsCounter] = new SP.FieldLinkCreationInformation();
                fieldRef[iAddFieldsCounter].set_field(createdFields[iAddFieldsCounter]);
                createdContentType.get_fieldLinks().add(fieldRef[iAddFieldsCounter]);
                createdContentType.update(true);
            }
            ctx.load(createdContentType);
            ctx.executeQueryAsync(onAddFieldToContentTypeSuccess, onAddFieldToContentTypeFail);
        }    
    }
}

function onAddFieldToContentTypeSuccess() {  
    alert('Site Columns added to Content Type.');  
}  

function onAddFieldToContentTypeFail(sender, args) {  
    alert('Failed to add Site Columns to Content Type. Error:' + args.get_message() + '\n' + args.get_stackTrace());  
}

1 Ответ

0 голосов
/ 31 марта 2020

Нашел ответ, используя перечислители, предоставленные в JSOM API. Пришлось добавить второй перечислитель для полей внутри перечислителя типов контента после сбора всех типов контента и полей, перечисленных на сайте.

Успешный обратный вызов:

function onQuerysuccess() {
var oEnumerator = oSiteContentTypes.getEnumerator();
var oContentType;
var oSiteColumn;
var cttypeskeys =Object.keys(config["SiteContentTypes"]);

while (oEnumerator.moveNext()) {
  oContentType = oEnumerator.get_current();
  var oColEnumerator = oSiteColumns.getEnumerator();
    while (oColEnumerator.moveNext()) {
      oSiteColumn = oColEnumerator.get_current();
      if (cttypeskeys.indexOf(oContentType.get_name()) > -1 && config["SiteContentTypes"][oContentType.get_name()]["FieldLinksTitle"].indexOf(oSiteColumn.get_title()) > -1) {
        var newSiteCol = new SP.FieldLinkCreationInformation();
        newSiteCol.set_field(oSiteColumn);
        oContentType.get_fieldLinks().add(newSiteCol);
        oContentType.update(true);
        clientContext.load(oContentType);
      }
    }
    if (Content Type Name Check) {
      clientContext.executeQueryAsync(onsuccess, onfailed);
    }
  }
}

function onQueryfailed(sender, args) {
  document.getElementById('text').value += ('Failed to fetch content type and field data. (' + args.get_message() + ')\n' + args.get_stackTrace());
}

function onsuccess() {
  document.getElementById('text').value += 'Content Type Updated.\n';
}

function onfailed(sender, args) {
  document.getElementById('text').value += ('Content Type Update failed. (' + args.get_message() + ')\n' + args.get_stackTrace());
}
...