miércoles, 20 de agosto de 2008

Post como anónimo en lista de discusión

Los campos Autor y Modificador de elementos en Listas y Librerías no se pueden modificar por ser de solo lectura, incluso por código nos regresa una excepción del tipo “read only”. Lo que yo necesitaba era poder hacer que una lista de discusión tuviera la capacidad de permitir a los usuarios ocultar su identidad al momento de generar una pregunta o dar respuesta dentro de la lista.

La verdad busque un buen rato por internet pero encontré muy poco que me sirviera de ayuda por lo que se me ocurrió otra alternativa no del todo optima pero funcional, llamémosle chapusa.
A la lista de discusión le agregue un campo llamado Anónimo del tipo “Si o No”.

De esta forma tengo manera de controlar si el usuario quiere que su nombre aparezca como Autor del elemento o por el contrario quiere quedar como anónimo.

Ahora viene crear el manejador de evento de la lista, para saber cómo crear un evento para una lista ver este post Los eventos en WSS3 allí explica lo que son los eventos y los diferentes tipos que existen.

Deberemos sobrescribir el método ItemAdded, dentro tomaremos los valores que el usuario esta guardando en ese momento y en caso de que el usuario haya seleccionado el check de “Anónimo”, utilizaremos un impersonalizador para crear un nuevo elemento por código con un usuario diferente al actual, para esto debemos tener ya un usuario creado llamado Anónimo (o como quieras que aparezca en los elementos), y una vez que creamos el nuevo elemento con el usuario impersonalizado solo nos queda borrar el elemento que el usuario actual agrego como nuevo.

Código:
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem;
if (item["Anonimo"].ToString() == "True")
{
DisableEventFiring();
SPUser userYo = item.Web.AllUsers["dominio\\Anonimo"];
SPUserToken miSigno = userYo.UserToken;
SPSite impersSiteCollection = new SPSite(item.Web.Url, miSigno);
SPWeb impersWeb = impersSiteCollection.OpenWeb();

if (item["IsRootPost"].ToString() == "0")
{
SPListItemCollection miListaItemCol = impersWeb.Lists["Discusion"].Items;
SPListItem parentItem = miListaItemCol.GetItemById((int)item["ID"]);
SPListItem nuevoItem = SPUtility.CreateNewDiscussionReply(parentItem);
nuevoItem["Categoria"] = item["Asunto"];
nuevoItem["Detalle"] = item["Cuerpo"];
nuevoItem["Anonimo"] = item["Anonimo"];
item.Delete();
nuevoItem.Update();
}
else
{
SPListItemCollection miListaItemCol = impersWeb.Lists["Discusion"].Items;
SPListItem nuevoItem = miListaItemCol.Add();
nuevoItem["Categoria"] = item["Asunto"];
nuevoItem["Detalle"] = item["Cuerpo"];
nuevoItem["Anonimo"] = item["Anonimo"];
item.Delete();
nuevoItem.Update();
}
EnableEventFiring();
}
}

Una vez que compila se deberá agregar firmar y agregar la dll al GAC del servidor.

Para asociar el evento con la lista de discusión que nos interesa podemos usar esta herramienta EventHandlerExplorer. (ejemplo de uso aquí).

Y ahora tenemos una lista de discusión con opción a postear comentarios como anónimos dentro de un site de sharepoint.

No hay comentarios: