WebPart con foto para Conjunto de Documentos

marzo 17, 2012
By

Una de las nuevas características de SharePoint 2010 son los Conjuntos de Documentos. Si bien a primera vista puede parecer que Microsoft ha puesto solo un poco de cosmética en las ya existentes Carpetas, en realidad ha puesto algo más. De hecho, los Conjuntos de Documentos tienen su tipo de contenido propio, por lo que al trabajar con ellos se tienen todos los beneficios asociados a los Tipos de Contenido. Es decir, que además del nombre del conjunto de documentos (lo que sería el nombre de la carpeta) se pueden definir tantos metadatos como se necesiten agregando columnas al tipo de contenido en cuestión. Luego este tipo de contenido podrá agregarse a aquellas Bibliotecas de Documentos donde se necesite.

En algunos casos, entre las columnas de un Conjunto de Documentos pueden tenerse campos de tipo Usuario (SPUser). Por ejemplo, imagínese que se ha definido un tipo de contenido Facturas basado en un Conjunto de Documentos, con el objetivo de agrupar los documentos relacionados a la facturación de los clientes en una empresa. El tipo de contenido Facturas podría incluir entre sus columnas un campo Cliente de tipo Usuario para indicar el cliente al cual corresponden las facturas del conjunto de documentos. Asumiendo que cada cliente tiene su perfil en SharePoint actualizado, incluida su foto, resultaría útil visualizar la foto del cliente junto con sus facturas en la vista del conjunto de documentos. Como lograr esto será lo que veremos a continuación.

De manera predeterminada, en la vista de un Conjunto de Documentos, se muestra en la esquina superior izquierda una imagen estática, común a todos los conjuntos de documentos de la biblioteca. Nuestra tarea es reemplazar esta imagen estática por la foto del cliente al cual pertenecen las facturas del conjunto de documentos.

inicio

La buena noticia es que la página de bienvenida que muestra la vista de los documentos de un conjunto está basada en WebParts. De hecho, la imagen estática que se muestra no es más que el WebPart Image Viewer configurado con la ruta a esta imagen en particular.

welcompage-webparts

Aunque en un primer momento podríamos pensar en modificar la ruta de la imagen que se muestra por la ruta de la foto en el perfil del usuario del cliente, esto no resolvería nuestro problema, pues se usaría la misma imagen para todos los conjuntos de documentos del tipo Facturas. Necesitamos entonces una forma de generar la ruta a la foto del perfil del usuario dinámicamente, según el valor que tenga el campo Cliente del conjunto de documentos.

Aunque existen varias formas de lograr esto, la que se presenta a continuación es la que a mi jucio resulta más simple y permite su reuso para cualquier Conjunto de Documentos que defina algún campo de tipo Usuario. Se trata de crear nuestro propio WebPart para mostrar la foto del usuario.

Para ello se deberá crear un VisualWebPart que llamaremos DocumentSetPhotoWebPart. Seguidamente debe agregarse el siguiente código al control de usuario DocumentSetPhotoWebPartUserControl.ascx.

<asp:Image ID="userPhoto" runat="server" ImageUrl="/_layouts/images/O14_person_placeHolder_192.png" />

El valor de la propiedad ImageUrl corresponde a la imagen que se usará cuando el usuario no tenga definida ninguna foto en su perfil, que es además la imagen que usa SharePoint de manera predeterminada para este mismo fin, en el perfil de los usuarios.

Antes de pasar al código del WebPart, algo a considerar es cómo indicar el campo de tipo Usuario, de modo que el WebPart tenga acceso a su valor. Para hacer este WebPart reusable, definiremos una propiedad UserFieldName, para indicar el nombre del campo de tipo Usuario cuya foto se mostrará en el conjunto de documentos.

[WebBrowsable(true),
 WebDisplayName("User Field Name"),
 Category("Miscellaneous"),
 WebDescription("Field should be listed on Welcome Page"),
 Personalizable(PersonalizationScope.Shared)]
 public string UserFieldName { get; set; }

Otra consideración antes de pasar a implementar el WebPart, es cómo acceder al valor de este campo de tipo Usuario indicado en la propiedad anterior. Para ello se necesita acceso al elemento de tipo Facturas (conjunto de documentos) que se está visualizando. Podría recurrirse a la URL, extraer el ID y recuperar el conjunto de documentos en la Biblioteca de Documentos, sin embargo existe una forma más simple de lograr esto. Se trata de la clase DocumentSetBaseWebPart.

La clase  DocumentSetBaseWebPart presenta la propiedad DocumentSetItem que permite acceder al elemento de tipo Conjunto de Documentos y a sus propiedades y columnas. Por ello, nuestro WebPart DocumentSetPhotoWebPart heredará de esta clase base, para tener acceso a las propiedades del Conjunto de Documentos. En el método CreateChildControls tendremos el siguiente código para obtener la foto del perfil del usuario. Por simplicidad no se ha incluido el código relacionado con el manejo de excepciones.

protected override void CreateChildControls()
{
    DocumentSetPhotoWebPartUserControl control = Page.LoadControl(_ascxPath) as DocumentSetPhotoWebPartUserControl;

    SPServiceContext context = SPServiceContext.GetContext(SPContext.Current.Site);
    UserProfileManager profileManager = new UserProfileManager(context);            

    foreach (SPField spField in DocumentSetTemplate.GetDocumentSetTemplate(this.DocumentSetItem.ContentType).WelcomePageFields)
    {
        if (this.DocumentSetItem[spField.Id] != null && spField.Title == UserFieldName)
        {
            SPFieldUserValue user = (SPFieldUserValue)(spField.GetFieldValue(this.DocumentSetItem[spField.Id].ToString()));
            UserProfile profile = profileManager.GetUserProfile(user.User.LoginName);
            control.DisplayName = profile.DisplayName;
            control.UserPhotoUrl = profile[PropertyConstants.PictureUrl].Value as string;
            break;
        }

        Controls.Add(control);
    }
}

El código anterior asume que el control de usuario DocumentSetPhotoWebPartUserControl presenta las propiedades DisplayName y UserPhotoUrl. A continuación se muestra el código de la clase DocumentSetPhotoWebPartUserControl.

public partial class DocumentSetPhotoWebPartUserControl : UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(UserPhotoUrl))
        {
            userPhoto.ImageUrl = UserPhotoUrl;
        }
        userPhoto.AlternateText = DisplayName;
    }

    public string UserPhotoUrl { get; set; }
    public string DisplayName { get; set; }
}

Y este es todo el código necesario para mostrar la foto del usuario. Luego de desplegar la solución, podrá agregar este WebPart a la página de bienvenida (Welcome Page) del conjunto de documentos e indicar el nombre visible (Display Name) de la propiedad de tipo Usuario cuya foto se quiere mostrar. Este campo debe ser uno de los que se han configurado en el Conjunto de Documentos para mostrarse en la página de bienvenida y no debe ser multivaluado.

A continuación se muestra el resultado final.

final

Descargar código fuente de la solución: DocSetsEnhanced.zip

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Acerca del autor...

Lester Sánchez

Web: http://www.linkedin.com/in/lestersanchez
Lester Sánchez
Profesor de la Facultad de Matemática y Computación de la Universidad de La Habana. Entusiasta de las tecnologías .NET y en especial de SharePoint. Webmaster de weboomania.comLeer completo