none
eventHandler simple RRS feed

  • Question

  • bonjour à tous
    voila, je voudrais creer un truc tout simple sur une liste mais j'arrive pas à m'en sortir.
    Les exemples que je trouve partent toujours dans des choses un peu trop compliquées pour moi.
    En fait quand je modifie un element d'une liste (je clique dessus et j'arrive donc sur mon formulaire en modification)
    je voudrais pouvoir remplir automatiquement un champ "resume" qui reprendrait les 2 premiers lignes d'un champ "desciptif" , afin d'éviter à l'utilisateur de faire lui même un copier /coller pendant sa saisie.

    Auriez vous un exemple de code simple qui me permettrait de comprendre le principe de modif par un event handler.
    Je pourrais à partir ce cela comprendre et faire evoluer mon eventHandler ...
    Mille mercis d'avance .

    Sans vouloir faire "deux coups en un", est ce que qq sait comment on limite le nb d'annonces affichées sur une page (pas dans la liste, ça je sais) mais dans une webpart  qui fait reference à ma liste d'annonces et que j'affiche sur ma page default.

    Et bien encore merci à tous pour votre aide.
    jeudi 9 juillet 2009 08:52

Réponses

  • bonjour Arnault
    une fois de plus , vos conseils sont les bons !!!
    un grand grand merci à vous !!!
    vous me permettez d'avancer vraiment dans la compréhension du code
    Mais purée, cest quand même un peu tordu tout ça ;-)
    Bonne journée et surement ....... à bientôt
    Alain
    • Marqué comme réponse algeox jeudi 23 juillet 2009 07:01
    jeudi 23 juillet 2009 07:01

Toutes les réponses

  • C'est pas spécialement compliqué. Il suffit de partir du SPItemEventProperties.
    Tu trouveras des éléments de réponse ici : http://msdn.microsoft.com/en-us/library/ms437502.aspx

    Pour le WebPart, son affichage est basé sur une vue. 
    Modifie les paramétres d'affichage de ton WebPart via "Modifier l'affichage actuel", ensuite "Limitation des éléments" et ça devrait le faire.

    A+
    Alexis

    jeudi 9 juillet 2009 10:22
  • ah purée, j'ai du passer 1000 fois devant ce "modifier l'affichage actuel" sans le voir !!!!!!!!!!!!!!!
    Merci bcp pour ça !!

    pour la webPart, pouvez vous me dire si ce code est correct  ??
    je l'ai testé mais ça ne fonctionne pas !
    code ? deploiment ? adressage ???
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace eventHandler_1Alain
    {
        class AjoutNomUser : SPItemEventReceiver
        {
            public override void  ItemAdding(SPItemEventProperties properties)
            {
     	         base.ItemAdding(properties);
                 if (properties.AfterProperties["descriptif"]!=null)
                 {
                     properties.AfterProperties["Résumé"] = properties.AfterProperties["descriptif"];
                     properties.AfterProperties["Titre"] = properties.AfterProperties["Titre"].ToString().ToUpper();
                 }
    
                 using (SPSite site = new SPSite("http://monserveur:10090/DSI/Suivi"))
                 {
                     using (SPWeb Web = site.OpenWeb())
                     {
                         SPList list = Web.Lists["leSuiviTestAlain"];
                         SPEventReceiverDefinition evdef = list.EventReceivers.Add();
                         evdef.Assembly = "eventHandler_1Alain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6c06e25c1341eba7";
                         evdef.Class = "eventHandler_1Alain.AjoutNomUser";
                         evdef.Name = "eventHandler_1Alain";
                         evdef.Type = SPEventReceiverType.ItemAdding;
                         evdef.Update();
                     }
    
                 }
    
            }
           
    
        }
    }
    





    apres ça , j'ai déployé à l'aide de wsp (la fonctionnalité apparait bien dans ma liste au niveau du site .. je l'ai activée et quand j'ajoute un nouvel element à ma liste , le resumé n'est pas renseigné et le tite n'est pas en majuscule ...
    si qq voit ou j'ai pu me planter  ...
    merci à tous et specail thanks to Alexis
    jeudi 9 juillet 2009 13:07
  • Bonjour, j'ai toujours eu pas mal de soucis similaires avec les événements synchrones.
    Dans la mesure du possible j'essaie d'utiliser les asynchrones.
    Dans votre cas ca collerait avec ItemAdded à la place de ItemAdding, voici un exemple d'implémentation :
    public override void  ItemAdded(SPItemEventProperties properties)
            {
    this.DisableEventFiring();
    if (properties.ListItem["descriptif"]!=null)
                 {
                     properties.ListItem["Résumé"] = properties.ListItem["descriptif"];
                     properties.ListItem["Titre"] = properties.ListItem["Titre"].ToString().ToUpper();
                     properties.ListItem.SystemUpdate();
                 }
    
    this.EnableEventFiring();
    }

    http://blogs.developpeur.org/anouvel
    vendredi 10 juillet 2009 07:26
    Modérateur
  • bonjour Arnault
    merci de prednre un peu de temps pour m'aider.
    alors, je viens d'essayer votre code mais sans succès et je me demande s'il ne s'agit pas en fait, d'un pb d'association de mon event sur ma liste. pouvez vous me dire ou mettre EXACTEMENT ce bout de code :

    using (SPWeb Web = site.OpenWeb())

    {

     

    SPList list = Web.Lists["leSuiviTestAlain"];

     

    SPEventReceiverDefinition evdef = list.EventReceivers.Add();

    evdef.Assembly =

    "eventHandler_1Alain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6c06e25c1341eba7";

    evdef.Class =

    "eventHandler_1Alain.AjoutNomUser";

    evdef.Name =

    "eventHandler_1Alain";

    evdef.Type =

    SPEventReceiverType.ItemAdded;

    evdef.Update();

    }

    }

    cet exemple est souvent mentionné mais sans preciser ou le mettre reellement. C'est peut etre ce qui bloque car le code que j'essaye de passer n'est pas complexe du tout.
    (quand je fais des modifs, et que je redeploie sur le serveur, j'utilise la commande stsadm -o upgrade solution . Est bien cela qu'il faut pour deployer la dernière version ?
    Merci Arnault et bonne journée
    AL

    • Modifié algeox vendredi 10 juillet 2009 13:31
    vendredi 10 juillet 2009 08:13
  • Effectivement cela pourrait tout expliquer :)

    En fait vous devez executer ce code pour associer votre handler à votre liste. Tant que ce n'est pas fait, l'handler ne sera jamais executé.

    En général on utilise une application console créée spécialement pour l'occasion ou on utilise un outil capable de faire ça en 2-3 clics de souris. par exemple http://www.u2u.info/Blogs/Patrick/Lists/Posts/Post.aspx?ID=1589

    Si on veut faire les choses bien et packager ca dans une solution, alors on créé une feature avec un SPFeatureEventReceiver (handler qui s'éxécute à l'activation de la feature) dans lequel on écrit le code d'association liste/handler
    http://blogs.developpeur.org/anouvel
    vendredi 10 juillet 2009 09:14
    Modérateur
  • ok Arnault.Merci bcp. je teste cela cet apres midi et je vous tiens au courant. 
    cordialement
    Alain

     

    vendredi 10 juillet 2009 10:41
  • Et bien c'est deseperant ...
    je n'arrive vraiment pas à faire fonctionner cet assemblage.
    j'ai créé deux classes distinctes , toutes les deux dans le même projet
    voic celle qui gere l eventhandler : (j'ai repris le code d'Arnault)
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace eventHandler_1Alain
    {
        
        class AjoutNomUser : SPItemEventReceiver
        {
            public override void ItemAdded(SPItemEventProperties properties)
            {
                this.DisableEventFiring();
                if (properties.ListItem["descriptif"] != null)
                {
                    properties.ListItem["Résumé"] = properties.ListItem["descriptif"];
                    properties.ListItem["Titre"] = properties.ListItem["Titre"].ToString().ToUpper();
                    properties.ListItem.SystemUpdate();
                }
    
                this.EnableEventFiring();
            }
    
        }
    }
    et puis celle qui l'associe à ma liste
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace eventHandler_1Alain
    {
        class FeatureWithReceiver1 : SPFeatureReceiver
        {
            public override void FeatureActivated(SPFeatureReceiverProperties properties)
            {
                using (SPSite site = new SPSite("http://monserveur:100/DSI/Suivi"))
                {
                    using (SPWeb Web = site.OpenWeb())
                    {
                        SPList list = Web.Lists["leSuiviTestAlain"];
                        SPEventReceiverDefinition evdef = list.EventReceivers.Add();
                        evdef.Assembly = "eventHandler_1Alain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6c06e25c1341eba7";
                        evdef.Class = "eventHandler_1Alain.AjoutNomUser";
                        evdef.Name = "eventHandler_1Alain";
                        evdef.Type = SPEventReceiverType.ItemAdded;
                        evdef.Update();
                    }
                }  
            }
            
            public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
            {
                throw new Exception("The method or operation is not implemented.");
            }
    
            public override void FeatureInstalled(SPFeatureReceiverProperties properties)
            {
                throw new Exception("The method or operation is not implemented.");
            }
    
            public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
            {
                throw new Exception("The method or operation is not implemented.");
            }
            
        }
    }


    la compil se passe bien. le deploiement aussi. Ma feature apparait bien dans la liste des features sur le site. Je l'active ........ je remplis mon formulaire sans pb mais l'event ne se déclenche pas.

    En observant mon explorateur de solutions dans VS2008, je vois que mes classes sont toutes les deux dans le repertoire "feature code" et que dans le repertoire "feature", j'ai deux sous rep , chacun du nom des deux classes. Chaque sous rep à son propre feature;xml et elements.xml. Dans ce dernier , j'ai rajouté une balise "receiver" pour y faire reference aux evenements (itemadded pour l'un et featureactivated pour l'autre) ...

    Vraiment, je ne sais plus quoi faire pour ça (d'autant plus que le code que je devrai mettre en prod sera surement plus complet que l'exemple present ...)
    Je ne sais pas quelle autre indication je pourrais vous donner ... je travaille à partir de WSP... projet vide au départ puis ajout d'élément "feature" et "event handler"
    ci dessous aussi , histoire de tout fournir , copie des fichiers "elements xml"
    <?xml version="1.0" encoding="utf-8" ?>
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
      <Receivers ListTemplateId="100">
      <Receiver>
        <Name>FeatureActivated</Name>
        <Type>FeatureActivated</Type>
        <SequenceNumber>10000</SequenceNumber>
        <Assembly>eventHandler_1Alain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6c06e25c1341eba7</Assembly>
        <Class>eventHandler_1Alain.FeatureWithReceiver1</Class>
        <Data></Data>
        <Filter></Filter>
      </Receiver>
    </Receivers>
    </Elements>
    et celui de l'event handler :
    <?xml version="1.0" encoding="utf-8" ?>
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
      <Receivers ListTemplateId="100">
        <Receiver>
          <Name>ItemAdded</Name>
          <Type>ItemAdded</Type>
          <SequenceNumber>10000</SequenceNumber>
          <Assembly>eventHandler_1Alain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6c06e25c1341eba7</Assembly>
          <Class>eventHandler_1Alain.AjoutNomUser</Class>
          <Data></Data>
          <Filter></Filter>
        </Receiver>
      </Receivers>
    </Elements>
    il ne reste plus qu'a avaler deux boites de doliprane !!
    merci en tout cas à tous ceux qui sont ici pour nous donner un coup de main. j'ai hâte de pouvoir en faire autant !
    Bonne fin de journée
    vendredi 10 juillet 2009 13:24
  • Nous sommes face à un cafouillage :)

    Vous utilisez une feature (propablement générée par STSDEV) qui va associer votre handler à un type de liste (ListTemplateId="100" c'est à dire toutes les listes).
    <?xml version="1.0" encoding="utf-8" ?>
    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
      <Receivers ListTemplateId="100">
        <Receiver>
          <Name>ItemAdded</Name>
          <Type>ItemAdded</Type>
          <SequenceNumber>10000</SequenceNumber>
          <Assembly>eventHandler_1Alain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6c06e25c1341eba7</Assembly>
          <Class>eventHandler_1Alain.AjoutNomUser</Class>
          <Data></Data>
          <Filter></Filter>
        </Receiver>
      </Receivers>
    </Elements>
    Si c'est le but recherché, alors inutile d'écrire du code pour mapper le handler avec une liste en particulier. C'est soit l'un soit l'autre : soit on map déclarativement un handler à toutes les listes du type indiqué, soit on enlève ce XML et on fait le mapping par code (dans un feature receiver ou une application .NET).


    Je constate que vous avez aussi essayé de faire un SPFeatureReceiver pour éxécuter du code. Cela ne se déclare pas avec ce type de XML, mais au niveau de l'élément Feature de votre fichier Feature.xml : http://panvega.wordpress.com/2008/10/10/how-to-implement-the-spfeaturereceiver-class-to-your-feature/



    Pour essayer d'avancer je vais vous proposer l'implémentation qui me semble la plus appropriée vis à vis des spécifications suivantes (en esperant qu'elles soient justes) :
    - Il n'y a qu'une seule liste cible
    - Cette liste est connu par son nom (en dur donc)

    Dans ce cas, je ne vois pas l'interet de packager l'association dans une feature, puisque celle-ci ne serait pas réutilisable (à cause du nom de liste en dur)

    Je vous propose donc de ne mettre que votre assembly (contenant seulement SPListItemEventReceiver, pas besoin du SPFeatureReceiver) dans le .WSP et de ne créer aucune feature. Une fois celle-ci déployée et un IISRESET effectué, associez votre handler à la liste avec l'utilitaire http://www.u2u.info/Blogs/Patrick/Lists/Posts/Post.aspx?ID=1589

    Est-ce que cela correspond au besoin ?
    http://blogs.developpeur.org/anouvel
    vendredi 10 juillet 2009 14:30
    Modérateur
  • merci une fois de plus Arnault.
    j'ai donc fais la chose suivante :
    je suis reparti d'un projet vide de type "class librairy" (sans passer par wsp - projet classique VS2008)
    j'ai ajouter la reference vers la sharepoint.dll
    et j'ai recopié ma classe :
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint;
    
    namespace handler_1
    {
    
        class modif_formulaire : SPItemEventReceiver
        {
            public override void ItemAdded(SPItemEventProperties properties)
            {
                this.DisableEventFiring();
                if (properties.ListItem["descriptif"] != null)
                {
                    properties.ListItem["Résumé"] = properties.ListItem["descriptif"];
                    properties.ListItem["Titre"] = properties.ListItem["Titre"].ToString().ToUpper();
                    properties.ListItem.SystemUpdate();
                }
    
                this.EnableEventFiring();
            }
    
        }
    }
    Rien de plus. j'ai ensuite signé cette assembly.
    Etant sur un poste client en visual studio, pour le déploiement, je ne peux pas copier ma dll dans le Gac du serveur (quand je compile ma dll, celle ci est copiée dans le gac de mon poste, mais pas celle du serveur .. normal.
    j'utilise donc l'option de wsp 'create deployment folder". Quand c'est effectué, je recupere le fichier .wsp généré et je le recopie dans un repertoire du serveur, ou j'ai  dupliqué stsadm.exe. je passe ensuite en mode cmd et je fais les deux manip stsadm addsolution et deploysolution. et a partir de la , je bloque car l'utilitaire que vous m'avez conseillé ne se lance que sur le poste client donc je ne peux pas l'utiliser sur le serveur (visual studio n'est pas installé dessus).
    Comme je n'ai pas utilisé de feature, la solution est bien déployée qq part sur le serveur, mais associée à rien ....
    Bref, c'est bcp de souci pour une si petite chose à mettre en place. Je bloque à mort la dessus ... qu'est ce que ça va être pour les étapes suivantes !!! Je vais continuer d'essayer des solutions. ... Merci et bon 14 juillet .
    Alain
    lundi 13 juillet 2009 07:01
  • Alors dans ce cas vous pouvez créer une petite application console qui contiendrait uniquement le code d'association :

    using (SPSite site = new SPSite("http://monserveur:10090/DSI/Suivi"))
                 {
                     using (SPWeb Web = site.OpenWeb())
                     {
                         SPList list = Web.Lists["leSuiviTestAlain"];
                         SPEventReceiverDefinition evdef = list.EventReceivers.Add();
                         evdef.Assembly = "eventHandler_1Alain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6c06e25c1341eba7";
                         evdef.Class = "eventHandler_1Alain.AjoutNomUser";
                         evdef.Name = "eventHandler_1Alain";
                         evdef.Type = SPEventReceiverType.ItemAdding;
                         evdef.Update();
                     }
                 }
    Lancez ensuite l'executable sur le serveur et en principe l'association serait faite.
    Vérifiez quand même que l'assembly du handler est bien dans le GAC du serveur, on ne sait jamais..

    Courage, on y est presque :)
    http://blogs.developpeur.org/anouvel Merci de valider les réponses à vos questions et de marquer comme telles les réponses utiles
    lundi 13 juillet 2009 13:17
    Modérateur
  • Petite remarque en passant, j'ai l'impression que vous n'avez pas d'environnement de développement (machine ou serveur virtuelle avec WSS ou MOSS dessus).

    Si c'est le cas nous pouvons vous aider à le mettre en place.
    Développer à l'aveugle et déployer en production sans avoir au préalable testé dans au moins un environnement de recette est risqué. 


    http://blogs.developpeur.org/anouvel Merci de valider les réponses à vos questions et de marquer comme telles les réponses utiles
    lundi 13 juillet 2009 13:25
    Modérateur
  • bonsoir Arnault
    vous avez effectivement tres bien cerné le pb. C'est ma station de dev qui n'est pas tres adequate pour faire mon travail de developpeur. L'admin systeme doit me preparer un environnement virtuel mais je ne sais pas quand. Alors j'en profite pour comprendre et apprendre à gerer webpart et features. Mais le déploiement à distance est un vrai casse tête pour moi d'autant que mes connaissances sont encore faibles et que je ne sais jamais si je recopie les bons fichiers, si je recupere la bonne dll etc ... Typiquement, j'avais fait ce que vous me conseillez (application console simple) mais je ne sais pas si je dois copier tout le repertoire "debug" sur le serveur (apres avoir signé la dll) ou si je dois juste coipier le .exe, ou s'il faut aussi que je deploie la dll de cette appli console dans le Gac ........ bref .... ;-((((((
    Je ne vais pas continuer à vous faire perdre votre temps. Je vais voir avec le responsable qui doit m'installer mon environnement et peut-être reviendrons nous vers vous s'il nous manque des infos pour le configurer correctement.
    Je vous remercie en tous cas vraiment sincèrement pour m'avoir aider avec autant de gentillesse et de professionalisme !
    Cordialement
    Alain
    lundi 13 juillet 2009 14:19
  • Bonjour Alain,

    merci pour vos remarques :)

    Effectivement il me semble plus sûr d'attendre d'avoir un environnement de développement avant de continuer les développements.
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses à vos questions et de marquer comme telles les réponses utiles
    mercredi 15 juillet 2009 09:23
    Modérateur
  • bonjour Arnault

    Je n'ai toujours pas ma plateforme virtuelle de dev mais bon j'ai pas mal avancé. j'ai enfin réussi à deployer webpart et event handler ... champagne ! enfin disons mousseux car je n'ai toujours pas associé l'event handler à une liste en particulier (il s'applique à toutes les lisstes mais bon je reviendrai à l'attaque ultérieurement ;-)
    Pour l'instant je voudrais recuperer l'adresse mail d'un utilisateur dont le nom est saisi dans le champ d'un formulaire (choisi dans une liste - le champ est crée avec l'option 'personne ou groupe" .. j'ai ainsi la liste de l'AD.
    Voici le bout de code que j'ai écrit dans mon event Handler

    public override void ItemUpdated(SPItemEventProperties properties)
            {
    
                SPSite site = new SPSite("http://monserveur/maliste");
                SPWeb web = site.OpenWeb();
                
                // recup des saisies et mise à jour
                this.DisableEventFiring();
                properties.ListItem["résumé"] = properties.ListItem["descriptif"].ToString();
                properties.ListItem["Titre"] = properties.ListItem["Titre"].ToString().ToUpper();
                properties.ListItem["mazone"] = properties.ListItem["mazone"].ToString() + "<br>" + properties.ListItem["Modifié par"].ToString();
                var ledestinataire = properties.ListItem["destinataire"];
                properties.ListItem.Update();
                
                // envoi mail auto
                bool fAppendHTML = true;
                bool fEncodeHTML = false;
                string To = ledestinataire.ToString();
                string Subject = "'objetl";
                string htmlBody = "body";
                
                SPUtility.SendEmail(web, fAppendHTML, fEncodeHTML, To, Subject, htmlBody);
               
                this.EnableEventFiring();
            }

    vous l'aurez compris ... ce que je recupere c'est le nom et non pas l'adresse mail. Je n'arrive pas à trouver la propriété qui me rendra cette adr mail ... avez vous une idée à me communiquer ?

    Merci et bonne journée à tous
    AL

    mardi 21 juillet 2009 08:18
  • j'ai essayé ce matin de  creer une colonne en utilisant l'otpion "afficherle champ"  adresse de messagerie professionnelle. j'ai pensé que je pourrai ainsi recuperer l'adresse mail mais en vain. je n'ai pas trouvé ou avoir la main sur cet affichage -mais ce n'est peut être pas une bonne piste ???

    mercredi 22 juillet 2009 12:47
  • Bonjour Alain,

    une colonne de type personne vous permettra de récupérer un objet de type SPFieldUserValue, qui lui même expose une propriété User de type SPUser, qui possède une propriété Email.


    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses à vos questions et de marquer comme telles les réponses utiles
    mercredi 22 juillet 2009 13:27
    Modérateur
  • bonjour Arnault et merci une fois de plus. J'ai essayé de faire cela : var ledestinataire = properties.ListItem["destinataire"].ToString(); SPUser oUser = web.AllUsers[ledestinataire]; var adrdest = oUser.Email; le souci c'est que la varaible n'est pas reconnue dans "web.AllUsers[ledestinataire];" j'ai essayé avec web.currentUser, ça fontionne bien mais ce n'est pas ce que je veux. y'a t'il un moyen de contourner cela ? Cordialemetn Alain
    mercredi 22 juillet 2009 14:31
  • En fait je pensais plutôt à quelquechose comme ça :

    SPFieldUserValue destinataire = new SPFieldUserValue(web, (String)resultat["destinataire"]);
    
    String email = destinataire.User.Email;

    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses à vos questions et de marquer comme telles les réponses utiles
    mercredi 22 juillet 2009 16:19
    Modérateur
  • bonjour Arnault
    une fois de plus , vos conseils sont les bons !!!
    un grand grand merci à vous !!!
    vous me permettez d'avancer vraiment dans la compréhension du code
    Mais purée, cest quand même un peu tordu tout ça ;-)
    Bonne journée et surement ....... à bientôt
    Alain
    • Marqué comme réponse algeox jeudi 23 juillet 2009 07:01
    jeudi 23 juillet 2009 07:01
  • De rien ;)
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses à vos questions et de marquer comme telles les réponses utiles
    jeudi 23 juillet 2009 08:19
    Modérateur