Laurent Cotton
WSS 3.0 - Création et déploiement d'un EventHandler
Nous allons voir au travers d'un exemple complet comment créer et déployer un EventHandler dans Windows SharePoint Services 3.0. Les EventHandlers sont une nouveauté de WSS 3.0 et permettent d'être notifiés par WSS et d'agir sur certains évènements
Par Laurent Cotton publié le 21/05/2007 à 00:20, lu 7933 fois, 4 pages
 2 | Création d'un EventHandler
Il est très facile de créer un EventHandler pour WSS 3.0. Commençons par créer un nouveau projet de type Class Library avec Visual Studio 2005. Dans mon exemple, le projet se nomme Bewise.Wss3.Sample.EventHandler. La première chose à faire est de signer le projet. En effet, une des contraintes fortes des EventHandler est qu'ils doivent être déployés dans le GAC et donc, signés. Ajoutez ensuite une référence vers la dll Microsoft.SharePoint (Dans le cas d'une installation par défaut de WSS 3.0, cette dll est stockée dans le répertoire C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI).
Nous allons maintenant créer le Handler proprement dit. Pour cela, je vais renommer la classe Class1 créée par défaut par Visual Studio en FullNameContactHandler. Tout le reste se passe dans le code de cette classe.
Je rajoute tout d'abord une clause using permettant de référencer l'assembly Microsoft.SharePoint. Ensuite, je modifie la déclaration de ma classe pour la faire hériter de la classe SPItemEventReceiver. Cette classe va me permettre de créer un EventHandler capable d'agir sur des évènements d'items (création, modification, ...).
Je vais ensuite surcharger les méthodes de la classe SPItemEventReceiver correspondant aux événements sur lesquels je souhaite que mon handler réagisse, à savoir, la création et la mise à jour d'un contact. Les deux méthodes concernées sont ItemAdding et ItemUpdating.
Remarque :Il existe également les méthodes ItemAdded et ItemUpdated. A la différence des méthodes que nous allons utiliser, et d'une manière plus générale, les méthodes en « ed » sont asynchrones. Elles sont déclenchées à la fin du traitement standard fait par WSS. Les méthodes en « ing » sont, elles, synchrones et permettent d'annuler le traitement (création, mise à jour, ...).
Après avoir réalisé ces étapes, nous obtenons le code suivant :

using System;

using Microsoft.SharePoint;

 

namespace Bewise.Wss3.Sample.EventHandler

{

  public class FullNameContactHandler : SPItemEventReceiver 

  {

 

    public override void ItemAdding(SPItemEventProperties properties)

    {

    }

 

    public override void ItemUpdating(SPItemEventProperties properties)

    {

    }

  }

}

Nous allons maintenant pouvoir mettre en place l'intelligence de notre Handler. Comme le traitement à réaliser lors de la création et de la mise à jour est le même, je vais créer une fonction ComputeFullName qui se chargera de calculer le nom complet. Il ne me restera ensuite plus qu'à l'appeler depuis chacun des événements avec les bons paramètres. Voici ci-dessous le code de cette fonction :

public String ComputeFullName(String firstName,

                String lastName,

                String fullName)

{

  if (String.IsNullOrEmpty(fullName))

    return String.Format("{0}, {1}", lastName, firstName);

  else

    return fullName;

}

Cette fonction attend en paramètre le prénom, le nom et le nom complet. Si le nom complet est null, alors la fonction retourne la concaténation du prénom et du nom séparé par une virgule. Dans le cas contraire, elle retourne la valeur du nom complet.
Maintenant, il faut nous charger d'appeler la méthode ComputeFullName lors de la notification de création et de mise à jour. Il va donc falloir, dans chacune de ces méthodes, récupérer les valeurs entrées par l'utilisateur WSS dans les champs prénom, nom et nom complet. Ensuite, nous appellerons la fonction ComputeFullName en lui passant ces valeurs et nous réaffecterons le résultat au champ nom complet.
Pour accéder aux valeurs des champs d'un Item, chaque événement fournit en paramètre un objet de type SPItemEventProperties. Cet objet contient 2 collections intéressantes :
  1. BeforeProperties : Collection des valeurs des champs avant la mise à jour (valeurs d'origine)
  2. AfterProperties : Collections des valeurs courantes des champs.
Pour récupérer la valeur de la colonne First Name, il me suffit donc de récupérer dans la collection AfterProperties, la valeur de la colonne First Name et ainsi de suite. Idem pour modifier la valeur d'un champ. Il suffit de modifier la valeur du champ dans la collection AfterProperties. Voici ci-dessous le code complet permettant de récupérer les valeurs nécessaires à l'appel de la fonction ComputeFullName et l'affectation du résultat au champ Full Name.

public override void ItemAdding(SPItemEventProperties properties)

{

  String firstName = null;

  String lastName = null;

  String fullName = null;

 

  firstName = properties.AfterProperties["FirstName"].ToString();

  lastName = properties.AfterProperties["Title"].ToString();

  fullName = properties.AfterProperties["FullName"].ToString();

 

  fullName = ComputeFullName(firstName, lastName, fullName);

 

  properties.AfterProperties["FullName"] = fullName;

}

 

 

Remarque :Lorsque vous souhaitez lire ou écrire une valeur dans la collection, vous pouvez remarquer que le champ ciblé est identifié par son nom : soyez donc vigilant lors de l'écriture de ces noms.
Voici donc le code complet de notre Handler

using System;

using Microsoft.SharePoint;

 

namespace Bewise.Wss3.Sample.EventHandler

{

  public class FullNameContactHandler : SPItemEventReceiver 

  {

 

    public override void ItemAdding(SPItemEventProperties properties)

    {

      String firstName = null;

      String lastName = null;

      String fullName = null;

 

      firstName = properties.AfterProperties["FirstName"].ToString();

      lastName = properties.AfterProperties["Title"].ToString();

      fullName = properties.AfterProperties["FullName"].ToString();

 

      fullName = ComputeFullName(firstName, lastName, fullName);

 

      properties.AfterProperties["FullName"] = fullName;

    }

 

    public override void ItemUpdating(SPItemEventProperties properties)

    {

      String firstName = null;

      String lastName = null;

      String fullName = null;

 

      firstName = properties.AfterProperties["FirstName"].ToString();

      lastName = properties.AfterProperties["Title"].ToString();

      fullName = properties.AfterProperties["FullName"].ToString();

 

      fullName = ComputeFullName(firstName, lastName, fullName);

 

      properties.AfterProperties["FullName"] = fullName;

    }

 

    public String ComputeFullName(String firstName,

                    String lastName,

                    String fullName)

    {

      if (String.IsNullOrEmpty(fullName))

        return String.Format("{0}, {1}", lastName, firstName);

      else

        return fullName;

    }

  }

}

Voilà, notre EventHandler est maintenant complet. Il nous faut maintenant le déployer.
Afin de connaître le nom des colonnes disponibles sur la liste, vous trouverez dans le code en exemple une méthode TraceColumnName qui vous permet de lister les colonnes de la liste sur laquelle travaille le handler. En voici le code :

public void TraceColumnName(ref SPItemEventProperties properties)

{

    foreach (Object o in properties.AfterProperties)

    {

      properties.ErrorMessage += String.Format("{0} - {1}\n",

          ((System.Collections.DictionaryEntry)o).Key.ToString(),

          ((System.Collections.DictionaryEntry)o).Value.ToString());

    }

    properties.Cancel = true;

}

 

Que fait donc cette méthode ? C'est simple, elle affiche la liste des colonnes disponibles avec leur valeur à partir de la collection AfterProperties et annule l'évènement en simulant une erreur. Le message d'erreur alors affiché correspond aux colonnes avec leur valeur. Pour utiliser cette méthode, modifiez l'évènement ItemAdding comme suit :

public override void ItemAdding(SPItemEventProperties properties)

{

  TraceColumnName(ref properties);

  return;

 

  String firstName = null;

  String lastName = null;

  String fullName = null;

 

  firstName = properties.AfterProperties["FirstName"].ToString();

  lastName = properties.AfterProperties["Title"].ToString();

  fullName = properties.AfterProperties["FullName"].ToString();

 

  fullName = ComputeFullName(firstName, lastName, fullName);

 

  properties.AfterProperties["FullName"] = fullName;

}

Que se passe-t-il alors ? Lors de l'ajout d'un contact dans notre liste, la méthode TraceColumnName sera appelée. Cette dernière annulera l'insertion et retournera en message d'erreur une liste sous la forme nomDeLaColonne – valeurDeLaColonne.
Quand vous n'en avez plus besoin, il vous suffit de supprimer ou de commenter le code rajouté.
 
» Démarrer une discussion
 
Discussion démarée par samwokw le 07/06/2009 à 12:54, 1 commentaire(s).
Discussion démarée par fibreoptique le 16/06/2009 à 11:43, 1 commentaire(s).
Discussion démarée par devileye le 24/08/2007 à 11:11, 1 commentaire(s).