Cuando se necesita cambiar el tema actual de un sitio web, teniendo en cuenta los temas disponibles localmente (tambien podemos tener temas globales pero eso es otro tema) o sea en el App_Theme deberiamos en un sector administrativo (el famoso sector privado) poder tener control de los temas (carpetas en App_Themes) para seleccionar y luego modificarlo permanentemente en el web.config
La idea…
Si tenemos un website de ejemplo con unos Themes (si lo quieres descargar al ejemplo click aqui)
Y en nuestro sector de administracion queremos algo asi
La demo consta de
Obtener Listado de Temas Locales a la aplicación web
Aqui solamente tendremos que listar los directorios en la carpeta App_Themes (para temas locales). Nos ayudamos con una funcion compartida (shared) o metodo de clase…
Public Shared Function TemasListado() As List(Of String)
Dim temas As New List(Of String)
'Enumerar
If (Directory.Exists(Current.Server.MapPath("~/App_Themes"))) Then
Dim subDirectorios() As String = Directory.GetDirectories(Current.Server.MapPath("~/App_Themes"))
For Each d As String In subDirectorios
Dim dirInfo As New DirectoryInfo(d)
temas.Add(dirInfo.Name)
Next
End If
Return temas
End Function
Tendriamos que pensar la estrategia cuando no tengamos temas disponibles.. esa parte lo dejo al lector :)
Para luego enlazarla al combo/dropdownlist:
ddlTemas.DataSource = TemasHelper.TemasListado
ddlTemas.DataBind()
ddlTemas.SelectedValue = TemasHelper.TemaActual
y ahora? como Obtener el tema actual?
Obtener Tema Actual
Aqui podremos consultar a la propiedad Page.Theme, pero como estas cambiando el tema al todo el sitio web (es la idea) tendriamos que obtener el valor desde el web.config. Nuevamente nos ayudamos por una clase helper para consultarla mas “comodamente”
Aqui obtenemos el archivo de configuracion web, la seccion de Pages (PagesSection)
Imports Microsoft.VisualBasic
Imports System.Web.Configuration
Imports System.IO
Imports System.Web.HttpContext
....
Public Shared Function TemaActual() As String
Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~")
Dim seccion As PagesSection = CType(webConfig.GetSection("system.web/pages"), PagesSection)
Return seccion.Theme.ToString
End Function
Aqui el articulo de como leer/obtener propiedades de secciones del web.config nos puede ayudar
Guardar la modificacion del tema actual
Para guardar… algo parecido al obtener, pero aqui nos ayudamos por los metodos Save y SaveAs. En este caso particular tendremos que modificar con el metodo Save
Imports Microsoft.VisualBasic
Imports System.Web.Configuration
Imports System.IO
Imports System.Web.HttpContext
...
Public Shared Sub TemaCambiar(ByVal tema As String)
Dim webConfig As Configuration = WebConfigurationManager.OpenWebConfiguration("~") 'WebConfigurationManager.OpenWebConfiguration("/web.config")
Dim seccion As PagesSection = CType(webConfig.GetSection("system.web/pages"), PagesSection)
seccion.Theme = tema
webConfig.Save()
End Sub
NOTA 1: Temas Local y Tema Global ??
Aqui el ejemplo utilizo temas locales, tambien se puede configurar temas globales, es decir comunes para todos los sitios. Esto se realiza en la carpeta:
iisdefaultroot\aspnet_client\system_web\version\Themes
Nos podremos ayudar con la propiedad HttpRuntime.AspClientScriptVirtualPath
Aqui un articulo sobre el tema de Luis Ruiz Pavon
NOTA 2: Guardar tema en el profile del usuario, y asignar a la pagina actual
Un articulo como personalizar las paginas que nos puede orientar como guardar un tema en el profile del usuario
NOTA 3: Privilegios necesarios
(…from MSDN)Para abrir una sección en un archivo de configuración Web, la aplicación necesita permiso de Lectura para el archivo físico Web.config y para todos sus archivos principales en la jerarquía. Las aplicaciones de código administrado necesitan tener permiso para leer las secciones del sistema. Las aplicaciones de plena confianza y de gran confianza tienen estos permisos de forma predeterminada. En otras palabras, de forma predeterminada, las aplicaciones de media y baja confianza no podrán leer secciones de configuración.(…)
NOTA 4: Importante! Actualizacion del tema de la pagina para para la peticion actual (idem Nota 2)
Este cambio solamente lo utilizo en el sitio de administracion (fue la idea original), para luego ir al sitio ”Publico” y ver que el cambio se efectuo en el web.config.
No lo vamos a tener disponible hasta la proxima peticion de la pagina. Ya que el tema se enlaza a la pagina en el evento PreInit.
(…)La propiedad Theme debe establecerse antes del evento PreInit; si se establece la propiedad Theme después del evento PreInit, se producirá una excepción InvalidOperationException.(…)
Por eso en el ejemplo, si queremos visualizar el cambio tendriamos que volver a resfrescar…aqui nos ayudamos con un Redirect (pero es una tips simplemente)
Protected Sub btnCambiar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCambiar.Click
Dim temaNuevo As String = ddlTemas.SelectedValue
TemasHelper.TemaCambiar(temaNuevo)
'Para que tome el cambio algo un refresh de la pagina
Response.Redirect(Request.Path)
End Sub
Descargar Demo
Si no puedes ver la imagen de descarga click aqui
Enlaces
Comparte este post: