Pregunta

En un sitio de publicación corporativa, utilizamos apariencias compuestas para permitir a los administradores del sitio elegir una combinación de colores de marca.

Básicamente, hemos marcado el portal con dos archivos CSS.A main.css archivo que contiene la mayoría de las reglas y que se encuentra en el Style library.Y otro theme.css que contiene todas las reglas que dependen del tema.

De modo que los usuarios pueden elegir su combinación de colores utilizando el menú "Cambiar apariencia" en la configuración del sitio.

Esto está funcionando bastante bien (algunos errores relacionados con la página maestra del sistema, pero están fuera de alcance).

Sin embargo, tenemos algunos cambios en las implementaciones en el theme.css archivo.Debido al motor de apariencia compuesta, los cambios en este archivo no se reflejarán hasta que se aplique nuevamente el tema.

Debido a que hay muchas áreas en el portal, no es posible regenerar manualmente el tema en todos los subsitios.

¿Hay alguna forma de forzar la regeneración del tema?

Si es necesario, se puede utilizar un script de PowerShell.Lo intenté:

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)

}

Pero este script rompe el subsitio.Además, la paleta de colores y el nombre del tema están codificados...¿Quizás haya algún lugar para cuidar los valores?

¿Fue útil?

Solución

Veo que lograste resolver el problema usando el script de PowerShell y verificando si se aplica un tema, etc.

Sólo para tu información, en la clase SPTheme puedes encontrar algunos métodos estáticos:

  • Para obtener el tema actual, puede utilizar el método estático OpenAppliedTheme
  • Para regenerar los estilos temáticos puedes usar el método estático EnforceThemedStylesForWeb
  • O simplemente podrías volver a aplicar el tema actual usando el método ApplyTo.

Por supuesto, también puedes utilizar estos métodos en tu script de 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);
}

Otros consejos

Finalmente hice que mi guión evolucionara.

Básicamente, en cada subweb cuido el aspecto compuesto con orden "0", que es el tema actual.También verifico las propiedades del objeto web para comprobar si la web está configurada para heredar su padre o no.

Usando los datos del aspecto compuesto encontrado, puedo regenerarlos.

Parece funcionar bastante bien.

Aquí está el guión:

#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
Licenciado bajo: CC-BY-SA con atribución
scroll top