El sistema de alertas que ofrece MOSS2007 es muy potente y versátil. No obstante, me he enfrentado a una situación que no he podido resolver directamente con MOSS. Las alertas de MOSS sólo son aplicables a listas o elementos de listas, siendo este, desde mi punto de vista, una gran limitación.
Me veo en la obligación de hacer una alerta a nivel de un sitio. Esto no se soporta por MOSS2007 de forma nativa, pero con un poco de diseño, podremos solventar este escollo. ¿Qué entendemos por una alerta a nivel de sitio? Pues una alerta que avise cuando cualquier tipo de contenido sea añadido, modificado, borrado, o todos ellos, en el sitio web. Por lo tanto la idea es replicar en cada lista o biblioteca la misma alerta. Es tan sencillo como recorrer las listas del sitio en cuestión y replicar la alerta. Veamos un ejemplo para verlo más claro:
public bool CrearAlertaSitio(Guid idWeb)
{
bool resultado = false;
try
{
SPWeb web;
EliminarAlertaSitio(idWeb);
//Abrimos el sitio
if (SPContext.Current.Web.ID.Equals(idWeb))
{
web = SPContext.Current.Web;
}
else
{
web = SPContext.Current.Web.Webs[idWeb];
}
//Configuramos la alerta.
SPListCollection todasListas = web.Lists;
foreach (SPList lista in todasListas)
{
//Omitimos las listas que no se indexan.
if (!lista.NoCrawl)
{
SPAlert alerta = web.Alerts.Add();
//Configuramos la alerta
alerta.AlertFrequency = SPAlertFrequency.Immediate;
alerta.AlertType = SPAlertType.List;
alerta.EventType = SPEventType.All;
alerta.List = lista;
alerta.Status = SPAlertStatus.On;
alerta.Title = "Mi alerta personalizada a nivel de sitio.";
alerta.User = web.CurrentUser;
//Se guardan los cambios y no se notifica al usuario.
alerta.Update(false);
}
}
resultado = true;
}
catch (Exception ex)
{
//Controlamos la excepcion.
}
return resultado;
}
¿Y si queremos eliminar una la alerta? Pues aplicamos el mismo sistema. Recorremos todas las listas del sitio web, y eliminamos la alerta. Veamos un ejemplo:
public bool EliminarAlertaSitio(Guid idWeb)
{
bool resultado = false;
SPWeb web;
try
{
//Abrimos el sitio
if (SPContext.Current.Web.ID.Equals(idWeb))
{
web = SPContext.Current.Web;
}
else
{
web = SPContext.Current.Web.Webs[idWeb];
}
//Recuperamos las alertas la alerta.
SPAlertCollection todasAlertas = web.Alerts;
List<Guid> alertasBorrar = new List<Guid>();
foreach (SPAlert alerta in todasAlertas)
{
if (alerta.UserId.Equals(web.CurrentUser.ID) && alerta.AlertType.Equals(SPAlertType.List))
{
alertasBorrar.Add(alerta.ID);
}
}
foreach (Guid idAlerta in alertasBorrar)
{
web.Alerts.Delete(idAlerta);
}
resultado = true;
}
catch (Exception ex)
{
//Controlamos la excepcion
}
return resultado;
}
¿Y si queremos aplicarlo a una colección de sitios, y a sus sitios? Pues simplemente tendremos que iterar para cada sitio.
public bool CrearAlertaCS(Guid idWeb)
{
SPWebCollection todasWeb = SPContext.Current.Web.Webs;
//Creamos la alerta para el sitio actual -- la colección de sitios
CrearAlertaSitio(idWeb);
foreach (SPWeb idSitio in todasWeb)
{
CrearAlertaSitio(idSitio);
}
}
Y hasta aquí con las alertas a nivel de sitio y colección de sitios.

0 comentarios:
Publicar un comentario en la entrada