Wie regeneriert man das zusammengesetzte Erscheinungsbild, wenn sich ein themenfähiges CSS entwickelt?
-
29-09-2020 - |
Frage
Auf einer Corporate-Publishing-Site verwenden wir zusammengesetzte Looks, um Site-Managern die Auswahl eines Markenfarbschemas zu ermöglichen.
Grundsätzlich haben wir das Portal mithilfe von zwei CSS-Dateien gebrandet.A main.css
Datei, die die meisten Regeln enthält und sich in der Datei befindet Style library
.Und ein anderer theme.css
das alle Regeln enthält, die vom Thema abhängig sind.
So können die Benutzer ihr Farbschema über das Menü „Erscheinungsbild ändern“ in den Site-Einstellungen auswählen.
Das funktioniert ganz gut (einige Fallstricke im Zusammenhang mit der Systemmasterseite, aber das würde den Rahmen sprengen).
Wir haben jedoch einige Änderungen an den Geräten vorgenommen theme.css
Datei.Aufgrund der Composite-Look-Engine werden die Änderungen in dieser Datei erst wirksam, wenn das Design erneut angewendet wird.
Da es im Portal viele Bereiche gibt, kommt es nicht in Frage, das Theme auf allen Unterseiten manuell neu zu generieren.
Gibt es eine Möglichkeit, die Neugenerierung des Themas zu erzwingen?
Bei Bedarf kann ein Powershell-Skript verwendet werden.Ich habe es versucht:
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)
}
Aber dieses Skript zerstört die Unterseite.Darüber hinaus sind die Farbpalette und der Themenname fest codiert ...Vielleicht gibt es einen Ort, an dem man sich um die Werte kümmern kann?
Lösung
Wie ich sehe, ist es Ihnen gelungen, das Problem mithilfe des PowerShell-Skripts und der Überprüfung, ob ein Design angewendet wird usw., zu lösen.
Nur zu Ihrer Information: In der SPTheme-Klasse finden Sie einige statische Methoden:
- Um das aktuelle Theme abzurufen, können Sie die statische Methode OpenAppliedTheme verwenden
- Um die thematischen Stile neu zu generieren, können Sie die statische Methode EnforceThemedStylesForWeb verwenden
- Oder Sie können das aktuelle Thema einfach mit der ApplyTo-Methode erneut anwenden
Natürlich können Sie diese Methoden auch in Ihrem PowerShell-Skript verwenden.
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);
}
Andere Tipps
Endlich habe ich mein Drehbuch weiterentwickelt.
Grundsätzlich kümmere ich mich in jedem Subweb um den komponierten Look mit der Reihenfolge „0“, also dem aktuellen Theme.Ich überprüfe auch die Eigenschaften des Webobjekts, um zu überprüfen, ob das Web so eingerichtet ist, dass es sein übergeordnetes Objekt erbt oder nicht.
Mithilfe der Daten aus dem gefundenen zusammengesetzten Look kann ich sie neu generieren.
Scheint ganz gut zu funktionieren.
Hier ist das Skript:
#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