Come rigenerare lo sguardo composito quando si evolve un CSS tematico?
-
29-09-2020 - |
Domanda
In un sito editoriale aziendale, stiamo utilizzando il look composito per consentire ai responsabili del sito di scegliere una combinazione di colori di marca.
Fondamentalmente, abbiamo marchiato il portale usando due file CSS. Un file main.css
che contiene la maggior parte delle regole e che si trova nel Style library
. E un altro theme.css
che contiene tutte le regole che dipendono dal tema.
Quindi gli utenti possono scegliere la propria combinazione di colori usando il menu "Cambia aspetto" nelle impostazioni del sito.
Questo funziona abbastanza bene (alcuni Gotchas relativi alla pagina Master di sistema, ma questo è fuori portata).
Tuttavia, abbiamo alcune modifiche agli attrezzi nel file theme.css
. A causa del motore del look composito, le modifiche in questo file non si rifletteranno fino a quando il tema non viene applicato di nuovo.
Poiché ci sono molte aree del portale, è fuori questione per rigenerare manualmente il tema su tutti i siti secondari.
C'è un modo per forzare la rigenerazione del tema?
Se necessario, è possibile utilizzare uno script PowerShell. Ho provato un tentativo:
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)
}
.
Ma questo script rompe la ribalta. Inoltre, la tavolozza dei colori e il nome del tema sono hardcoded ... Forse c'è da qualche parte per prendersi cura dei valori?
Soluzione
Vedo che sei riuscito a risolvere il problema utilizzando lo script di PowerShell e controllare se viene applicato un tema, ecc.
Solo per le tue informazioni però, sulla classe Sptheme puoi trovare alcuni metodi statici:
- .
- Per ottenere il tema corrente, è possibile utilizzare il metodo statico OpenAppLiedHeme
- Per rigenerare gli stili a tema è possibile utilizzare il metodo statico EnforcethemeMedstylesforWeb
- o potresti semplicemente riapplicare il tema corrente usando il metodo Applicatore
Ovviamente è possibile utilizzare anche questi metodi nello 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);
}
. Altri suggerimenti
Alla fine ho fatto evolve il mio script.
Fondamentalmente, in ciascun SubWeb Guardo il look composto con ordine "0", che è il tema corrente.Controllo anche le proprietà dell'oggetto Web per verificare se il Web è configurato per eredita il suo genitore o meno.
Usando i dati dall'aspetto composto da Trovato, posso rigenerare i loro.
sembra funzionare abbastanza bene.
Ecco lo script:
#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
.