Une des fonctionnalités particulièrement intéressante de SharePoint est le principe des alertes. En effet, il est possible de s'abonner à une liste pour être tenu informé des modifications sur cette liste. Plusieurs options nous sont offertes, comme par exemple, recevoir un email lorsqu'une modification est apportée à un document par un autre utilisateur que moi.
Ci dessous, une capture d'écran de SharePoint montrant les différentes options disponible:
Moyennant un petit peu de développement, il est tout à fait envisageable de modifier l'apparence de l'email envoyé aux utilisateurs abonnées à des listes. Pour ceci, je vous invite à vous reporter à l'article sur le site de Microsoft expliquant cette procédure.
Pour synthétiser cet article, il faut créer un fichier XML contenant tous les modèles d'alertes, et enregistrer auprès de notre ferme ces nouveaux modèles. Via une classe implémentant l'interface IAlertNotifyHandler, on peut même intercepter l'email avant que celui-ci ne soit envoyé, pour pouvoir l'altérer (modifier sont apparence par exemple).
Cependant, et voila le sujet qui nous intéresse, dans MOSS 2007 on peut également s'abonner à une recherche spécifique. L'idée, est de sauvegarder dans notre profil une recherche que l'on aurait effectuée, et d'être tenu informé via email lorsque cette recherche renvoie de nouveaux résultats, ou que les résultats renvoyés on été modifiés depuis la dernière demande.
Malheureusement, si vous désirez modifier l'apparence de l'email envoyé sur ce type d'alerte, l'article précédemment cité sur le site Microsoft ne vous aidera pas ....
En fouillant un peu dans les classes SharePoint grâce à l'excellent et indispensable outil .NET Reflector, je me suis aperçu que l'implémentation de l'interface précédente IAlertNotifyHandler pour le standard (dans l'assembly Microsoft.Office.Server.Search) était une classe internal. Dans le constructeur de cette classe, j'ai pu voir des variables nommées "TemplateName" et "TemplateXML" de type string contenant des valeurs écrites en dures.
TemplateName et TemplateXML, tiens tiens, le même genre d'information que dans le fichier XML alertTemplates.xml du dossier
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Xml
contenant tous les AlertTemplates standard.
Hmmmm, pourquoi ne pas modifier ce fichier XML, ajouter notre propre AlertTemplate en utilisant les informations glanées dans la classe ci-dessus, et créer notre propre classe implémentant IAlertNotifyHandler, et ainsi pouvoir personnaliser les alertes de recherche.
Voici donc la procédure à suivre pour mettre en place notre propre modèle:
1. Écrire une classe implémentant l'interface IalertNotifyHandler
public class MySearchAlertHandler : IAlertNotifyHandler
{
public bool OnNotification(SPAlertHandlerParams ahp)
{
../..
}
}
Remarque : Pensez bien au SPUtility.SendEmail pour l'envoi d'email à la fin de la procédure :-)
2. Faites une copie du fichier alertTemplates.xml se trouvant dans le dossier
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Xml
(en effet, ne modifiez pas le fichier standard) et nommer le CustomAlertTemplates.xml. Vous pourrez ainsi à tout moment restaurer le standard si le besoin s'en fait sentir
3. Ajouter un noeud AlertTemplate au noeud AlertTemplates, contenant les informations suivantes
1: <AlertTemplate Type="Custom" Name="OSS.Search" AlwaysNotify="True" DefaultTitle="Search">
2: <EventTypes IsVisible="True">
3: <EventType Mask="0x1" Selected="true">$Resources:searchadmin,SearchResults_ATEventDiscovered;</EventType>
4: <EventType Mask="0x2">$Resources:searchadmin,SearchResults_ATEventModified;</EventType>
5: <EventType Mask="0x3">$Resources:searchadmin,SearchResults_ATEventAll;</EventType>
6: </EventTypes>
7: <Frequency IsVisible="true" ShowImmediate="false" ShowDaily="true" ShowWeekly="true" ShowTime="false" DefaultFrequency="Daily"/>
8: <Filters IsVisible="false"/>
9: <Properties>
10: <NotificationHandlerAssembly>VOTRE ASSEMBLY</NotificationHandlerAssembly>
11: <NotificationHandlerClassName>NAMESPACE.MySearchAlertHandler</NotificationHandlerClassName>
12: <NotificationHandlerProperties></NotificationHandlerProperties>
13: <UpdateHandlerAssembly>VOTRE ASSEMBLY</UpdateHandlerAssembly>
14: <UpdateHandlerClassName>NAMESPACE.MySearchAlertHandler</UpdateHandlerClassName>
15: <UpdateHandlerProperties></UpdateHandlerProperties>
16: </Properties>
17: </AlertTemplate>
Ce qui est important ici, ce sont les attributs "Type" et "Name" de l'élément AlertTemplate. Ce sont ces valeurs qui apparaissent dans la classe interne découverte à l'aide de .NET Reflector, et qui vont justement nous permettre de personnaliser les alertes. Il faut donc bien préciser que la valeur de l'attribut "Type" est "Custom" et la valeur de l'attribut "Name" est "OSS.Search". Ainsi, lors de la génération des emails à envoyer, ce sera ce modèle qui sera sélectionné par SharePoint.
Pour les ligne 10 et 13, spécifiez bien la référence à l'assembly dans laquelle se trouve votre classe implémentant IAlertNotifyHandler sous la forme
Assembly, Version=xx, Culture=..., PublicKeyToken=xxx
Puis, ligne 11 et 14, préciser le chemin complet vers la classe précédemment créée.
4. Packager tout ça dans une solution (et oui, toujours penser aux solutions!) puis dites à votre ferme d'utiliser votre nouveau fichier contenant les modèles des alertes plutôt que le standard
stsadm -o updatealerttemplates -filename "Chemin vers CustomAlertTemplates.xml" -url SharePoint_URL
Et voila, vous avez maintenant des alertes de recherche custom.