Question

Dans un site de publication d'entreprise, nous utilisons des looks composites pour permettre aux gestionnaires de site de choisir une palette de couleurs de marque.

Fondamentalement, nous avons marqué le portail à l'aide de deux fichiers CSS.UN main.css fichier qui contient la plupart des règles, et qui se trouve dans le Style library.Et un autre theme.css qui contient toutes les règles qui dépendent du thème.

Ainsi, les utilisateurs peuvent choisir leur palette de couleurs à l'aide du menu « Modifier l'apparence » dans les paramètres du site.

Cela fonctionne plutôt bien (quelques pièges liés à la page maître du système, mais c'est hors de portée).

Cependant, nous avons apporté quelques changements aux outils dans le theme.css déposer.En raison du moteur d'apparence composite, les modifications apportées à ce fichier ne seront reflétées que lorsque le thème sera à nouveau appliqué.

Comme il existe de nombreuses zones dans le portail, il est hors de question de régénérer manuellement le thème sur tous les sous-sites.

Existe-t-il un moyen de forcer la régénération du thème ?

Si nécessaire, un script PowerShell peut être utilisé.J'ai essayé :

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)

}

Mais ce script casse le sous-site.De plus, la palette de couleurs et le nom du thème sont codés en dur...Peut-être y a-t-il un endroit pour s'occuper des valeurs ?

Était-ce utile?

La solution

Je vois que vous avez réussi à résoudre le problème en utilisant le script PowerShell et en vérifiant si un thème est appliqué, etc.

Juste pour votre information, sur la classe SPTheme, vous pouvez trouver quelques méthodes statiques :

  • Pour obtenir le thème actuel, vous pouvez utiliser la méthode statique OpenAppliedTheme
  • Pour régénérer les styles thématiques, vous pouvez utiliser la méthode statique EnforceThemedStylesForWeb
  • Ou vous pouvez simplement réappliquer le thème actuel à l'aide de la méthode ApplyTo.

Bien entendu, vous pouvez également utiliser ces méthodes dans votre script 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);
}

Autres conseils

J'ai enfin fait évoluer mon scénario.

Fondamentalement, dans chaque sous-site Web, je m'occupe du look composé avec l'ordre "0", qui est le thème actuel.Je vérifie également les propriétés de l'objet Web pour vérifier si le Web est configuré pour hériter de son parent ou non.

En utilisant les données du look composé trouvé, je peux les régénérer.

Il semble que cela fonctionne plutôt bien.

Voici le scénario :

#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
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top