miércoles, 30 de junio de 2010

Ocultar zonas de páginas según criterios

En ocasiones me han pedido poder mostrar u ocultar contenidos en SharePoint según diferentes criterios y, en función de lo que se quisiera en cada momento, la solución era una u otra. Voy a empezar este artículo hablando de esas diferentes posibilidades con algún ejemplo práctico.

1. Elementos web según el grupo al que pertenezca el usuario. Éste es el ejemplo más típico y se puede resolver mediante el uso de audiencias de SharePoint. No requiere desarrollo y se puede automatizar su creación y su mantenimiento por lo que no representa un gran reto. Podríamos usar este método, por ejemplo, para mostrar una lista de documentos diferente para cada grupo de usuarios dentro de una misma página.

2. Zonas de página según los permisos que tenga el usuario. También bastante típico y resoluble mediante el uso del control SPSecurityTrimmedControl. Tampoco requiere desarrollo pero necesitamos modificar la página maestra o la plantilla de página donde necesitemos este comportamiento. Un ejemplo muy típico es añadir en una página de publicación un enlace para administrar contenidos relacionados que aparezca únicamente cuando se tienen permisos de edición.

3. Zonas de página en función de que el usuario esté autenticado o no. Algunos de los elementos web que estamos acostumbrados a utilizar incorporan en su código algunas líneas que hacen que el contenido se muestre únicamente cuando el usuario está autenticado o viceversa pero, ¿qué pasa si lo que queremos tratar son elementos web estándar como por ejemplo listas, consultas o editores de contenido? ¿y qué pasa si lo que queremos ocultar es la navegación? ¿y si el criterio no es que estén autenticados o no, sino un parámetro del QueryString?

Para responder a éstas o a otras preguntas (siempre he querido decir esto) he pensado un ejemplo simple pero fácilmente extensible.

Escenario: queremos una vista simplificada de páginas de SharePoint para incrustarlas en otra aplicación web (SharePoint o no) sin que aparezca la navegación ni ningún elemento más que el contenido que queremos mostrar.

La solución que he pensado sería algo que permitiese que si tengo una página como la de la siguiente figura:

image
pudiera transformarse, pasándole un parámetro en algo como:

image
De esa manera, podré poner, allá donde quiera, un iframe (o en una ventana emergente) con la url parametrizada.

Lo primero que tenemos que hacer es crear un control web contenedor que utilizaremos para esconder a nuestro antojo todo lo que se encuentre en su interior.

[ToolboxData("<{0}:ContentTrimmer runat=server></{0}:ContentTrimmer>")]
[ParseChildren(false)]
public class ContentTrimmer : WebControl
{
   public string QueryStringParameterName { get; set; }
 
   protected override void Render(HtmlTextWriter writer)
   {
       if (Page.Request.QueryString[this.QueryStringParameterName] == null)
       {
           base.Render(writer);
       }
   }
}

Ahora necesitaríamos desplegar este elemento web en nuestra granja. Voy a saltarme todos los pasos necesarios para hacerlo para no alargar demasiado el artículo, pero no dudo que podréis encontrar la información necesaria para hacerlo si os hace falta.

Una vez hecho, podremos ir a nuestra página maestra y registrar el control que acabamos de desplegar. Para hacer esto, y dando por hecho que sabéis la firma de vuestro ensamblado, deberíais añadir al principio de la página algo similar a lo siguiente:

<%@ Register Tagprefix="MyControls" Namespace="MyControls" Assembly="MyControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1234567890abcdef" %>

Finalmente, deberíamos buscar, a lo largo de toda nuestra página maestra, todos aquellos elementos que queremos ocultar a nuestro antojo, y rodearlos por el siguiente código:

<MyControls:ContentTrimmer QueryStringParameterName="simple" runat="server">
 
   <!-- Controles a ocultar aquí -->
 
</MyControls:ContentTrimer>

Ahora, una vez guardada la página maestra, si añadimos a nuestras direcciones el parámetro simple, todo aquello que se encuentre dentro de nuestro control no se mostrará. Tened en cuenta que podemos añadir a nuestra página maestra (o plantillas de página) todos los contenedores - con el mismo parámetro o no – que queramos.

Esto no es una novedad de SharePoint 2010, pero un detalle importante es el hecho que usando esta versión del producto podemos utilizar las mismas páginas maestras para páginas de contenido y de administración, con lo que la solución aplicará a muchas más partes del portal que antes.

Para concluir, tal y como decía al inicio del ejemplo, esto es únicamente la idea base. El criterio puede complicarse tanto como se desee. Se puede añadir un hash para mostrar un contenido únicamente a personas a las que previamente habéis enviado la url por correo, se puede validar al usuario contra un sistema externo, se puede mostrar un contenido diferente según la fecha, etc.

4 comentarios:

Anónimo dijo...

DAMA, la imágen de las 2 páginas es la misma...

David Martos dijo...

Gracias! creo que ya lo he solucionado.

Anónimo dijo...

Si solo quiero ocultar controles en una sola página sin que afecte mi sitio ¿se puede?

Menda dijo...

Sí, claro que puedes. Eso sí, la página en cuestión deberá tener alguna particularidad. Yo, por ejemplo, me plantearía utilizar una plantilla de página diferente para aquella página donde quieres que se produzca el efecto e introducir el control al que hace referencia el artículo en esa página concreto.