Как автоматизировать создание сайта при сохранении в форме списка SP с помощью JSOM?

Для одного из клиентских требований я должен автоматизировать создание сайта Sharepoint одним нажатием кнопки. По сути, это будет форма списка SharePoint, в которой пользователь будет вводить данные в виде заголовка, URL-адреса и выбирать шаблон. После нажатия на кнопку «Сохранить» должен быть создан сайт sharepoint. Мне удалось реализовать это с помощью веб-части HTML-формы, но теперь мне нужно использовать форму списка SharePoint OOTB, и мне нужно сделать то же самое. Ниже приведен код, который я написал, который создает сайт sharepoint при нажатии кнопки, код работает нормально и создает сайт в зависимости от выбора. Я использую SharePoint онлайн.

Любые идеи о том, как преобразовать этот подход в подход формы списка Sharepoint?

    <script src="//code.jquery.com/jquery-3.2.1.min.js" type="text/javascript"></script>
<script type="text/javascript">

function PreSaveAction(){
    CreateSubWeb();
    return true;
}

function CreateSubWeb() {
    // defualt list Title field
    var webTitle=$("input[title='Client_x0020_Name']").val();
    //custom fields URL and Template
    var url=$("input[title='Site_x0020_URL']").val();
    var template=$("input[title='Custom_x0020_Template']").val();

    // current web url
    var webUrl = _spPageContextInfo.webAbsoluteUrl;

    var clientContext = new SP.ClientContext(webUrl);
    this.oWebsite = clientContext.get_web();

    var webCreationInfo = new SP.WebCreationInformation();
    webCreationInfo.set_title(webTitle);
    webCreationInfo.set_language(1033);
    webCreationInfo.set_url(url);
    webCreationInfo.set_useSamePermissionsAsParentSite(true);

    if(template == 'Customer W Project'){       
            webCreationInfo.set_webTemplate("{2936BD84-30AD-413E-8933-2A6B7856D10F}#Template 2");
    }
    else
    {
        webCreationInfo.set_webTemplate("{ED884F01-6B10-4791-A704-FF05A047D0F3}#Template 1");   
    }
    oWebsite.get_webs().add(webCreationInfo);
    oWebsite.update();
    clientContext.executeQueryAsync(onQuerySucceeded, onQueryFailed);

}
function onQuerySucceeded(sender, args) {
    alert('success'); 
}
function onQueryFailed(sender, args) {
     alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace()); 
}  
</script>

Скриншот


person mdevm    schedule 31.01.2018    source источник


Ответы (1)


Код ниже для справки. Добавьте код в веб-часть редактора скриптов на новой странице формы.

<script src="//code.jquery.com/jquery-3.2.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
function PreSaveAction(){
    var templateName=$("select[title='Custom Template']").val();
    getTemplateName(templateName).done(function(template) {
        createSubSite(template);    
    }); 
    return true;
}
var createSubSite = function(templateName) {
    // defualt list Title field
    var webTitle=$("input[title='Title Required Field']").val();
    //custom fields URL and Template
    var url=$("input[title='Site URL']").val();

    // current web url
    var webUrl = _spPageContextInfo.webAbsoluteUrl;

    var clientContext = new SP.ClientContext(webUrl);
    this.oWebsite = clientContext.get_web();

    var webCreationInfo = new SP.WebCreationInformation();
    webCreationInfo.set_title(webTitle);
    webCreationInfo.set_language(1033);
    webCreationInfo.set_url(url);
    webCreationInfo.set_useSamePermissionsAsParentSite(true);
    webCreationInfo.set_webTemplate(templateName);
    oWebsite.get_webs().add(webCreationInfo);
    oWebsite.update();
    clientContext.executeQueryAsync(function() {
            console.log("Done");
        }, function(sender,args){ 
            console.log("failed. Message:" + args.get_message());
    });
}

var getTemplateName = function(templateName) {
    var dfd = new $.Deferred(); 
    var clientContext = SP.ClientContext.get_current();
    var templates = clientContext.get_web().getAvailableWebTemplates(1033, false);
    clientContext.load(templates);

    clientContext.executeQueryAsync(function() {
        var templateGuidName;

        for (var template in templates.get_data()) {
                if (templates.itemAt(template).get_title() === templateName) {
                    templateGuidName = templates.itemAt(template).get_name();
                    break;
                }
            }   
        dfd.resolve(templateGuidName);

     }, function() { dfd.reject(); });

    return dfd.promise();

}
</script>
person LZ_MSFT    schedule 01.02.2018
comment
Спасибо большое за Ваш ответ. Я обновил код в своем вопросе, как вы предложили, но получил ошибку, как показано на прикрепленном снимке экрана. Обратите внимание, что я использую индивидуальные шаблоны для создания сайта. Подскажите, пожалуйста, что не так в коде? Спасибо большое. Пожалуйста, обратитесь к моему вопросу, чтобы увидеть код, который я использую, а также скриншот. - person mdevm; 01.02.2018
comment
Знаете ли вы, как получить значения полей выбора списка SharePoint и сохранить их в переменной с помощью js/jq? - person mdevm; 01.02.2018
comment
Я изменяю приведенный выше код. Если вы используете собственный шаблон, нам нужно сначала получить templateGuidName с помощью JSOM. Чтобы получить значение выбора, мы можем использовать $(select[title='Custom Template']).val() . - person LZ_MSFT; 02.02.2018
comment
Спасибо за ваш ответ. Я попробую это и дам вам знать. Также на данный момент я могу скопировать поле веб-заголовка в другое поле столбца списка, наряду с этим мне также нужно скопировать URL-адрес вновь созданного сайта в заполненный столбец списка. Как получить URL только что созданного сайта? - person mdevm; 02.02.2018
comment
Чтобы получить URL-адрес только что созданного сайта, мы можем использовать это: var newsiteUrl=_spPageContextInfo.webAbsoluteUrl+/+url; - person LZ_MSFT; 05.02.2018
comment
Большое спасибо @LZ-SPWX - person mdevm; 07.02.2018