У меня было подобное требование однажды. В моем случае они хотели, чтобы пользователи могли изменять «цветовую разметку» портала MOSS (поэтому разметка и шрифты были одинаковыми, но цвет фона и цвета изображений были разными в каждой теме). Я создал «базовую тему», которая включала полный макет (одна из предоставленных тем) в виде одного файла CSS. Затем я создал дополнительные темы, такие как «blue.css», «red.css», «green.css» и так далее, и поместил все эти файлы в portal/ourthemes/
.
Мы хотели, чтобы пользователи могли выбирать свою тему, поэтому мы создали новое свойство профиля пользователя "CurrentTheme" (Центр администрирования Sharepoint -> Общие службы -> Профили и свойства пользователя -> Добавить свойство профиля), которое было определено как строка с предопределенным списком вариантов.
Затем я создал простой элемент управления ASP.Net, который отображается как
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
Dim oProf As Microsoft.Office.Server.UserProfiles.UserProfile = Microsoft.Office.Server.UserProfiles.ProfileLoader.GetProfileLoader.GetUserProfile()
Dim UserTheme As String
Try
If oProf.Item("CurrentTheme") IsNot Nothing Then
UserTheme = oProf.Item("CurrentTheme").Value.ToString()
Else
UserTheme = "blue"
End If
Catch ex As Exception
'shouldn't fail if we don't know the value
UserTheme = "blue" 'a default value for users who dont have a theme yet
End Try
writer.WriteLine("<link rel='stylesheet' type='text/css' href='/portal/ourthemess" & Trim(UserTheme) & ".css' />")
End Sub
(Отказ от ответственности: реальный код был немного длиннее, потому что мы использовали кэширование для каждого пользователя, чтобы избежать чтения свойства из UserProfile
каждый раз, когда пользователь загружал страницу)
Затем я помещаю этот элемент управления на главную страницу, созданную для этого портала.
РЕДАКТИРОВАТЬ: Чтобы сделать кеширование, мы создали ключ кеша, который содержит имя пользователя и хранит сгенерированный текст там. Результат был примерно таким:
Dim KeyName As String = Page.User.Identity.Name & "_CurrentTheme"
If (Not Me.Page.Cache.Item(KeyName) Is Nothing) Then
writer.Write(Page.Cache.Item(KeyName).ToString)
Else
'...code posted previously goes in here
'at the end
Me.Page.Cache.Add(KeyName, _
AllContentRenderedInPreviousCodeAsString, _
Nothing, _
Caching.Cache.NoAbsoluteExpiration, _
Caching.Cache.NoSlidingExpiration, _
Caching.CacheItemPriority.Low, Nothing)
End If