Wie regeneriert man das zusammengesetzte Erscheinungsbild, wenn sich ein themenfähiges CSS entwickelt?

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/106141

  •  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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top