This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

Enlaces Recomendados

June 2007 - Artículos

Fundamentos Web 2007

Entre los días 3 y 5 de octubre, se celebra en Gijón el congreso Fundamentos Web 2007, organizado por la Fundación CTIC y W3C España. Se trata de un evento muy recomendable para ponerse al día de todo lo relacionado con aspectos técnicos y sociales de la web, accesibilidad, desarrollo y diseño.

El programa no está todavía definido, pero para abrir boca, contará con gente como Tim Berners-Lee (inventor de la web) o Tantek Çelik (director de tecnología de Technorati).

Publicado 28/6/2007 22:20 por Luis Romero Laguillo | con no comments

Archivado en:

WSS 3.0 & MOSS: Recopilación de enlaces interesantes (II)

Siguiendo con la recopilación de recursos iniciada en un post previo, en la nueva entrega de recursos variados sobre WSS 3.0 / MOSS destacamos los siguientes. Por cierto, la lista de blogs de Sharepoint que habitualmente leemos sigue creciendo, es increíble la cantidad de gente que está trabajando en la plataforma y cantidad de cosas interesantes  que están haciendo y que nos pueden salvar de muchos aprietos:

Documentación:

·         White Papers sobre las fantastic 40 templates u los Splendid 7 My sites. En los white papers se explica cómo se diseñaron y construyeron estas plantillas.

·         Screncasts de herramientas XML.

·         Excelente listado de sitios web construidos con MOSS.

·         Gul Mobile’s WebSite, en este post se  explica cómo se ha concebido e implementado este sitio basado en MOSS.

·         Presentaciones sobre Sharepoint en el TechEd de Orlando:

o   Presentaciones de de Andrew Connell.

o   Presentaciones de Shane.

·         Artículo de MSDN sobre los límites en términos de capacidad de WSS 3.0 / MOSS. Son muy interesantes los resultados de rendimiento arrojados. De recomendable lectura si queremos hacer un buen planning de capacidad de nuestras soluciones MOSS.

·         Artículo de planning de almacenamiento de contenidos. Son interesantes los distintos escenarios de almacenamiento que se pueden plantear y que consideracioens hay que tener en cuenta para cada uno: número de librerías de documentos, número de documentos por librería, etc.

·         Artículo de cómo crear una quota template para utilizar en los site collection de MOSS.

·         Artículos sobre un servicio poco mencionado en la documentación de WSS 3.0 / MOSS, el Timer Service, pero que es vital para que componentes claves (como los jobs planificados, alertas, etc.) funcionen correctamente:

o   Algunas características del servicio.

o   Elementos de la plataforma Sharepoint dónde interviene el servicio.

·         Artículos muy buenos sobre Capacity & Planning en el blog de Joel Olesson:

o   Todos los aspectos que se deben tener en cuenta.

o   Tips en el dimensionamiento de Site Collections.

·         Artículos sobre el Business Data Catalog (BDC):

o   Problemas de acceso denegado al BDC.

o   Modelos de autentificación y modos de autentificación en el BDC. Como modelos, existen dos posibilidades: trusted subsystem e Impersonation Delegation. Como modos, tenemos 5 posibilidades: PassThrough, ReverToSelf, Windows Credentials, RdbCredentials, Credentials.

o   Distintas modalidades de acceso al backend y como se configura en el BDC. Por ejemplo, utilizando PassThrough habría que utilizar:

 

  <LobSystemInstances>

    <!-- An LobSystem can have only one LobSystemInstance. The LobSystemInstance defines the connection and authentication parameters. -->

    <LobSystemInstance Name="AdventureWorksSample">

      <Properties>

        <Property Name="AuthenticationMode" Type="System.String">PassThrough</Property>

        <!--AuthenticationMode can be set to PassThrough, RevertToSelf, RdbCredentials, or WindowsCredentials. -->

        <Property Name="DatabaseAccessProvider" Type="System.String">SqlServer</Property>

        <!-- Can be SQL Server, OlEDB, Oracle, or ODBC for database systems. -->

        <Property Name="RdbConnection Data Source"

                            Type="System.String">YourAdventureWorks2000ServerNameHere</Property>

        <!-- The name of your server hosting the database or the name of the SQL Server instance in the format SQLServer\Instance. -->

        <Property Name="RdbConnection Initial Catalog" Type="System.String">AdventureWorks2000</Property>

        <!-- The name of the database.> -->

        <Property Name="RdbConnection Integrated Security" Type="System.String">SSPI</Property>

        <Property Name="RdbConnection Pooling" Type="System.String">false</Property>

       </Properties>

    </LobSystemInstance>

  </LobSystemInstances>

 

·         Artículo de cómo añadir y utilizar un proveedor de autentificación LDAD en MOSS.

·         Dentro de la sección de artículos técnicos de MSDN para Sharepoint, podemos encontrar dos estupendos artículos de Patrick Tisseghem sobre herramientas y técnicas de desarrollo en la plataforma de Sharepoint:

o   Parte 1, centrada en describir las distintas herramientas y componentes que tenemos para el desarrollo.

o   Parte2, más centrada en el despliegue y empaquetado de soluciones.

·         Listado de todas las opciones del comando stsadm.

·         Artículo en The Code Project sobre como implementar comandos personalizados para stsadm. Otro post interesante sobre este tema es este.

·         Documento descriptivo de las estrategias de backup en MOSS.

 

Novedades:

·         Gestor de contenidos open-source enmarcado en el proyecto Mono:

·         Recientemente se ha creado el Centro de Recursos para Interoperabilidad con Microsoft Office Sharepoint Services. Este centro será el referente de recursos para la integración de soluciones MOSS con aplicaciones LOB.

 

Tips & Tricks:

·         Artículo en The Code Project sobre como consumir los servicios web de WSS 3.0 / MOSS.

·         Otro artículo sobre configuración de MOSS con autentificación basada en formularios. Pablo ya nos explicó de manera detallada como podemos configurar sharepoint con varios modelos de autentificación.

·         Un inconeviente con el que os habréis encontrado al crear web pages o web part pages en WSS 3.0 es que desaparece el Quicklaunch menú del sitio en el que reside la página. Patrick Thisseghem nos explica cómo hacer que vuelva a aparecer.

·         Integración de mapas de Virtual Earth en una lista de Sharepoint utilizando Sharepoint Designer.

·         Gestión de sites y site collections con stsadm. Fuente: blog de Sahil Malik.

·         Testing del Timer Service desde el modelo de objetos de Sharepoint. Fuente: Blog de Sahil Malik.

·         Seguro que más de uno se ha preguntado para que sirve el único workflow que viene por defecto con WSS 3.0 y que también está presente en MOSS. En este post tenéis una descripción del cometido del workflow Three-State.

·         Creación de una vista de datos XLST de una lista de Sharepoint. Fuente: Sharepoint-tips site.

·         Como conseguir Filtered Lookups en Sharepoint Designer para utilizarlos en listas de WSS 3.0 / MOSS. Aquí se explica cómo crear un filtro en un campo de tipo lookup.

·         Sitio dedicado a tips & tricks de sharepoint.

·         Customización de la página de Login de Sharepoint.

·         Como tratar caracteres especiales cuando se trabaja con listas de Sharepoint. En este post se explica este tip que tantos quebraderos de cabeza da a los que trabajamos con listas de WSS 3.0 / MOSS.

·         Como hacer una query en CAML contra una lista de Sharepoint y crear una vista personalizada para mostrar los resultados.

·         Uso de javascript para manipular campos de formulario de Sharepoint.

·         Consideraciones a tener en cuenta cuando se quiere utilizar y configurar adecuadamente  la búsqueda avanzada de MOSS.

·         Serie de enalce sobre conceptos relacionados con Master Pages y Place Holders.

·         Interesante artículo sobre las limitaciones de la content query web part.

·         Usar una lista de Sharepoint como authentication provider.

·         Cómo evitar añadir en una lista un elemento que ya existe mediante un manejador de eventos.

·         Ejemplo de script de backup para MOSS utilizando stsadm.

·         Migración de MOSS en sólo 7 pasos.

·         Configuración de la ayuda en línea de Sharepoint en Visual Studio 2005. Fuente: Blog de Gustavo Velez.

 

Problemas:

·         COM exception en la ejecución de un workflow: En este link podéis encontrar la solución a un problemilla que os encontraréis cuando ejecutáis un workflow y este ya había sido ejecutado con anterioridad produciéndose un error.

 

Utilidades,  Herramientas & Descargas:

·         Add-ons para Sharepoint: Interesantes Add-Ons para Sharepoint. El primero es un sustituto del editor rico de MOSS. El segundo es un lector offline de sitios de WSS 2.0 y MOSS:

 

·         Microsoft Office Sharepoint Server 2007 Management Pack for Operations Manager 2007. Pack especifico para gestionar el rendimiento, disponibilidad,…de MOSS mediante MOM.

·         Add-In para Excel 2007 que permite sincronizar con listas de sharepoint.

·         Para todos aquellos que quieran probar MOSS sin necesidad de tener que instalarlo, se ha liberado para libre descarga una máquina virtual con una instalación completa de MOSS (incluido el pack de Office).

·         Uno de los proyectos de CodePlex es la Enhanced Content Query WebPart. Tiene muy buena pinta, y mejorará las ya potentes prestaciones de la CQWP que tenemos en MOSS (Por ejemplo, poder especificar porque campos vamos a filtrar).

·         Web part para mostrar animaciones flash en MOSS.

·         Herramienta alternativa y más económica al BDC Metadata Manager: MOSS BDC Design Studio.

 

·         Pre-release de la versión 2.0 Community Kit for Sharepoint,. Las principales aportaciones de este kit son las plantillas y funcionalidades para crear sitios blog y sitios wiki en Sharepoint.

·         Nueva versión del BDC Metadata Manager, y ya vamos por la 11.

·         Configuración y realización de búsquedas en un BDC. Aquí tenéis un screencast de los creadores del BDC Metadata Manager.

·         Webparts específicas para Web Cotent Management en Codeplex.

·         ¿Cuánto valen los blogs de Sharepoint? Interesante post de Bill Simser dónde establece una escala de valor en términos de coste por acción de los principales bloggers de Sharepoint.

Otros:

·         ¿Es Sharepoint un producto ecológico? En este link se explica J Fuente: Blog de Joel Oleson.

 

Y hasta aquí esta nueva entrega de recursos interesantes de la plataforma Sharepoint. Como veis, hay para dar y tomar. Espero que os sea útil la recopilación.

Publicado 28/6/2007 11:36 por Juan Carlos González Martín | 13 comment(s)

Archivado en: ,

MOSS: Leyendo los user profiles

Uno de los retos que se nos ha planteado en el CIIN es como visualizar el directorio de empleados de una organización (que en este caso se encuentra en una estructura de directorio activo, DA) en un team site de MOSS utilizando las capacidades que este nos aporta.  El primer punto a tener en cuenta es que MOSS a través de los Shared Services Providers (SSP), y en concreto el SSP referente a User Profiles, nos permite cargar la información de todos los usuarios de una organización de manera manual o automática definiendo un origen de importación que puede ser un DA, un recurso de DA, un directorio LDAP o bien un Business Data Catalog (BDC).

(Como ocurría con la configuración de la búsqueda, la importación automática de perfiles se puede programar con una cierta periodicidad. Mi compañero Pablo me ha prometido que contará en detalle cómo se realiza la importación de profiles de un DA en su próximo post, ya veréis que es algo realmente interesante y con algún truquito que otro.).

Una vez importados los perfiles de usuario, el listado de los mismos es visible desde la administración central de MOSS (en el SSP Perfiles de usuarios y propiedades-> Ver perfiles de usuario).

Cada user profile tiene un serie de propiedades, muchas de las cuáles coinciden con las que presenta un DA para los distintos usuarios que almacena. Pero, ¿Cómo podemos ver este listado de usuarios fuera de la administración central? ¿Se podría además ver para cada usuario la ficha de detalle del mismo?  La pregunta difícil es la primera, puesto que una vez sepamos como listar los user profiles fuera de la administración central, visualizar el detalle de un profile en concreto no tiene porque ser complejo.

Alternativas para visualizar los user profiles fuera de la administración central

Para visualizar todos los user profiles creados, hay varias alternativas:

·         A través de crear un sitio de búsqueda específico pare personas, de manera que una vez realizada la correspondiente indexación podremos buscar usuarios concretos en el listado importado.

·         Atacando el servicio web UserProfile.asmx de nuestra máquina MOSS y mostrando el listado de usuarios en una web part o en una lista de MOSS.

·         Atacando el modelo de objetos de MOSS y mostrando el listado de usuarios en una web part o en una lista.

En nuestro caso, hemos optado por la tercera opción y como no queremos duplicar la información de los profiles en una lista, construiremos una web part que permita mostrar el listado de profiles y que al seleccionar un profile concreto permita ver el detalle del mismo de forma similar al estilo preview panel de una lista de WSS 3.0 / MOSS:

Resolviendo el problema

Tras una serie de pruebas de concepto sobre como leer los user profiles y ver que objetos hay que manejar para cumplir con los requerimientos comentados, pasamos a crear la web part correspondiente. Para agilizar el proceso de creación, y despliegue posterior de la web part utilizamos las extensiones de WSS 3.0 para Visual Studio (aprovecho para comentar que es una pena que no estén oficialmente soportadas por Microsoft). Ya comentamos en un post previo, que al utilizar estas extensiones se añaden las extensiones e infrasestructura necesaria para desplegar la web part sin más que hacer el deploy de la solución.

Para poder trabajar con los user profiles, y construir una web part que dinámicamente muestra un listado de los mismos y permite visualizar el detalle del profile seleccionado necesitamos añadir e importa al proyecto los siguientes espacios de nombres:

using System.Web.UI.WebControls;

using System.Data;

using Microsoft.Office.Server;

using Microsoft.Office.Server.UserProfiles;

using System.Web;

using System.Drawing;

En negrita he marcado los espacios de nombres necesarios para atacar los user profiles. El resto de espacios de nombres se utilizan para la visualización de los profiles. Antes de seguir, os voy a mostrar (esto es lo que se dice empezar por el final) que pinta tiene la web part que finalmente se despliega para enlazarlo con los pasos de creación:

Los pasos para llegar a construir la web part anterior son los siguientes:

Sobreescribir el método CreateChildControls()

Lo primero que haremos en el código de la web part es sobreescribir el método CreateChildControls(), que nos permitirá crear todos los controles que va a incluir nuestra web part (y que se construyen de manera dinámica en base a la información de los user profiles). Antes de crear los controles hijos necesarios, es en este método donde obtendremos el listado de profiles que tenemos importados / creados en el SSP de MOSS. Para el caso expuesto, el código necesario para la recuperación de los user profiles es el siguiente:

                SPSite spsSitio = SPControl.GetContextSite(this.Context);

                ServerContext scContexto = ServerContext.GetContext(spsSitio);

                UserProfileManager upManager = new UserProfileManager(scContexto);

 

                //Construimos la tabla con las columnas que nos interesan

                dtData.Columns.Add(ID_PROFILE);

                dtData.Columns.Add(CAMPO1_PROFILE);

                dtData.Columns.Add(CAMPO2_PROFILE);

                dtData.Columns.Add(CAMPO3_PROFILE);

                dtData.Columns.Add(CAMPO4_PROFILE);

                dtData.Columns.Add(CAMPO5_PROFILE);

                dtData.Columns.Add(CAMPO6_PROFILE);

                dtData.Columns.Add(CAMPO7_PROFILE);

                dtData.Columns.Add(CAMPO8_PROFILE);

                dtData.Columns.Add(CAMPO9_PROFILE);

 

                //Llenamos la tabla

                foreach (UserProfile cUser in upManager)

                {

                    UserProfileValueCollection upValue;

                    dtRow = dtData.NewRow();

                    foreach (Property pPropiedad in cUser.ProfileManager.Properties)

                    {

                        //ID

                        if (pPropiedad.Name == ID_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo1

                        if (pPropiedad.Name == CAMPO1_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo2

                        if (pPropiedad.Name == CAMPO2_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo3

                        if (pPropiedad.Name == CAMPO3_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo4

                        if (pPropiedad.Name == CAMPO4_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo5

                        if (pPropiedad.Name == CAMPO5_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo6

                        if (pPropiedad.Name == CAMPO6_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo7

                        if (pPropiedad.Name == CAMPO7_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //campo8

                        if (pPropiedad.Name == CAMPO8_PROFILE)

                        {

                            upValue = cUser[pPropiedad.Name];

                            dtRow[upValue.Property.Name] = upValue.Value;

                        }

                        //Campo9

                        if (dtRow[CAMPO3_PROFILE].ToString() != "" || dtRow[CAMPO4_PROFILE].ToString() != "")

                        {

                            if (dtRow[CAMPO4_PROFILE].ToString() == "")

                            {

                                dtRow[CAMPO9_PROFILE] = dtRow[CAMPO3_PROFILE];

                            }

                            else

                            {

                                dtRow[CAMPO9_PROFILE] = dtRow[CAMPO3_PROFILE] + "- " + dtRow[CAMPO4_PROFILE];

                            }

 

                        }

 

                    }

                    dtData.Rows.Add(dtRow);

                }

Como vemos, una vez obtenido el sitio (a través de spsSitio que es un objeto de tipo SPSite y utilizando el método GetContext para obtener el sitio actual) en el que se va a ejecutar la web part y el contexto del servidor (objeto scContexto, de tipo ServerContext y utilizando el método GetContext para obtener el contexto actual), los perfiles de usuario almacenados en nuestro servidor de MOSS se obtienen a partir de un objeto de tipo UserProfileManager (clase utilizada para acceder a los datos de perfiles de usuario) que a partir del contexto del servidor nos devuelve una colección de objetos de tipo UserProfile. Una vez que tenemos la colección de user profiles, lo siguiente que hacemos es recorrerla y nos quedamos con las propiedades que nos interesan de cada user profile. Para ello:

·         En el primer nivel de anidamiento, vamos recorriendo cada objeto de tipo UserProfile almacenado en la colección de user profiles.

  foreach (UserProfile cUser in upManager)

 

·         En el segundo nivel de anidamiento, seleccionamos las propiedades que nos interesen de cada user profile.

                foreach (UserProfile cUser in upManager)

                {

                    UserProfileValueCollection upValue;

                    dtRow = dtData.NewRow();

                    foreach (Property pPropiedad in cUser.ProfileManager.Properties)

                    {

En este segundo nivel, para realizar el recorrido por la colección de propiedades (cUser.ProfileManager.Properties) de cada user profile estamos utilizando un objeto de UserProfiles.Property, que es la clase que representa la definición para una propiedad de un user profile. Finalmente, cada propiedad que necesitemos la estamos almacenando en el objeto upValue que es de tipo UserProfileValueCollection, que nos permite construir una colección con las propiedades que nos interese visualizar para cada user profile. A continuación, cada propiedad la asignamos a un objeto de tipo DataRow que luego añadiremos al objeto DataTable que aparece al principio del listado. Este último objeto es el que finalmente utilizaremos para construir la web part, tanto para visualizar la lista de user profiles como para luego mostrar el detalle del user profile seleccionado.

Una vez que tenemos los user proflies, ya podemos empezar a construir los controles hijos que constituirán nuestra web part.

                ////Tabla Principal

                tblContenedor = new Table();

 

                //Añadimos una fila       

                tblRow = new TableRow();

 

                //Lista Empleados       

                tblCell = new TableCell();

                tblListaEmpleados = new Table();

                tblCell.Controls.Add(this.tblListaEmpleados);

                tblRow.Cells.Add(tblCell);

 

                //Detalle Empleado       

                tblCell = new TableCell();

                this.tblDetalleEmpleado = new Table();

                this.tblDetalleEmpleado.CssClass = ESTILOS_FICHA_EMPLEADO;

                tblCell.Controls.Add(this.tblDetalleEmpleado);

                tblRow.Cells.Add(tblCell);

 

                //Lo añadimos todo a la tabla principal...

                this.tblContenedor.Rows.Add(tblRow);

 

                //Radiobutton

                rdbListaEmpleados = new RadioButtonList();

                rdbListaEmpleados.EnableViewState = true;

                rdbListaEmpleados.AutoPostBack = true;

                this.rdbListaEmpleados.SelectedIndex = 0;

                this.rdbListaEmpleados.CssClass = ESTILOS_LISTA_EMPLEADOS;

 

                this.rdbListaEmpleados.DataSource = dtData;

                this.rdbListaEmpleados.DataValueField = ID_PROFILE;

                this.rdbListaEmpleados.DataTextField = CAMPO9_PROFILE;

                this.rdbListaEmpleados.DataBind();

                //Evento para el radiobutton

                this.rdbListaEmpleados.SelectedIndexChanged +=

                    new System.EventHandler(this.rdbListaEmpleados_SelectedIndexChanged);

 

                //Añadimos el radiobutton list a la tabla

                tblRow = new TableRow();

                tblCell = new TableCell();

                tblCell.Controls.Add(this.rdbListaEmpleados);

                tblRow.Cells.Add(tblCell);

                tblContenedor.EnableViewState = true;

                //Añadiendo las celdas a la tabla

                this.tblListaEmpleados.Rows.Add(tblRow);

 

                if (dtData.Rows.Count > 0)

                {

                    this.Controls.Add(this.tblContenedor);

 

                }

Lo más interesante del código anterior (la presentación de la información utilizando una tabla principal que contiene otras dos tablas que contendrán el listado de usuarios por un lado, y el detalle del empleado seleccionado es lo de menos) es lo siguiente:

·         La fuente de datos utilizada para rdbListaEmpleados es justo el objeto DataTable construido a partir de los datos de los perfiles de usuario. En concreto, estamos utilizando los campos ID_PROFILE que contiene el ID único para cada user profile (propiedad UserProfile_GUID de cada user profile) y CAMPO9_PROFILE (que contiene la concatenación de los campos PreferredName y WorkPhone), el primero lo vinculamos a la propiedad DataValueField de rdbListaEmpleados y el segundo a la propiedad DataTextField.

                this.rdbListaEmpleados.DataSource = dtData;

                this.rdbListaEmpleados.DataValueField = ID_PROFILE;

                this.rdbListaEmpleados.DataTextField = CAMPO9_PROFILE;

                this.rdbListaEmpleados.DataBind();

 

·         La forma en que se añade el manejador para el evento SelectedIndexChanged del control rdbListaEmpleados que es de tipo RadioButtonList():

                this.rdbListaEmpleados.SelectedIndexChanged +=

                    new System.EventHandler(this.rdbListaEmpleados_SelectedIndexChanged);

Como vemos, el manejador se añade a rdbListaEmpleados utilizando la forma ya conocida de añadir manejadores en C# para controles web o de Windows forms. Algo importante es que tenemos que configurar la propiedad AutoPostBack a True para que se pueda disparar el evento SelectedIndexChanged de rdbListaEmpleados y se ejecute el manejador.

·         Como se añaden los controles hijos a la web part, y que como ya habéis visto y conoceréis, implica hacer una llamada del método Add() de la colección de controles de la web part (en este caso, lo mismo se utiliza cuando creamos user controls, páginas ASP.NET, formularios Windows Forms,…). Como vemos, para añadir todos los controles hijos nos basta con añadir tblContenedor que es la tabla maestra que contiene las tablas auxiliares utilizadas que a su vez contienen los controles necesarios para visualizar los datos de un user profile.

this.Controls.Add(this.tblContenedor);

 

Sobreescribir el método Render()

Una vez que ya tenemos creados los controles hijos y añadidos a la web part, necesitamos que estos se visualicen. Se consigue sobreescribiendo el método Render() de la web part que nos permite justamente eso: renderizar los controles hijos de la web part de manera que al final los visualicemos de manera transparente como controles web típicos (y que nos devuelve el servidor web).

        protected override void Render(HtmlTextWriter writer)

        {

 

            if (dtData.Rows.Count > 0)

            {

 

                if (this.rdbListaEmpleados.SelectedIndex == 0)

                {

                    this.tblDetalleEmpleado.Rows.Clear();

                    this.rdbListaEmpleados_SelectedIndexChanged(this.rdbListaEmpleados, null);

                }

                this.tblContenedor.RenderControl(writer);

            }

            else

            {

                if (this.lblErrorProducido.Text == "")

                {

                    writer.Write("<b> El directorio de empleados está vacio o no cargado </>");

                }

                else

                {

                    this.lblErrorProducido.RenderControl(writer);

                }

 

            }

        }

Como vemos, el renderizado efectivo de los controles de la web part se realiza en la línea this.tblContenedor.RenderControl(writer). Es decir, el método RenderControl de nuestro control principal es el que se encarga de hacer dicho renderizado a través de un objeto de tipo HtmlTextWriter.

Manejador del objeto RadioButtonList()

Finalmente, sólo nos queda incluir el código del manejador para el evento SeletedIndexChangeg() del objeto rdbListaEmpleados. En este código es dónde se construirá, para cada user profile seleccionado, la ficha de detalle de un usuario. Una muestra de cómo se construye dicha ficha de detalle es el siguiente listado:

foreach (DataRow dr in dtData.Rows)

            {

                //Verificamos la opción elegida por el usuario

                if (this.rdbListaEmpleados.SelectedItem.Value == dr[ID_PROFILE].ToString())

                {

                    //Nombre

                    tblRow = new TableRow();

                    tblCell = new TableCell();

                    tblCell.Text = ETIQUETA1_PROFILE;

                    tblRow.Cells.Add(tblCell);

                    tblCell = new TableCell();

                    tblCell.Text = dr[CAMPO1_PROFILE].ToString();

                    //tblCell.BackColor = System.Drawing.Color.LightSkyBlue;

                    tblRow.Cells.Add(tblCell);

                    this.tblDetalleEmpleado.Rows.Add(tblRow);

 

                  

 

                                        //Fotografía

                    if (dr[CAMPO8_PROFILE].ToString() != "")

                    {

                        tblRow = new TableRow();

                        tblCell = new TableCell();

 

                        tblRow.Cells.Add(tblCell);

                        tblCell = new TableCell();

 

                        imgFotografia = new System.Web.UI.WebControls.Image();

                        imgFotografia.ImageUrl = dr[CAMPO8_PROFILE].ToString();

                        tblCell.Controls.Add(imgFotografia);

 

                        tblCell.Controls.Add(imgFotografia);

                        tblRow.Cells.Add(tblCell);

                    }

 

                    //Lo añadimos todo a la tabla!

 

                    this.tblDetalleEmpleado.Rows.Add(tblRow);

                }

            }

        }

Como vemos, construir la ficha de detalle del usuario seleccionado es una tarea sencilla. No tenemos más que comprobar cuál es el elemento seleccionado por el usuario y a partir de eta comprobación construir la ficha de detalle del empleado que estará contenida en la tabla tblDetalleempleado.

Despliegue y uso de la web part

Una vez que hemos codificado las distintas partes de la web part y tras comprobar que todo compila bien, procedemos a desplegar la web part. En este caso, y gracias a las extensiones de WSS 3.0 para Visual Studio, el despliegue es realmente sencillo puesto que se realiza de manera automática a través de la opción Implementar Solución que tenemos disponible en Generar -> Implementar Solución. El detalle de lo que se hace en este proceso de implementación ya lo comentamos en un post previo, por lo que os remito a ese post.

Ya sólo nos falta asegurar que la web part está desplegada en todos los sitios que nos interesa a través del Administrador de Soluciones de la administración central de MOSS:

Tras comprobar que la feature correspondiente a la web part está activada, ya podemos utilizar la web part en los sitios de MOSS dónde la hayamos implementado (ya sabéis, Configuración del sitio -> Características del sitio -> Características de la colección de sitios).

Sin más, esto es lo que os quería contar sobre los user profiles de MOSS. La verdad es que el tema es chulo, aunque al principio nos dio algún que otro quebradero de cabeza tanto listar los user profiles como visualizarlos del modo requerido. Por supuesto, esta web part es muy sencilla y se puede mejorar mucho ( a ver si alguien se anima). Os dejo el código de la web part aquí.

Publicado 18/6/2007 12:04 por Juan Carlos González Martín | 25 comment(s)

Archivado en:

Personalización de las plantillas para la vista móvil en SharePoint

Una de las muchas características que ofrece SharePoint (tanto MOSS como WSSv3) es la posibilidad de visualizar nuestros sitios en dispositivos móviles en forma de listas y librerías de datos. Es tan simple como añadir a nuestra URL una /m. De tal forma, que si nuestra URL es http://moss2007 poniendo http://moss2007/m accederemos a la vista móvil. Haciendo esto se redirecciona a una página default.aspx contenida en el directorio …\12\TEMPLATE\LAYOUTS\MOBILE. Esta a su vez se redirecciona  a otra página contenida en el mismo directorio llamada mbllists.aspx. Todas las páginas que están en este directorio son plantillas usadas para renderizar la vista móvil. Además existe un control ascx llamado MobileDefaultTemplates.ascx, que se encuentra en el directorio …\12\TEMPLATE\CONTROLTEMPLATES, y que es la plantilla que se encuentra por debajo de las plantillas anteriores.

Para personalizar la vista móvil que nos ofrece SharePoint tenemos tres opciones:

·         Modificar las plantillas del directorio …\12\TEMPLATE\LAYOUTS\MOBILE.

·         Crearnos nuestro propio control ascx en el directorio …\12\TEMPLATE\CONTROLTEMPLATES para modificar lo que creamos necesario.

·         Combinar las dos opciones anteriores.

Además existe la posibilidad, de cambiar la redirección de la página default.aspx para que apunte a otra página. De este modo podremos crearnos nuestras propias páginas para la vista móvil.

En este artículo solo vamos a trabajar con las dos primeras opciones.

·        Personalización trabajando con las plantillas directamente.

La vista móvil que por defecto nos ofrece SharePoint es la siguiente:

 

 

Como se puede apreciar es un poco sosa, carece de colores y no tiene ninguna imagen. Lo que vamos a hacer en el siguiente ejemplo es colorear un poco la página y mostrar un logo, en nuestro caso, del CIIN. Esto lo haremos solamente a la página que aparece por defecto, mbllists.aspx, pero se puede aplicar al resto de las páginas del directorio _layouts/mobile.

Para ello nos vamos a valer de la clase System.Web.UI.MobileControls en la que se encuentran todos los controles necesarios para crear páginas Web para dispositivos móviles.

Lo primero que hay que hacer es crearse un control ASP.Net que nos sirva como hoja de estilos, con el siguiente código:

 

<Mobile:Stylesheet  runat="server">

 

   <Style name="Formulario"  font-name="Verdana"  backcolor="#F0F0F0"

        wrapping="wrap" />

 

   <Style name="Titulo" font-size="Large" font-name="Verdana" font-bold="true"

        forecolor="#354260"  backcolor="Black"  wrapping="wrap" />

     

   <Style name="Contenido" font-size="Normal" font-name="Verdana" font-bold="true"

        forecolor="#99BC5A" />

 

</Mobile:Stylesheet>

 

 

A este control lo llamaremos Mobile_style.ascx y lo guardaremos en el directorio _layouts/mobile. Podemos crear cuantos estilos queramos. En este caso hemos creado tres estilos, uno que se aplicará a toda la página, otro sólo para el título y el otro para la zona de contenido.

El siguiente paso es modificar la página mbllists.aspx de la siguiente forma:

·         Antes del tag  <SPMobile:SPMobileForm> tenemos que hacer referencia al control creado anteriormente que nos servirá como hoja de estilos:

<mobile:StyleSheet id="Style1" ReferencePath="Mobile_style.ascx"

 

·         Dentro del tag <SPMobile:SPMobileForm> habrá que añadir una referencia al estilo aplicado en el formulario:

<SPMobile:SPMobileForm RunAt="Server" PageType="HomePage" Paginate="true" StyleReference="Formulario">

 

·         Dentro del tag <SPMobile:SPMobilePageTitle> habrá que añadir una referencia al estilo aplicado en el título:

<SPMobile:SPMobilePageTitle RunAt="Server" StyleReference="Titulo"/>

 

·         Dentro del tag <SPMobile:SPMobilePageContents> habrá que añadir una referncia al estilo aplicado en el contenido.

<SPMobile:SPMobilePageContents RunAt="Server" StyleReference="Contenido"/>

 

·         Y por último añadiremos una imagen encima del título. Para ello hay que introducir el siguiente código antes del tag <SPMobile:SPMobilePageTitle/>

<mobile:Image ID="Image1" RunAt="Server" ImageUrl="~\Images\logoCIIN_pqverde.jpg"  />

 

Después de seguir estos pasos, vamos a comprobar cómo ha quedado nuestra vista móvil:

 

Vemos como la página es mucho más vistosa que al principio. Si seguimos navegando por el resto de las páginas nos daremos cuenta de que no están personalizadas. Esto es así, porque solo hemos cambiado la página principal. Si queremos cambiar todo el sitio, debemos personalizar las páginas contenidas en el directorio _layouts\mobile.

·        Creación de un control acsx para usarlo como plantilla

Existe otra forma de personalizar la vista móvil que nos ofrece SharePoint. Podemos crearnos un control ascx en el que podremos variar desde el aspecto visual hasta el contendido de la vista móvil.

Lo primero que hay que hacer es crearse un nuevo archivo con extensión ascx y guardarlo en la carpeta …\12\TEMPLATE\CONTROLTEMPLATES, con el nombre MyMobileControlTemplate.ascx. Lo abrimos con nuestro editor preferido (Visual Studio, SPD, Notepad, etc.) y escribimos el siguiente código:

<%@ Control Language="C#"   %>

<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %>

<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register TagPrefix="SPMobile" Namespace="Microsoft.SharePoint.MobileControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

 

 

<SharePoint:RenderingTemplate RunAt="Server" ID="Mobile_Default_HomePage_Title">

                <Template>

                                <mobile:Image ID="Image1" RunAt="Server" ImageUrl="~\Images\logoCIIN_pqverde.jpg"  />

<mobile:Label RunAt="Server" Text="CIIN->Home" font-size="Large" font-name="Verdana"                                font-bold="true" forecolor="#354260" />

                </Template>

</SharePoint:RenderingTemplate>

 

<SharePoint:RenderingTemplate RunAt="Server" ID="Mobile_Default_HomePage_Contents">

                <Template>

                               <SPMobile:SPMobileComponent RunAt="Server" TemplateName="Mobile_STS_HomePage_Contents"

                               font-size="Normal" font-name="Verdana" font-bold="true" forecolor="#99BC5A" />

                </Template>

</SharePoint:RenderingTemplate>

 

Una vez guardado el archivo tenemos que hacer un iisreset desde la consola de comandos. Cuando se acabe de resetear el ISS podremos acceder a la vista móvil:

Como podemos comprobar además de cambiar el aspecto visual de la página, hemos cambiado también el contenido, en concreto el título. Como en el otro caso, se ha personalizado sólo la página principal. Si queremos personalizar el resto de páginas tendremos que añadir más tags <SharePoint:RenderingTemplate/> pero con la ID que corresponda. En la página http://msdn2.microsoft.com/en-us/library/ms468582.aspx tenemos una referencia de los ID que hay  para modificar para personalizar el resto de las páginas. Además podemos hecharle un vistazo a la plantilla que utiliza por defecto SharePoint que se encuentra en el directorio …\12\TEMPLATE\CONTROLTEMPLATES y se llama MobileDefaultTemplates.ascx. Este fichero no se puede editar, por lo que si queremos usarle tenemos que copiarle y guardarlo con otro nombre. En el podremos cambiar cuanto queramos para personalizar la vista movil de SharePoint.

En la página http://msdn2.microsoft.com/en-us/library/ms464268.aspx hay mucha más información de cómo trabajar con las plantillas de la vista movil de SharePoint.

 

Publicado 8/6/2007 13:26 por Mario Rivero | 3 comment(s)

Archivado en: ,

WSS 3.0 & MOSS: Recopilación de enlaces interesantes (I)

Buceando por los diversos blogs de WSS 3.0 / MOSS a los que estoy suscrito (que buen invento el de las fuentes RSS, y que bien se ven Outlook 2007), durante las últimas semanas he encontrado una serie de enlaces sobre WSS 3.0 / MOSS que me parecen muy interesantes (ya publicados en el blog del ciin), por la luz que aportan respecto a preguntas frecuentes sobre funcionalidad de WSS 3.0 / MOSS, o por la propia novedad que introducen. Esta es la recopilación que he preparado para este post (periódicamente trataré de ir añadiendo nuevas cosas):

Artículos de interés

·         Workflows en Sharepoint, artículo muy bueno sobre la creación paso a paso de workflows para WSS 3.0 / MOSS con Visual Studio 2005. La sección  del articulo dedicada a los content types es de lectura recomendable, en ella se crea un content type en XML a partir de crear dos campos también en XML.

·         ¿Cuánto tiempo  me puede llevar el desarrollo de un proyecto de MOSS? Joel Oleson hace un estupendo análisis de cuánto tiempo nos puede llevar tener operativo un piloto completo de MOSS.

·         Uso del BDC Meta Man contra una BD Oracle. Artículo muy interesante de Liam Cleary.

·         Estupenda serie de whitepapers relativos al uso de wikis y blogs en la plataforma de sharepoint y en el contexto de las redes sociales y en palabras del autor de este post el social computing.

·         Gran artículo en The Code Project en el que se detalla como implementar seguridad a nivel de ítem de WSS 3.0 / MOSS a través de una actividad de workflow customizada.

 

Presentaciones

·         Todas las presentaciones de la APAC Sharepoint Conference que tuvo lugar el mes pasado en Australia. Las que más me han gustado son las de Joel Oleson referentes a aspectos IT de WSS 3.0 / MOSS.

Buenas Prácticas:

·        ¿Qué cosas aspectos se deben tener en cuenta a la hora de desarrollar y desplegar soluciones WSS 3.0? La respuesta la tenéis en este artículo de MSDN.

·        Recopilación de los elementos clave de WSS 3.0 / MOSS. En este post podemos encontrar aquellos elementos de WSS 3.0 / MOSS que tenemos que tener en mente a la hora de desplegar una solución  basada en estas plataformas.

 

Tips & Tricks:

·        ¿Es posible actualizar datos en el BDC? Por lo que dice en este post es posible atacando el modelo de objetos del BDC. En este punto, también Nick Swan, que ha trabajado en el proyecto del BDC Metada Manager, nos comenta en este post que las próximas versiones del Metadata Manager permitirán actualizar e insertar datos en el BDC.

·        ¿Cómo se podría cambiar la Master Page de los sitios y subsitios de una site Collection? Pues bien, Liam Cleary (MVP de MOSS) ha escrito un post en su blog en el que establece las pautas para crear una manejador que denomina HttpHandler para cambiar dinámicamente la master page. Sin embargo, según el mismo post este manejador todavía no funciona al 100 %, aunque seguro que pronto tendremos en el blog de Liam un nuevo post con el HttpHandler optimizado y sin ningún tipo de problemas en su funcionamiento.

·        Personalización de la Content Query WebPart, en otro de sus posts, Liam Cleary nos introduce a la personalización de la CQWP, de manera que podamos aplicar un estilo de visualización de elementos de una lista diferente al estándar y mostrar más campos que los que devuelve por defecto la CQWP. Mi compañero Pablo ya publicó un par de artículos con un mayor nivel de detalle sobre como personalizar la CQWP para visualizar datos de una lista de anuncios.

·        Personalización del la Web Part RSS Viewer, en este post podemos ver como personalizar el visor de RSS de un modo similar a como se personaliza la CQWP.

·        Configuración de búsquedas en MOSS sobre Lotus Notes, otra vez Liam Cleary nos muestra como indexar y buscar una base de datos Lotus Notes en MOSS.

·        Feature que permite bajar con un solo clic todos los documentos de una librería, en este post tenemos una feature que nos permite bajarnos todos los documentos de una librería de WSS 3.0 / MOSS. La feature crea una nueva opción en el menú Actions de la librería.

·        Como encontrar programáticamente elementos de una lista dentro de una carpeta ubicada en la lista, por Sahil Malik, MVP de C#.

·        Otra forma de copiar elementos desde una lista de WSS 3.0 / MOSS a otra lista. (Nota: No hace el tratamiento de los attachments del ítem que introduje en un post previo, ni la impersonación), también de Sahil Malik.

·        Crear programáticamente un sitio de MOSS /WSS 3.0, también por Sahil Malik.

·        ¿Qué content types utilizo en mis sitios de MOSS? Post muy bueno sobre cómo averiguar que content types estoy utilizando en un cierto sitio de MOSS, por Liam Cleary.

·        Mejoras en la Sharepoint Filter Webpart, por Ton Stegeman.

·        Creación de un Custom Field de tipo Regular Expression Validation, por Clayton James.

·        Windows Links Feature en Codeplex, pensada para dar más juego  a la lista de vínculos estándar de WSS 3.0 / MOSS a través de las numeroesas opciones que ofrece.

·        Despliegue de contenidos paso a paso: creación de una web application, extensión de una web application, uso del deployy de contenidos, etc.

·        De nuevo en el blog de Liam Cleary podemos encontrar una serie de posts (este es el link al primero de ellos) muy buenos sobre cómo construir elementos de menú para WSS 3.0 / MOSS utilizando Javascript.

·        Configuración con Sharepoint Designer 2007 del NewForm.aspx para crear una lista de WSS 3.0 / MOSS.

·        Integración de la suite de Microsoft Office con MOSS: estupenda serie de artículos de cómo fácilmente podemos interactuar en nuestros documentos de con datos de MOSS.

·        Como crear web parts interconectables. Este pdf es uno de los capítulos del libro The Web Part Infraestructure Uncovered que Teun Duynstee está escribiendo.

·        Implementando comandos customizados para la herramienta stsadm.

·        Cómo realizar la gestión de errores en las web parts que vayamos a desplegar en sitios de WSS 3.0 / MOSS.

Herramientas & Utilidades:

·        MOSS 2007 Search Engine Manager, esta es una herramienta de configuración que sigue la filosofía del BDC Metadata Manager, y que nos permite configurar búsquedas en MOSS.

·        Migración de Lotus Notes a MOSS, para realizar este tipo de acciones, tenemos dos herramientas que permiten migrar los contenidos de la BD documental de Lotus Notes a MOSS:

o   Proposion Migrator, de Proposion y que permite migrar datos de un servidor de Lotus Notes a listas de Sharepoint. Un ejemplo de migración lo tenemos en otros post de Liam Cleary.

o   Microsoft Transporter Migrator, esta es la herramienta que Microsoft tiene para migrar de Lotus Notes a MOSS.  De nuevo Liam Cleary en su blog (más que recomendable) nos muestra un nuevo ejemplo de cómo migrar contenidos de Lotus Notes a MOSS utilizando el Transporter.

·        Nueva versión del BDC Meta Man, y ya vamos por la 1.2.0.9 Alpha. Se mejora sobre todo la interfaz gráfica:

·        Vamosa, versión para MOSS de esta herramienta para análisis de contenidos y migración de contenidos. Esta herramienta es gratuita.

·        Website migration Manager for Sharepoint, herramienta de Metalogix que permite migrar nuestra web de gestión de contenidos a Sharepoint.

·        List and library Migration Manager for Sharepoint, herramienta de Metalogix que permite migrar facilmente entre listas de sitios de Sharepoint (también entre listas de SPS 2003 y MOSS).

·        Nintex Workflow 2007,  que permite crear workflows de manera visual en un entorno web embebido en Sharepoint.

·        BDC Knowledge base para el BDC Meta Man, primer version de documentación de la herramienta BDC Meta Man.

·        Microsoft IT Team Site Life Cycle Management, se ha liberado en el sitio de Codeplex la beta 1.0 de esta herramienta pensada para llevar a cabo la gestión de todo el ciclo de vida de una solución basada en WSS 3.0. Como no, se basa en el uso de feature y permite hacer el back up y recuperación de los site collection y webs que creemos.

·        Otro Espectacular recopilatorio de herramientas de WSS 3.0 / MOSS.

Problemas, busgs y errores

·         Error al iniciarse un workflow en una lista de tipo encuesta. Pues sí, aunque me he enterado tarde, resulta que hay un error en Sharepoint y no cualquier workflow que arranquemos en una lista de tipo encuesta no se va a lanzar nunca. El error lo descubrí en el portal de Gustavo Vélez.

 

Otros recursos interesantes

·        Directorio de todos los proyectos y recursos de Codeplex para WSS 3.0 / MOSS.

·         Guías de estilos de Sharepoint: Sharepoint CSS Reference Chart, referencia muy completa de los CSS usados en Sharepoint.

·         En este link podemos ver un ejemplo de web implementada en 10 semanas con funcionalidades MOSS out-of-the-box.

·         Governance Information for Sharepoint Server 2007,  guía con los roles, responsabilidades y procesos necesarios para conducer el desarrollo y uso de una solución basada en tecnología de Sharepoint.

·         Acaba de aparecer Popfly, y ya empezamos a ver artículos de integración con otras tecnologías de Microsoft: Integración de Sharepoint y el Popfly. Aquí tenéis un enlace a un webcast.

·         Somos muchos los que nos planteamos cuestiones (y hemos planteado a Microsoft) o hemos estado trabajando sobre temas de accesibilidad en WSS 3.0 / MOSS.  Pues bien, la semana pasada se creó un foro específico para tratar esta cuestión tan importante y en torno a la cual hay tantas dudas y  tan poca documentación.

Y hasta aquí la primera recopilación de recursos de WSS 3.0 / MOSS. Como os decía, cada cierto tiempo iré añadiendo nuevas cosas que vaya leyendo  en los más de 40 blogs de WSS 3.0 / MOSS  a los que estoy suscrito. Espero que os sea de utilidad. 

 

Publicado 8/6/2007 10:59 por Juan Carlos González Martín | 5 comment(s)

Archivado en: ,