Event Receiver, Share Point portallerinde gerçekleşen olayların yakalanıp, ihtiyaçlara göre gerekli işlemlerin gerçekleştirilmesini ifade eder.Beş tür event receiver vardır. Bu event receiverlar ve yakalanan eventlar aşağıdaki gibidir:

List Events:

Listeler üzerinde gerçekleşen eventlardır.

A field was added: Listeye bir field eklendikten sonra tetiklenir(FieldAdded).

A field is being added: Listeye bir field eklenirken tetiklenir(FieldAdding).

A field was removed: Listeden bir field silindikten sonra tetiklenir(FieldDeleted).

A field is being removed: Listeden bir field silinirken tetiklenir(FieldDeleting).

A field was updated: Listenin bir fieldı güncellendikten sonra tetiklenir(FieldUpdated).

A field is being updated: Listenin bir fieldı güncellenirken tetiklenir(FieldUpdating).

A list is being added: Site’a bir liste eklenirken tetiklenir(ListAdding).

A list is being deleted: Site’dan bir liste silinirken tetiklenir(ListDeleting).

A list was added: Site’a bir liste eklendikten sonra tetiklenir(ListAdded).

A list was deleted: Site’dan bir liste silindikten sonra tetiklenir(ListDeleted).

List Item Events:

Liste elemeanları üzerinde gerçekleşen eventlardır.

An item is being added: Listeye bir item eklenirken tetiklenir(ItemAdding).

An item is being updated: Listedeki bir item güncellenirken tetiklenir(ItemUpdating).

An item is being deleted: Listeden bir item silinirken tetiklenir(ItemDeleting).

An item is being checked in: Listedeki bir item check in yapılırken tetiklenir(ItemCheckingIn).

An item is being checked out: Listedeki bir item check out yapılırken tetiklenir(ItemCheckingOut).

An item is being unchecked out: Listedeki bir item undo check out yapılırken tetiklenir(ItemUncheckingOut).

An attachment is being added to the item: Listedeki bir item’a attachment yapılırken tetiklenir(ItemAttachmentAdding).

An attachment is being removed from the item: Listedeki bir item’dan ekli olan attachment silinirken tetiklenir(ItemAttachmentDeleting).

A file is being moved: Doküman kütüphanesindeki bir dosya başka bir lokasyona taşınırken tetiklenir(ItemFileMoving).

An item was added: Listeye bir item eklendikten sonra tetiklenir(ItemAdded).

An item was updated: Listedeki bir item güncellendikten sonra tetiklenir(ItemUpdated).

An item was deleted: Listeden bir item silindikten sonra tetiklenir(ItemDeleted).

An item was checked in: Listedeki bir item check in yapıldıktan sonra tetiklenir(ItemCheckedIn).

An item was checked out: Listedeki bir item check out yapıldıktan sonra tetiklenir(ItemCheckedOut).

An item was unchecked out: Listedeki bir item undo check out yapıldıktan sonra tetiklenir(ItemUncheckedOut).

An attachment was added to the item: Listedeki bir item’a attachment yapıldıktan sonra tetiklenir(ItemAttachmentAdded).

An attachment was removed from the item: Listedeki bir item’da ekli olan attachment silindikten sonra tetiklenir(ItemAttachmentDeleted).

A file was moved: Doküman kütüphanesindeki bir dosya taşındıktan sonra tetiklenir(ItemFileMoved).

A file was converted: Doküman kütüphanesindeki bir dosya, bir tipten başka bir tipe çevrildiğinde tetiklenir(ItemFileConverted).

The list received a context event: Internal işlemler için ayrılmış. Koddan direkt kullanılmıyormuş(msdn). 🙂 (ContextEvent)

List Email Events:

The list received an e-mail message: E-mail almak üzere yapılandırılmış listelerde e-mail alındığında tetiklenir(EmailReceived).

Web Events:

Site collection veya site’lar üzerinde gerçekleşen eventlardır.

A site collection is being deleted: Bir site collection silinirken tetiklenir(SiteDeleting).

A site is being deleted: Bir site silinirken tetiklenir(WebDeleting).

A site is being moved: Bir site başka bir site collection’a taşınırken tetiklenir(WebMoving).

A site is being provisioned: Yeni bir site eklenirken tetiklenir(WebAdding).

A site collection was deleted: Bir site collection silindikten sonra tetiklenir(SiteDeleted).

A site was deleted: Bir site silindikten sonra tetiklenir(WebDeleted).

A site was moved: Bir site başka bir site collection’a taşındıktan sonra tetiklenir(WebMoved).

A site was provisioned: Yeni bir site eklendikten sonra tetiklenir(WebProvisioned).

List Workflow Events:

A workflow is starting: Bir iş akışı başlatılırken tetiklenir(WorkflowStarting).

A workflow was started: Bir iş akışı başlatıldıktan sonra tetiklenir(WorkflowStarted).

A workflow was postponed: Bir iş akışı ertelendiğinde tetiklenir(WorkflowPostponed).

A workflow was completed: Bir iş akışı tamamlandıktan sonra tetiklenir(WorkflowCompleted).

Projeye event receiver eklediğinizde default olarak Web feature scope’undadır. WebDeleted, WebDeleting gibi event receiverlar bütün sitelar için bu feature scope’da tetiklenmez. Bunun için event receiver’ın feature scope’unu Site yapmanız gerekmektedir. Feature scopes konusunu başka bir yazıda ele alırız.

Şimdi birkaç  örnek yapalım.

Visual Studio’da SharePoint/2010 altından bir tane Empty SharePoint Project oluşturup, solution’a sağ tıklayıp Add/New Item seçeneği ile Event Receiver ekleyelim. Event receiver türünü ve seçilen event receiver türüne göre yakalanabilecek eventları seçmemizi sağlayan bir iletişim penceresi karşımıza çıkacaktır. List Events ve List Item Events türlerinde receiver’ın hangi liste şablonu üzerine uygulanacağı da seçilir. Event receiver type olarak List Events ve yakalayacağımız eventler olarak  FieldAdded, FieldDeleting, ListDeleting eventlarını seçelim. Uygulanacak liste şablonu olarak Custom List seçeneğini seçelim. Event receiver base classından türetilmiş ve seçtiğimiz eventları override metodlar olarak içeren bir class oluşturulacaktır. Basitçe bu metodları işleyip, portal üzerinde tetiklenmelerini görelim:

public override void FieldAdded(SPListEventProperties properties)
{
base.FieldAdded(properties);
properties.List.Description += properties.FieldName + ” : “ + properties.Field.TypeDisplayName + ” “;
properties.List.Update();
}

public override void FieldDeleting(SPListEventProperties properties)
{
base.FieldDeleting(properties);
properties.ErrorMessage = properties.ListTitle + ” listesinden “ + properties.FieldName + ” fieldı silinemez.”;
properties.Cancel = true;
}

public override void ListDeleting(SPListEventProperties properties)
{
base.ListDeleting(properties);
if (properties.ListTitle == “Projects”)
{
properties.ErrorMessage = properties.ListTitle + ” listesini silemezsiniz”;
properties.Cancel = true;
}
}

Custom oluşturduğumuz bir listeye yeni bir field ekledikten sonra FieldAdded eventı tetiklenecektir. Listenin Description propertysine eklenen fieldın adını ve tipini yazacaktır. Eklediğimiz bu fieldı veya custom bir listedeki herhangi bir fieldı silmeye çalıştığımızda FieldDeleting eventı tetiklenecek ve hata ekranına yönlendirilecektir. Hata ekranında hata mesajı olarak ErrorMessage propertysine set ettiğimiz mesaj görüntülenecektir. Herhangi bir custom listeyi silmeye çalıştığınızda ListDeleting eventı tetiklenecektır. Projects listesi dışındaki custom listelerin silinmesine izin verilirken, Projects listesinin silinmesine izin verilmiyor.

Projemize bir tane daha event receiver ekleyelim. Bu defa event receiver type olarak List Item Events, template olarak Custom List ve tetikleyeceğimiz event olara ItemAdding ve ItemAttachmentDeleting seçeneklerini seçelim. Oluşturulan classda eventlarımızı işleyelim:

public override void ItemAdding(SPItemEventProperties properties)
{
base.ItemAdding(properties);
if (properties.List.ItemCount > 5)
{
properties.ErrorMessage = “Listeye yeni kayıt eklenemez.Kayıt Sayısı:” + properties.List.ItemCount.ToString();
properties.Cancel = true;
}
}

public override void ItemAttachmentDeleting(SPItemEventProperties properties)
{
base.ItemAttachmentDeleting(properties);
properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = “/_layouts/CustomErrorPage/AttachmentDeletionErrorPage.aspx”;
}

Oluşturulan custom bir listeye item eklenirken eğer listede 5 eleman var ise eleman eklenemiyor, hata mesajı ile hata ekranına yönlendiriyoruz. İkinci eventta ise listedeki bir item’a eklenmiş olan bir attachment silinirken tetiklenir. Bu defa Share Point’in hata ekranına değil, kendi oluşturduğumuz custom bir hata sayfasına yönlendiriyoruz.

Sonraki yazıda görüşmek üzere sevgili günlük 🙂

Reklamlar