كيفية تجديد نظرة مركب عندما تتطور المغلق مواضيعية?
-
29-09-2020 - |
سؤال
في موقع نشر الشركات ، نستخدم المظهر المركب للسماح لمديري المواقع باختيار نظام ألوان ذي علامة تجارية.
في الأساس ، قمنا بوضع علامة على البوابة باستخدام ملفين كس.A main.css
الملف الذي يحتوي على معظم القواعد ، والذي يقع في Style library
.وآخر theme.css
يحتوي على جميع القواعد التي تعتمد على الموضوع.
لذلك يمكن للمستخدمين اختيار نظام الألوان الخاص بهم باستخدام قائمة" تغيير المظهر " في إعدادات الموقع.
هذا يعمل بشكل جيد جدا (بعض غوتشاس المتعلقة الصفحة الرئيسية للنظام ، ولكن هذا خارج النطاق).
ومع ذلك ، لدينا بعض التغييرات على الأدوات في theme.css
ملف.بسبب محرك المظهر المركب ، لن تنعكس التغييرات في هذا الملف حتى يتم تطبيق السمة مرة أخرى.
نظرا لوجود العديد من المناطق في البوابة ، فمن غير الوارد إعادة إنشاء السمة يدويا في جميع المواقع الفرعية.
هل هناك أي طريقة لإجبار تجديد الموضوع?
إذا لزم الأمر ، يمكن استخدام برنامج نصي بوويرشيل.أعطى المحاولة:
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)
}
لكن هذا البرنامج النصي يكسر الموقع الفرعي.علاوة على ذلك ، يتم ترميز لوحة الألوان واسم السمة...ربما هناك مكان لرعاية القيم?
المحلول
أرى أنك تمكنت من حل المشكلة باستخدام البرنامج النصي بوويرشيل والتحقق مما إذا كان يتم تطبيق موضوع ، وما إلى ذلك.
فقط لمعلوماتك على الرغم من ، على فئة سبتيم يمكنك أن تجد بعض الأساليب الثابتة:
- للحصول على السمة الحالية ، يمكنك استخدام الأسلوب الثابت أوبن أبليدثيم
- لتجديد لهم أنماط تحت عنوان يمكنك استخدام أسلوب ثابت إنفوسيثيمدستيلزفورويب
- أو يمكنك ببساطة إعادة تطبيق السمة الحالية باستخدام طريقة أبليتو
بالطبع يمكنك استخدام هذه الأساليب في البرنامج النصي بوويرشيل الخاص بك كذلك.
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