lunes, 10 de noviembre de 2008

Agregar quien respondio por última vez a un foro

Aprovechando la entrada de Miguel Angel (Post anónimo en lista de discusión), quería agregar una columna en los foros que me permitiese ver quien fue el último usuario que contesto a un hilo de discusión.
Para ello, agregue un nuevo campo al foro ("Última entrada creada por") y un código que se ejecuta junto con el evento que guarda una respuesta en el foro (todo esto viene explicado en el enlace anterior)



El código es el siguiente:

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;
namespace EventHandler
{
public class ListItemAddedNew : SPItemEventReceiver
{
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
DisableEventFiring();
if (item["IsRootPost"].ToString() == "0")
{
// Nos conectamos como administrador para obtener la informaci¢n del nodo padre
SPUser userYo = item.Web.AllUsers["DOMINIO\\USUARIO ADMINISTRADOR"];
SPUserToken miSigno = userYo.UserToken;
SPSite impersSiteCollection = new SPSite(item.Web.Url, miSigno);
SPWeb impersWeb = impersSiteCollection.OpenWeb();
SPListItemCollection miListaItemCol = impersWeb.Lists[item.ParentList.ToString()].Folders;
SPListItem parentItem = miListaItemCol.GetItemById((int)item["ParentFolderId"]);
// Ahora nos conectamos como el usuario que creo el nodo padre para que
// no nos cambie el campo "Creado por"
string IdUser = parentItem["Author"].ToString().Substring(0,parentItem["Author"].ToString().IndexOf(";"));
SPUser userYo2 = item.Web.AllUsers.GetByID((int) System.Convert.ToInt32(IdUser, 10));
SPUserToken miSigno2 = userYo2.UserToken;
SPSite impersSiteCollection2 = new SPSite(item.Web.Url, miSigno2);
SPWeb impersWeb2 = impersSiteCollection2.OpenWeb();
SPListItemCollection miListaItemCol2 = impersWeb2.Lists[item.ParentList.ToString()].Folders;
SPListItem parentItem2 = miListaItemCol2.GetItemById((int)item["ParentFolderId"]);
parentItem2["éltima entrada creada por"] = item["Author"];
parentItem2.Update();
}
EnableEventFiring();
}
}
}


También podemos ocultar este campo para que solo se muestre en la vista de "Asunto" y no al insertar elementos en el foro. Esto se hace usando este componente gratuito que permite agregar permisos de usuario por cada una de las columnas de una lista o biblioteca de documentos (Descargar aquí)

Saludos