Как восстановить составной вид при развитии тематического CSS?
-
29-09-2020 - |
Вопрос
На корпоративном издательском сайте мы используем составной внешний вид, чтобы позволить менеджерам сайтов выбирать фирменную цветовую схему.
По сути, мы брендировали портал, используя два CSS-файла.А main.css
файл, содержащий большинство правил и расположенный в папке Style library
.И другой theme.css
который содержит все правила, зависящие от темы.
Таким образом, пользователи могут выбрать свою цветовую схему с помощью меню «Изменить внешний вид» в настройках сайта.
Это работает довольно хорошо (некоторые ошибки связаны с главной страницей системы, но это выходит за рамки).
Однако у нас есть некоторые изменения в орудиях в theme.css
файл.Из-за механизма составного просмотра изменения в этом файле не будут отражены до тех пор, пока тема не будет применена снова.
Поскольку на портале много областей, невозможно вручную воссоздать тему на всех подсайтах.
Есть ли способ принудительно перегенерировать тему?
При необходимости можно использовать сценарий PowerShell.Я попробовал:
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)
}
Но этот скрипт ломает дочерний сайт.Более того, цветовая палитра и название темы жестко запрограммированы...Может быть, есть где присмотреть за ценностями?
Решение
Я вижу, вам удалось решить проблему с помощью сценария PowerShell и проверки применения темы и т. д.
Просто для вашей информации: в классе SPTheme вы можете найти несколько статических методов:
- Чтобы получить текущую тему, вы можете использовать статический метод OpenAppliedTheme.
- Чтобы восстановить их тематические стили, вы можете использовать статический метод EnforceThemedStylesForWeb.
- Или вы можете просто повторно применить текущую тему, используя метод ApplyTo.
Конечно, вы также можете использовать эти методы в своем сценарии 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);
}
Другие советы
Наконец-то я доработал свой сценарий.
По сути, в каждом веб-сайте я смотрю составной вид с порядком «0», который является текущей темой.Я также проверяю свойства веб-объекта, чтобы проверить, настроена ли сеть на наследование своего родителя или нет.
Используя данные из найденного составленного образа, я могу их восстановить.
Кажется, работает вполне хорошо.
Вот сценарий:
#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