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();
}


}
}
}

1 comment:

  1. Well, Great! Interestingly written review. Turning attention on cheapest solutions in home insurance, it is the right way to receive cheapest home owners insurance.

    ReplyDelete