Lorsqu'un utilisateur utilise SharePoint, plusieurs événements différentes peuvent survenir. Par exemple, la création d'un élément dans une liste, la suppression de cet élément, la création d'un liste,... Pour les personnes qui connaissent déjà cela sous SharePoint 2007, ce cours va présenter une nouveauté sur le sujet. Effectivement, il est maintenant possible d'intercepter la création et la suppression d'une liste SharePoint. Que les personnes n'ayant jamais fait de SharePoint 2007 ne s'inquiètent pas, nous allons tout reprendre depuis le début sur base d'un exemple.
Commencez par ouvrir Visual Basic Sutdio 10 et créez un nouveau projet de type Event Receiver :
Dans l'écran suivant, choisissez de créer une solution "sandboxed" (certainement "bac en sable" en français). L'écran suivant vous permet de choisir quel type d'événement vous désirez intercepter. Ici, nous ne choisirons que ceux relatifs à la liste. Choisissez donc List Events dans la liste déroulante et cochez les 4 derniers événements de la liste :
Votre projet sera ensuite créé et contiendra déjà quelques fichiers. Les noms de ceux-ci n'étant pas très parlant, nous allons procéder à un renommage de ceux-ci pour que notre projet soit plus clair. Dans l'arborescence de votre dossier, localisez l'élément EventReceiver1. Cliquez une fois dessus et pressez ensuite F2 pour le renommer. Définissez le nouveau nom de cet élément sur AreaProgEventReceiver. Cliquez maintenant sur la petite flèche à gauche de cet élément pour voir les éléments qu'il contient :
Renommez alors le fichier EventReceiver1.cs en AreaProgEventReceiver.cs. Nous allons maintenant nous pencher sur le code contenu dans ces deux fichiers. Nous n'allons de toute façon pas avoir le choix de les comprendre car nous allons devoir les modifier pour appliquer le nouveau nom partout. Commencez par le fichier Elements.xml qui doit ressembler à ceci :
Si vous observez bien ce fichier, vous remarquerez qu'une section du type :
Revient 4 fois. En fait, chacune de ces sections va nous permettre d'enregistrer un événement et de l'attacher aux listes. L'élément Name devra simplement contenir le nom de notre événement, ici, nous remplacerons tous les EventReceiver1 par AreaProgEventReceiver.
L'élément Type va nous permettre de définir le type d'événement que nous déclarons. Dans ce cours, nous n'aborderons que 4 types d'événements différents :
ListAdding : L'événement est déclenché lors de la création d'une liste.
ListDeleting : L'événement est déclenché lors de la suppression d'une liste.
ListAdded : L'événement est déclenché après la création de la liste.
ListDeleted : L'événement est déclenché après la suppression de la liste.
Nous avons ensuite les éléments Assembly et Class qui vont ensemble. Le premier de ces deux éléments va contenir la signature de la DLL contenant le code à exécuter lorsque un événement est intercepté. Généralement, cette DLL est celle résultant de la compilation de la solution courante. Quand c'est le cas, il suffit de mettre $SharePoint.Project.AssemblyFullName$ et cette valeur sera automatiquement remplacée par Visual Studio.
L'attribut Class quant à lui doit contenir le chemin d'accès complet (namespace . classname) de la classe contenant le code à exécuter. Dans notre exemple, cette classe est contenue dans le fichier AreaProgEventReceiver.cs, mais nous allons la renommer. Remplacez donc tous les AreaProg.EventReceiver.List.EventReceiver1.EventReceiver1 par AreaProg.EventReceiver.AreaProgEventReceiver.
Enfin, l'élément Sequence permet de définir l'ordre dans lequel les événements seront exécutés. En fait, l'Event receiver avec le plus petit numéro de Sequence sera exécuté en premier suivi de tous les autres en ordre croissant.
Au final, votre fichier devrait ressembler à ceci :
Revenons maintenant à notre classe. Tout à l'heure, nous avons modifié l'élément Class pour que celui-ci soit plus lisible, nous allons donc devoir modifier le namespace de la classe de :
à :
Et le nom de notre classe de :
à :
Enfin, il nous reste un dernier élément à renommer. Effectivement, Visual Studio a implicitement créé une feature pour contenir notre event receiver. Ouvrez donc le dossier Features de l'arborescence de votre projet, localisez Feature1 et renommez la en AreaProgEventReceiverFeature.
Revenons maintenant à notre cette classe. Vous avez certainement remarqué qu'elle dérive de la classe SPListEventReceiver. Celle-ci va nous permettre de surcharger 4 méthodes. Chacune de ces méthodes correspondra à une type d'événements. Par exemple, dans notre fichier Elements.xml, nous avions cette section :
Lorsque SharePoint va lire votre fichier et tomber sur cette section, il va automatiquement chercher la méthode :
Dans votre classe. Autrement dit, pour chaque section Receiver de votre fichier Elements.xml, une méthode (portant le même nom que l'élément Type) devra être déclarée. Étant donné que vous allons intercepter les 4 types d'événements, Visual Studio surcharge automatiquement les 4 méthodes :
Notre exemple va être assez simple et nous permettra de sauvegarder les événements interceptés dans une liste. Créez donc une liste qui permettra de contenir des éléments correspondant chacun à un événement.
Il existera également deux contraintes : Il ne sera pas possible de supprimer la liste contenant les informations et il sera impossible de créer une liste dont le nom ne dépasse pas 2 caractères.
Avant de commencer à coder cette logique, rendez vous sur le site et créez une liste personnalisée que vous nommerez List event logger. Créez ensuite une colonne dans ce site que vous appellerez Log et qui contiendra quelques informations sur les événements. Ce champ devra être du type MultiLine ("plusieurs lignes de texte"). Une fois ceci fait, nous allons pouvoir passer à la partie programmation.
La première méthode que nous allons surcharger est ListAdded. Celle-ci sera exécutée à chaque fois qu'une liste sera créée sur le site. Insérez le code suivant pour cette fonction :
La première de ces lignes va nous permettre de récupérer une référence à la liste nommée List event logger. Une fois cette référence récupérée, nous allons ajouter un élément dans cette liste grâce à la méthode Add appliquée sur la collection Items. Cette collection représente la liste des éléments contenus dans la liste, et donc, la fonction Add permet simplement d'ajouter un nouvel élément dans la liste. Nous modifions ensuite le titre de cet élément par le type d'événement intercepté. Pour faire cela, il suffit juste d'accéder à la propriété EventType de l'objet properties.
Vous remarquerez que cet objet est passé à chacune des fonctions de notre classe. Il contiendra quelques propriétés permettant d'obtenir tous les renseignements utiles relatifs à l'événement, comme par exemple une référence à la liste ayant déclenché l'événement, une référence au site Web contenant cette liste, le type de l'événement,...
Nous modifions ensuite le champ Log de l'élément pour afficher certaines informations utiles recueillies directement dans l'objet properties. Nous formatons le code en HTML pour que celui-ci apparaisse correctement à l'affichage de l'élément via l'UI de SharePoint. Les informations récupérées sont :
- Le login de la personne actuellement connectée (properties.UserLoginName)
- Le type de la liste créée (properties.List.BaseTemplate)
- Le titre de la liste (properties.List.Title)
Une fois les champs initialisés, nous appelons la méthode Update de l'élément pour le mettre à jour. Passons maintenant à la méthode ListAdding. Dans cette méthode, nous allons vérifier que le nom de la liste est bien supérieur à 2 caractères. Si ce n'est pas le cas, nous afficherons un message d'erreur et nous interromprons le processus de création de la liste :
Nous accèdons au titre de la liste grâce à properties.ListTitle car étant donné que la liste n'est pas encore créée, properties.List sera null et il sera donc impossible d'accèder à sa propriété Title. Nous vérifions donc si la longueur de ce titre est inférieur à 3 caractères. Si c'est le cas, nous commençons par définir la propriété ErrorMessage qui permettra de définir le message d'erreur affiché dans le cas où le titre n'est pas assez long. Enfin, nous modifions la propriété Cancel sur true pour indiquer que le processus de création devra être interrompu.
Passons maintenant à la méthode ListDeleting qui va simplement se charger de vérifier que nous n'essayons pas de modifier la liste contenant les logs. Si c'est le cas, le processus devra être interrompu :
Etant donné que la liste existe bien lors de sa suppression, vous remarquerez que nous pouvons accéder à la propriété List de l'objet properties. Passons enfin à la méthode ListDeleted qui sera exécutée une fois qu'une liste aura été supprimée. Tapez donc ceci dans le corps de la méthode :
Ce code est relativement similaire à celui de la méthode ListAdded à la différence près que nous ne pouvons plus accéder à la propriété List de l'objet properties étant donné que la liste est bel et bien supprimée.
La partie programmation est maintenant terminée. Compilez et déployez votre projet pour réaliser les test. Commencez tout d'abord par créer une liste personnalisée que vous nommerez "lu". Ce message devrait apparaître :
Notre event receiver a donc bien détecté que "lu ne faisait que 2 caractères, il a donc interrompu le processus de création de l'élément et affiché le message d'erreur désiré. Essayez maintenant de supprimer la liste nommée List event logger :
Créez ensuite une liste personnalisée que vous nommerez Test. Rendez vous ensuite dans la liste List event logger, vous pourrez alors voir cet élément :
Ainsi que vous pouvez le constater, un élément reprenant la création de la liste a bien été enregistré. Le titre de l'élément est bien ListAdded, c'est-à-dire le type de l'événement. Pour ce qui est du contenu du champ Log, il reprend bien le login de l'utilisateur, le type de la liste ainsi que le titre de celle-ci. Enfin, supprimez cette liste et retournez dans la liste List event logger :
L'événement est bien intercepté et enregistré dans la liste avec les quelques informations désirées. Dans les prochains cours, nous verrons les autres types d'événements que nous pouvons gérer.













