在企业发布网站中,我们使用复合外观来允许网站经理选择品牌配色方案。

基本上,我们使用两个 css 文件对门户进行品牌化。A main.css 包含大部分规则的文件,该文件位于 Style library. 。还有另一个 theme.css 其中包含依赖于主题的所有规则。

因此,用户可以使用站点设置中的“更改外观”菜单选择自己的配色方案。

这工作得很好(一些与系统母版页相关的问题,但这超出了范围)。

但是,我们对以下实施方式进行了一些更改 theme.css 文件。由于复合外观引擎的原因,在再次应用主题之前,此文件中的更改不会反映出来。

由于门户中有很多区域,因此在所有子站点上手动重新生成主题是不可能的。

有什么办法强制主题再生吗?

如果需要,可以使用 powershell 脚本。我尝试了一下:

function ReapplyTheme{
    param(
        [Microsoft.SharePoint.SPWeb]$Web
    )

    $file=$web.GetFile($web.ServerRelativeUrl.TrimEnd('/') + "/_catalogs/theme/15/Palette_rouge.spcolor")
    $theme=[Microsoft.SharePoint.Utilities.SPTheme]::Open("Name of my theme", $file)
    $theme.ApplyTo($web, $false)

}

但是这个脚本破坏了子站点。此外,调色板和主题名称是硬编码的......也许有地方可以照顾价值观?

有帮助吗?

解决方案

我看到您设法使用 PowerShell 脚本并检查是否应用了主题等解决了问题。

不过仅供您参考,在 SPTheme 类上您可以找到一些静态方法:

  • 要获取当前主题,可以使用静态方法OpenAppliedTheme
  • 要重新生成它们的主题样式,您可以使用静态方法 EnforceThemedStylesForWeb
  • 或者您可以简单地使用 ApplyTo 方法重新应用当前主题

当然,您也可以在 PowerShell 脚本中使用这些方法。

public static void ReapplyCurrentComposedLook(SPWeb web)
{
  // try to get the currently applied theme
  SPTheme theme = SPTheme.OpenAppliedTheme(web);
  if (theme == null)
  {
    // return if no theme is applied
    return;
  }

  // reinforce the styles for the web..
  SPTheme.EnforceThemedStylesForWeb(web);

  // .. or simply reapply the whole theme.
  theme.ApplyTo(web, true);
}

其他提示

我终于让我的剧本进化了。

基本上,在每个子网站中,我都会按照顺序“0”来处理组合外观,这是当前主题。我还检查 Web 对象的属性,以检查 Web 是否设置为继承其父对象。

使用找到的组合外观中的数据,我可以重新生成它们。

看起来效果很好。

这是脚本:

#requires -PSSnapin Microsoft.SharePoint.PowerShell

param(
    [Parameter(Mandatory = $true, Position=0, ParameterSetName='SPSite')]
    [Microsoft.SharePoint.PowerShell.SPSitePipeBind]$Site,
    [Parameter(Mandatory = $true, Position=0, ParameterSetName='SPWeb')]
    [Microsoft.SharePoint.PowerShell.SPWebPipeBind]$Web,
    [Parameter(Position=1)]
    [Switch]$Recurse=$true
    #TODO: add argument to allow specify a specific theme, instead of regenerating it
)

$actualWeb = if(-Not $Web) {
    $site.Read().RootWeb
} else{
    $Web.Read()
}


function Get-ThemeData{
    param(
        [Parameter(Mandatory=$true)]
        [Microsoft.SharePoint.SPWeb]$Web
    )


    $designList = $Web.GetList($web.ServerRelativeUrl.TrimEnd('/') + "/_catalogs/design")
    $query = New-Object Microsoft.SharePoint.SPQuery
    $query.ViewFieldsOnly = $true
    $query.ViewFields = "<FieldRef Name='ThemeUrl' /><FieldRef Name='ImageUrl' /><FieldRef Name='FontSchemeUrl' />"
    $query.Query = "<Where><Eq><FieldRef Name='DisplayOrder' /><Value Type='Number'>0</Value></Eq></Where>";

    $designItem = $designList.GetItems($query)[0]

    $resultProperties = @{
        "Web" = $Web.ServerRelativeUrl
        "FontSchemeUrl" = $designItem["FontSchemeUrl"]
        "ThemeUrl" = $designItem["ThemeUrl"]
        "ImageUrl" = $designItem["ImageUrl"]
        "InheritsThemedCssFolderUrl" = [bool]::Parse($web.AllProperties["__InheritsThemedCssFolderUrl"])
        "InheritsCustomMasterUrl" = [bool]::Parse($web.AllProperties["__InheritsCustomMasterUrl"])
        "InheritsMasterUrl" = [bool]::Parse($web.AllProperties["__InheritsMasterUrl"])
        MasterUrl=$web.MasterUrl
        CustomMasterUrl=$web.CustomMasterUrl
    }

    New-Object PSObject -Property $resultProperties 
}

function Process-SPWeb{
    param(
        [Parameter(Mandatory=$true)]
        [Microsoft.SharePoint.SPWeb]$Web
    )
    Write-Host "Traitement de $($web.ServerRelativeUrl)"

    $themeData = Get-ThemeData $Web

    if(-not $themeData.InheritsThemedCssFolderUrl){
        $color = if($themeData.ThemeUrl) { $web.GetServerRelativeUrlFromUrl((New-Object Microsoft.SharePoint.SPFieldUrlValue($themeData.ThemeUrl)).Url) }
        $font = if($themeData.FontSchemeUrl) { $web.GetServerRelativeUrlFromUrl((New-Object Microsoft.SharePoint.SPFieldUrlValue($themeData.FontSchemeUrl)).Url) }
        $image = if($themeData.ImageUrl) { $web.GetServerRelativeUrlFromUrl((New-Object Microsoft.SharePoint.SPFieldUrlValue($themeData.ImageUrl)).Url) }


        $web.ApplyTheme($color,$font,$image, $false)
        $web2 = Get-SPWeb $web.url
        $web2.MasterUrl = $themeData.MasterUrl
        $web2.CustomMasterUrl = $themeData.CustomMasterUrl
        $web2.Update()
        $web2.Dispose()

        Write-Warning "Thème regénéré sur $($web.ServerRelativeUrl)"
    }

    if($Recurse){
        $Web.Webs | % { Process-SPWeb $_ }

    }

}


Process-SPWeb $actualWeb
许可以下: CC-BY-SA归因
scroll top