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?

È stato utile?

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top