Desenvolvimento - Sharepoint - Dev

Ativando Event Receiver para uma Lista Específica no SharePoint 2007

Nesse artigo nós exploramos de uma forma prática e simples como Ativar um Event Receiver programaticamente em uma lista específica, utilizando o modelo de Features para ativação do Recurso.

por Wagner Amorim



Overview

Recentemente publicamos um artigo aqui na Comunidade Canal SharePoint Explorando a Criação de Event Receivers no SharePoint (Criando e Explorando os Event Receivers no MOSS 2007 \ WSS 3.0), portanto nosso objetivo hoje não é se aprofundar nos conceitos do funcionamento de Event Receivers no SharePoint, para isso leiam o artigo citado acima.

No exemplo anterior, nós exploramos os Event Receivers, sendo ativados via “Features” no escopo de tipo de lista, que implantava o “receiver” em todas as listas/bibliotecas presentes no site que eram do tipo de lista especificado, hoje gostaria de demonstrar como ativar um Event Receiver somente para uma lista específica, também via Feature.

Solução

Para esse exemplo, vou simplesmente gravar um log no Windows informando que o item foi adicionado na lista.

Lets Work!

Vou utilizar um ambiente com o Visual Studio 2008 + Extensions for WSS 3.0 v1.2, Windows SharePoint Services 3.0 e o Windows Server 2003 instalados em uma VM.

Crie uma lista do tipo “Custom List” com o nome “ListaC”, não adicione nem exclua nenhum campo.

1. Criando o Event Receiver

1.1. No Visual Studio 2008, clique em “File/New/Project”.

1.2. Crie um Novo Projeto do tipo “Visual C#/SharePoint/Empty” e renomeie para “EROnlyOneList”.

1.3. Adicione uma nova classe e renomeie para “ERGravarLogs”.

1.4. Adicione referência para a assembly “Microsoft.SharePoint”, clique com o botão direito em “References/Add Reference” e selecione o componente “Windows SharePoint Services” na guia “.NET”.




1.5. Importe para essa classe o namespace “Microsoft.SharePoint”.

using Microsoft.SharePoint;

1.6. No nosso caso vamos herdar a classe SPItemEventReceiver, porque queremos manipular eventos no nível de itens de lista.

class ERGravarLogs : SPItemEventReceiver

1.7. Implemente “override” no método ItemAdded e a lógica com o código para gravar log no Windows.

public override void ItemAdded(SPItemEventProperties properties)

{

SPListItem Item = properties.ListItem;

EventLog.WriteEntry("Artigo ER - Canal SharePoint", "O Item " + Item["Title"].ToString() + " foi adicionado com sucesso!", EventLogEntryType.Information);

}

2. Deploy do Event Receiver.

Nós podemos fazer o deploy de Event Receivers, basicamente de três formas diferentes:

§ Deploy Programaticamente

§ Deploy com Content Types

§ Deploy via Features

Vamos utilizar o modelo de Deploy Programaticamente, mas para não fugir do modelo ideal de deploy do SharePoint vamos executar nosso código via Features.

Nesse passo iremos ativar o Event Receiver criado acima, para isso, vamos criar uma classe que irá interceptar o evento de “ativação” da feature que também iremos criar adiante, essa classe irá ativar o Event Receiver no momento que a feature for ativada.

Nessa classe iremos herdar a classe SPFeatureReceiver e vamos sobrescrever o método FeatureActivated, para executar o código que irá ativar o Event Receiver na lista desejada e o método FeatureDeactivating, para desativar o Event Receiver na lista.

2.1. Repita o passo 1.3, criando uma nova classe, renomeie essa classe para “AtivarER”.

2.2. Repita o passo 1.5 e importe o namespace “Microsoft.SharePoint” para sua nova classe.

2.3. Implemente a classe SPFeatureReceiver na sua classe AtivarER.

public class AtivarER: SPFeatureReceiver

{

public override void FeatureActivated(SPFeatureReceiverProperties properties)

{

throw new NotImplementedException();

}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)

{

//throw new NotImplementedException();

}

public override void FeatureInstalled(SPFeatureReceiverProperties properties)

{

//throw new NotImplementedException();

}

public override void FeatureUninstalling(SPFeatureReceiverProperties properties)

{

//throw new NotImplementedException();

}

}

Obs.: Conforme podem ver acima, comentei a exception nos 2 métodos que não vou implementar (FeatureUninstalling e FeatureInstalled).

Agora vamos implementar o código que irá adicionar e ativar nosso Event Receiver na lista selecionada, para isso vamos utilizar o método FeatureActivated, como o próprio nome diz, esse é um método que será acionado toda vez que a nossa Feature for Ativada.

2.4. Implemente o seguinte código no método FeatureActivated.

public override void FeatureActivated(SPFeatureReceiverProperties properties)

{

try

{

using (SPSite site = properties.Feature.Parent as SPSite)

{

using (SPWeb web = site.RootWeb)

{

string AssemblyName = System.Reflection.Assembly.GetExecutingAssembly().FullName;

string ClassName = "EROnlyOneList.ERGravarLogs";

//Adicionando o Event Receiver na Lista Selecionada

web.Lists["ListC"].EventReceivers.Add(SPEventReceiverType.ItemAdded, AssemblyName, ClassName);

}

}

}

catch

{

//Tratar erro na tentativa de registrar o Event Receiver

}

}

Por boas práticas é bom também implementarmos o método que irá desativar e excluir o Event Receiver da nossa lista, para isso vamos utilizar o método FeatureDeactivating.

2.5. Implemente o seguinte código no método FeatureDeactivating.

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)

{

try

{

using (SPSite site = properties.Feature.Parent as SPSite)

{

using (SPWeb web = site.RootWeb)

{

string AssemblyName = System.Reflection.Assembly.GetExecutingAssembly().FullName;

SPList ListC = web.Lists["ListC"];

//Excluindo o Event Receiver na Lista Selecionada

for (int i = 0; i < ListC.EventReceivers.Count; i++)

{

if (ListC.EventReceivers[i].Assembly.Equals(AssemblyName))

ListC.EventReceivers[i].Delete();

} // looping para encontrar o Event Receiver na lista.

ListC.Update();

web.Update();

}

}

}

catch

{

//Tratar erro na tentativa de registrar o Event Receiver

}

}

2.6. Compile a aplicação e elimine qualquer erro (CTRL+SHIFT+B).

2.7. Associe uma “strongly name” à sua assembly.

§ Na Janela “Solution Explorer” do VS 2008, clique 2 vezes na pasta “Properties” do seu projeto.

§ Na janela Properties, navegue até a guia “Signing”.

§ Marque a opção “Sign the assembly”.

§ No dropdown “Choose a strong name key file”, clique em New e atribua um nome para o “Key file name”, desmarque a opção “Protect my key file with a password”.

§ Clique em OK e depois em Salvar na janela Properties.

2.8. Compile novamente a aplicação (CTRL+SHIFT+B).

Agora precisamos fazer o deploy do nosso Event Receiver no SharePoint, esse é realmente o foco do artigo, pois no nosso caso vamos ativar o Event Receiver somente em uma lista específica.

2.9. Copie a DLL (Pasta do Projeto\bin\Debug) gerada pelo seu projeto no GAC (C:\WINDOWS\assembly) do(s) seu(s) WFE (Web Front End).

Obs.: Se estivéssemos trabalhando com o modelo correto de deploy, feature + solution, esse passo não seria necessário, mas esse é assunto para outro post.

3. Criando a Feature.

Com a feature conseguiremos executar o deploy do Receiver programaticamente através do método ActivatedFeature.

3.1. Criando uma feature.

§ Adicione um novo item ao projeto chamado feature.xml, do template “XML File”.

§ Adicione o seguinte código ao arquivo:

<?xml version="1.0" encoding="utf-8" ?>

<Feature Id="0623F222-1C57-49B5-86FA-F8E723A574E3"

Title="Canal SharePoint - Ativando um ER para uma Lista Específica"

Description="Feature criada para Ativar um Event Receiver em uma lista específica"

Version="1.0.0.0"

Scope="Site"

ReceiverAssembly="EROnlyOneList, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=ceaf7823302b8efb"

ReceiverClass="EROnlyOneList.AtivarER"

xmlns="http://schemas.microsoft.com/sharepoint/" />

§ Altere a propriedade “ID”, para um novo GUID, existem vários programas que geram um novo GUID, existe até sites que geram on-line (ex: http://createguid.com).

3.2. Publicando a feature.

Após a criação desse arquivo (feature.xml), agora basta navegar até a pasta raiz das features no SharePoint (C:/Program Files/Common Files/Microsoft Shared/web server extensions/12/TEMPLATE/FEATURES), criar uma pasta para armazenar a feature (ex: CanalSharePointER2) e copiar o arquivo lá.

3.3. Instalando a feature.

§ Execute o seguinte comando na ferramenta STSADM

STSADM -o installfeature -name CanalSharePointER2

Obs.: Caso não saiba como utilizar o STSADM, acesse:

Stsadm command-line tool

http://technet.microsoft.com/en-us/library/cc261956.aspx

3.4. Ativando a feature.

Existem várias formas de se ativar uma feature, também podemos ativar via linha de comando (STSADM), porém acho mais fácil via interface com a aplicação, para isso siga os passos:

§ No site que deseja ativar a feature, clique no menu “Site Actions/Site Settings”.

§ Na janela de configuração, clique em “Site Collection Administration/Site Collection features”.

§ Note que a feature com o nome preenchido no arquivo “feature.xml”, está disponível, pronta para ser ativada.

§ Clique no botão Activate.

§ Reinicie o IIS (Start/Run/IISRESET)

Pronto! Agora pode testar a aplicação, se ocorrer tudo bem, ao adicionar novos itens na sua lista, serão gravados logs no Windows na guia Application, veja na imagem abaixo.

Também não deixe de fazer o teste de desativação da feature, para isso volte pra a página de Site Collection Features, desative a feature criada, adicione um novo item na lista e verifique se outro log foi criado.

Conclusão

Nesse artigo nós exploramos de uma forma prática e simples como Ativar um Event Receiver programaticamente em uma lista específica, utilizando o modelo de Features para ativação do Recurso.

Espero que tenham gostado.

Abraços!

Wagner Amorim

Wagner Amorim - Consultor com 7 anos de experiência no mercado de TI, já atuou em diversos projetos para médias e grandes empresas. Focado em tecnologias Microsoft, têm se especializado nas Tecnologias SharePoint e Microsoft .NET desde 2003. Membro ativo das comunidades Technet e MSDN voltadas para SharePoint e Líder da maior Comunidade de SharePoint no Brasil (Canal SharePoint).
Possui as certificações MCP: .NET Framework 2.0, MCTS: .NET Framework 2.0 Web Applications, Windows SharePoint Services 3.0: AD, Windows SharePoint Services 3.0: Config., Microsoft Office SharePoint Server 2007: Config., Microsoft Office SharePoint Server 2007: AD e MCPD: Web Developer.
Blog:
http://waamorim.spaces.live.com/