Как восстановить составной вид при развитии тематического CSS?

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

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top