Showing posts with label EventReceiver. Show all posts
Showing posts with label EventReceiver. Show all posts

Thursday, February 19, 2009

"Event Receiver" для "Project Tasks"

Нашёл отличную статью по созданию "Event Receiver"
При помощи (VS2005 или VS2008) + VSeWSS (да, да, да.. .я всётаки это сделал и настроил работу с этим расширением :) подробный отчёт в процессе написания.)

В конце статьи ссылка на просто незаменимую тулзу облегчающую жизнь при деплое:
EventReceiver-Installer for SharePoint
После написания библиотеки "Event Receiver" с нужной нам функциональность нам останется её подписать, добавить в GAC и потом используя EventReceiver-Installer for SharePoint добавить перехватчик событий в нужный нам список.


Небольшая путаница возникает при использование свойств ( properties.BeforeProperties и properties.AfterProperties ) которые как оказалось предназначены только для библиотек документов и в других случаях возвращают "null", потому к значениям нового элемента списка доступимся так:

SPListItemcurrentListItem = properties.ListItem;
string befor = currentListItem["Status"].ToString();

Ещё один важный момент, если мы перехватываем событие на изменение, нужно
отключить перехватчик событий внутри функции а затем включить, дабы избежать зацикливания.

this.DisableEventFiring();
// Тут используемый код.
this.EnableEventFiring();

Мой класс для перехватчиков событий в итоге выглядит так:

using System;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Security;
using VSeWSS;

namespace ELEKS.EventReciver.List.ItemChanged
{
[CLSCompliant(false)]
[TargetList("00bfea71-513d-4ca0-96c2-6a47775c0119")]
[Guid("941095ba-e685-4cc5-8b59-b06bb87e53cf")]
public class FreezeOnCompletItemEventReceiver : SPItemEventReceiver
{
/// <summary>
/// Initializes a new instance of the Microsoft.SharePoint.SPItemEventReceiver class.
/// </summary>
public FreezeOnCompletItemEventReceiver()
{
}
private SPUser GetUser(SPListItem item, SPField userField)
{
string currentValue = item[userField.Title].ToString();
SPFieldUser field = (SPFieldUser)userField;
SPFieldUserValue fieldValue =
(SPFieldUserValue)field.GetFieldValue(currentValue);
return fieldValue.User;

}
private SPUser GetUser(SPWeb web,string userName)
{
SPUserCollection users = web.SiteUsers;
SPUser user = users[userName];
return user;
}


public override void ItemDeleted(SPItemEventProperties properties)
{
string currentDate = DateTime.Today.ToShortDateString();
using (SPWeb web = properties.OpenWeb())
{
try
{
string authormail = GetUser(properties.ListItem, properties.ListItem.Fields.GetField("Author")).Email;
string masage = "Your task: " + properties.ListItem.Title.ToString() + " Deleted by " +properties.UserLoginName + "on Date:" + currentDate;
string title = "Task: " +properties.ListItem.Title.ToString() + " Deleted." ;
SPUtility.SendEmail(web, false, false, authormail, title, masage);
}
catch (Exception)
{
properties.ErrorMessage ="Error on Sending Email Aftre Deleted an Item";
}
}

}

public override void ItemDeleting(SPItemEventProperties properties)
{
SPWeb currentWeb = properties.OpenWeb();
SPUser currentUser = GetUser(currentWeb, properties.UserLoginName);
SPUser createdByUser = GetUser(properties.ListItem, properties.ListItem.Fields.GetField("Author"));
if ((properties.UserLoginName != createdByUser.LoginName) | (!(currentUser.IsSiteAdmin)))
{
properties.Cancel = true;
properties.ErrorMessage = "Deleting of Items not allowed!";
}
}


public override void ItemUpdating(SPItemEventProperties properties)
{
SPWeb currentWeb = properties.OpenWeb();
SPUser currentUser = GetUser(currentWeb, properties.UserLoginName);
SPUser createdByUser = GetUser(properties.ListItem, properties.ListItem.Fields.GetField("Author"));
bool curentUserIsSiteAdmin = currentUser.IsSiteAdmin;
SPListItem currentListItem = properties.ListItem;
string befor = currentListItem["Status"].ToString();
bool answer = (properties.UserLoginName != createdByUser.LoginName) | ((!(curentUserIsSiteAdmin)) & (befor == "Completed") & (properties.UserLoginName != createdByUser.LoginName)) | (!(curentUserIsSiteAdmin));


if (answer)
{
this.DisableEventFiring();
properties.Cancel = true;
properties.ErrorMessage = "Editing of 'Completed' Item is not allowed for you!";
this.EnableEventFiring();
}


}
}
}