在 SharePoint 中通过 Javascript 应用主题

applyTheme via Javascript in SharePoint

我正在尝试通过 JSOM 和 REST 在另一个网站集中应用主题。 我收到 404,表示找不到该文件。选择另一个 spcolor 或 spfont 文件并不重要。结果还是一样

我做错了什么?

var applyTheme = {
url: urlToSiteCollection + "/_api/web/applytheme(
colorpaletteurl='/_catalogs/theme/15/palette007.spcolor',
fontschemeurl='_catalogs/theme/15/fontscheme007.spfont',
backgroundimageurl='/piclibrary/th.jpg', 
    sharegenerated=true)",
                                type: "POST",
                                headers: {
                                    "Accept": "application/json;odata=verbose",
                                    "X-RequestDigest": digest

                            },
                            contentType: "application/json;odata=vebose",
                            success: function (applyThemeData) {
                                alert("Applyat theme");
                            },
                            error: function (ex) {
                                alert(JSON.stringify(ex));
                            }
                        };
$.ajax(applyTheme);

以及 JSOM 代码:

var clientContext = new SP.ClientContext(urlToSiteCollection);
        var web = clientContext.get_web();
        var colorPaletteUrl = urlToSiteCollection + "/_catalogs/theme/15/palette011.spcolor"; 
        var fontSchemeUrl = urlToSiteCollection + "/_catalogs/theme/15/fontscheme002.spfont";
        var backgroundImageUrl = imageUrl;
        var shareGenerated = true;

        web.applyTheme(colorPaletteUrl, fontSchemeUrl, backgroundImageUrl, shareGenerated);
        web.update();

        clientContext.executeQueryAsync(onApplyThemeSuccess, OnFailure);

当您使用 SP.ClientContext(url) 创建新上下文时,url 参数需要指向当前网站集中的网站。 SharePoint JavaScript 客户端对象模型不支持跨不同网站集的访问。

另一种方法是使用 REST 或 SharePoint 的其他 Web 服务来访问其他网站。

很可能您收到此错误是因为端点:

http://<sitecollection>/<site>/_api/web/applyTheme(colorPaletteUrl,fontSchemeUrl,backgroundImageUrl,shareGenerated)

期望 colorPaletteUrlfontSchemeUrlbackgroundImageUrl 参数的值被指定为 服务器相关 url,例如: /<site server relative url>/_catalogs/theme/15/palette007.spcolor

以下示例对我有用

var siteUrl = _spPageContextInfo.siteServerRelativeUrl;
var options = {
   colorpaletteurl: _spPageContextInfo.siteServerRelativeUrl + '/_catalogs/theme/15/palette007.spcolor'
};


applyTheme(siteUrl,options)
   .done(function (result) {
          console.log("Theme has been applied");
   })
   .fail(function (ex) {
         console.log(JSON.stringify(ex));
   });    

哪里

function applyTheme(siteUrl,parameters){
    var requestUrl = siteUrl + "/_api/web/applytheme(";
    var paramUrls = [];
    for(var p in parameters) {
        paramUrls.push(p + "='" + options.colorpaletteurl + "'");
    }       
    requestUrl += paramUrls.join(',') +  ")";     
    return $.ajax({url: requestUrl,
                   type: "POST",
                   headers: {
                     "Accept": "application/json;odata=verbose",
                     "X-RequestDigest": $('#__REQUESTDIGEST').val()
                   },
                   contentType: "application/json;odata=vebose",
   });
}