none
Ajouter une fonctionnalité dans le menu déroulant des items RRS feed

  • Question

  • Bonjour.

     

    J'ai écris un code sur l'évènement ItemAdded.

     

    Après réflection je ne prefère pas automatiser son exécution. Mon code applique une modification sur un item d'une liste.

     

    C'est pourquoi je voudrais ajouter un bouton dans le menu qui se déroule lorsqu'on click le sur petite flèche à coté d'un item d'une list ou d'une bibliothèque.

     

    Vous voyez de quoi je parle ? N'hésitez pas à me demander des précision si je ne suis pas clair.

     

    Merci.

    mardi 2 septembre 2008 14:51

Réponses

  • Attention,

    Pour entrer dans le détail des spé, voilà comment je ferais

    Une custom action dans ce style :

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

    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
        <CustomAction
            Id="C670889F-58D7-4beb-9A09-E8133E3A5917"
            RegistrationType="List"
            RegistrationId="101"
            Location="EditControlBlock"
            Sequence="2000"
            Title="Link to product detail"
            Description="Navigate to the product detail">
            <UrlAction Url="http://SharePoint/_layouts/util.aspx?Id={ItemId}&&List={ListId}"/>
        </CustomAction>
    </Element>


    Il vous suffit de rajouter une page ASPX dans _Layouts qui traitera les identifiants donnés et executera ce qui vous semble necessaire.

    Pour plus d'infos, vous pouvez lire ces blogs ou je parle du sujet : http://blogs.codes-sources.com/phil/archive/category/3032.aspx ou sur le très bon article de ludo http://lefortludovic.developpez.com/tutoriels/sharepoint/custom-actions/

    A mon avis, il est necessaire de passer par cette solution.

    Tenez nous au courant.

    jeudi 4 septembre 2008 07:56
    Modérateur
  • J'ai retrouvé un bout de code sur mon ordi qui correspond grosso modo à ce qu'il vous faut.

    DeleteAllItems

    Ce projet codeplex vous permettra de comprendre le fonctionnement que je vous recommande d'utiliser.

    Pour résumer.

    Création de page ASPX, ajout des composant boutton, label si besoin
    Dans le code behind de la page, la faire heriter de Microsoft.SharePoint.WebControls.LayoutsPageBase
    Dans l'evenement OnLoad, recuperer les ItemID et ListId (Request.QueryString["ListId"]Wink
    Une fois l'ID recupérer, instancier un SPWeb, SPList, SPListItem au besoin comme suit :

    using (SPSite siteCollection = this.Site)
                    {
                        using (SPWeb site = this.Web)
                        {
                            // create list object and list item object
                            SPList list = site.Lists[new Guid(listId)];

    .....
                        }

    Après faites votre trairement "metier".

    Voilà !
    jeudi 4 septembre 2008 10:11
    Modérateur

Toutes les réponses

  • Bonjour,

     

    ce que vous cherchez à faire est possible à l'aide des CustomActions. L'idée c'est de s'appuyer sur une petite définition XML pour ajouter un lien à un menu SharePoint. Vous pouvez ainsi modifier le contenu du bouton actions du site, de la page settings.aspx ou encore le menu contextuel des éléments de liste. Vous trouverez le détail des custom actions sur le msdn : http://forums.microsoft.com/MSDN-FR/ShowPost.aspx?PostID=3823732&SiteID=12

     

    Notez également que l'exemple situé juste au bas de cette page MSDN correspond à votre besoin ;-).

     

    Bon courage pour vos devs et n'hésitez pas à poser d'autres questions si nécessaire.

     

    mardi 2 septembre 2008 15:26
    Modérateur
  • Merci de cette réponse.

     

    J'ai réussi à ajouter un lien dans le contexte menu. Pour le moment c'est un lien qui pointe vers google.

     

    Je n'ai trouvé comment pour récupérer les propriétés de l'item à partir du quel on a ouvert le context menu.

     

    Voila le code que j'avais abonné à l'event ItemAdded et que je  voudrais maintenant exécuter sur le click de l'élément dans le context menu :

     

     

            void GenerateRef(SPItemEventProperties properties)

            {

                //on initialise le numéro chrono qui va être utilisé pour le docuement qui déclenche l'event

                int chrono = 0;

                //flag pour savoir si on a trouvé le chrono

                bool chronoAlreadyFound = false;

     

                SPSite collection = new SPSite("http://knk-moss-dev:3"); //ouverture de la collection contenant la liste des chronos

                SPWeb site = collection.OpenWeb(); //ouverture site en particulier

                SPList maListeChronoTest = site.Lists["Chrono"]; //lien avec la liste de chrono du site

     

                SPListItem monItem = properties.ListItem;

     

                //pour chaque item de la liste de chrono

                foreach (SPItem Item in maListeChronoTest.Items)

                {

                    //si le chrono du projet n'a pas été trouvé

                    if (chronoAlreadyFound == false)

                    {

                        //si le nom du projet de l'item en cours est le même que le nom du site parent et que l'année de ce chrono est la même que l'année en cours

                        if ((Item["Projet"].ToString().ToUpper() == monItem.ParentList.ParentWeb.Title.ToString().ToUpper()) && (Item["Année"].ToString() == (DateTime.Now.Year).ToString().Substring(2, 2).ToString())) //si le chrono du projet correspond au nom du client

                        {

                            //on spécifie que le chrono a été trouvé

                            chronoAlreadyFound = true;

     

                            //copie de numéro chrono de ce projet

                            chrono = Convert.ToInt32(Item["Chrono"].ToString());

                            //on l'incrémente

                            chrono++;

                            //on le met à jour avec la nouvelle valeur

                            Item["Chrono"] = chrono.ToString(); //incrémentation et écriture dans la liste de chronos

                            Item.Update();

                            //on break afin de ne pas parcourrir la liste de chrono si on a toruver le bon chrono

                            break;

                        }

                    }

                }

     

                //si le chrono de ce projet n'a pas été trouvé, on va le créer

                if (chronoAlreadyFound == false)

                {

                    SPListItemCollection maCollectionDeChrono = maListeChronoTest.Items;

                    SPItem nouveauEnregistrementChrono = maCollectionDeChrono.Add();

                    nouveauEnregistrementChrono["Année"] = (DateTime.Now.Year).ToString().Substring(2, 2).ToString();

                    //grace à ce code on créer automatiquement les chronos même à la nouvelle année

                    nouveauEnregistrementChrono["Projet"] = monItem.ParentList.ParentWeb.Title.ToString().ToLower();

                    nouveauEnregistrementChrono["Chrono"] = "1";

                    nouveauEnregistrementChrono.Update();

                    //on utilise la valeur 1 pour le premier document

                    chrono = 1;

                }

     

                monItem["Référence"] = (DateTime.Now.Year).ToString().Substring(2, 2).ToString() + "/" + monItem.ParentList.ParentWeb.ParentWeb.Title.ToString().ToLower() + "/" + monItem.ParentList.ParentWeb.Title.ToString().ToLower() + "/" + monItem["Type de contenu"].ToString() + "/" + chrono.ToString();

                monItem["Année"] = (DateTime.Now.Year).ToString().Substring(2, 2).ToString();

                monItem["Client"] = monItem.ParentList.ParentWeb.ParentWeb.Title.ToString().ToLower();

                monItem["Projet"] = monItem.ParentList.ParentWeb.Title.ToString().ToLower();

                monItem["Chrono"] = chrono.ToString();

     

                monItem.Update();

     

                site.Close();

                collection.Close();

            }

    mercredi 3 septembre 2008 10:15
  • Bonjour,

    Pour récupérer l'item courant,

    Code Snippet

    SPListItem curItem = SPContext.Current.Item

     

     

     

    mercredi 3 septembre 2008 21:46
  • ok, donc avec ca je peux définir les propriétés de mon item courant.

     

    Pour la custom action du context menu, j'ai lu que les gens avait placé un script javascript dans lequel ils réécrivent la méthode Custom_AddDocLibMenuItems. Par exemple :

     

    Code Snippet

    <script language="javascript">
    function Custom_AddDocLibMenuItems(m, ctx)
    {
    var strDisplayText = "Référencer le document";
    var strAction = "alert('ctx.HttpRoot : '+ ctx.HttpRoot)"
    var strImagePath = "";

    // Add our new menu item
    CAMOpt(m, strDisplayText, strAction, strImagePath);

    // add a separator to the menu
    CAMSep(m);

    // false means that the standard menu items should also be rendered
    return false;
    }
    </script>

     

     

    Cela permet simplement de rajouter le lien dans le context menu.

     

    Après comment faire pour lier le code que j'ai posté dans mon post précédent avec ca ? Mon code est écrit en C#. Faut-il faire une autre page ASPX qui exécutera le code avec une redirection automatique ? Ou bien est il possible de lien le déclenchement du code directement sur le bouton ?

     

    Merci de votre aide

    jeudi 4 septembre 2008 07:37
  • Attention,

    Pour entrer dans le détail des spé, voilà comment je ferais

    Une custom action dans ce style :

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

    <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
        <CustomAction
            Id="C670889F-58D7-4beb-9A09-E8133E3A5917"
            RegistrationType="List"
            RegistrationId="101"
            Location="EditControlBlock"
            Sequence="2000"
            Title="Link to product detail"
            Description="Navigate to the product detail">
            <UrlAction Url="http://SharePoint/_layouts/util.aspx?Id={ItemId}&&List={ListId}"/>
        </CustomAction>
    </Element>


    Il vous suffit de rajouter une page ASPX dans _Layouts qui traitera les identifiants donnés et executera ce qui vous semble necessaire.

    Pour plus d'infos, vous pouvez lire ces blogs ou je parle du sujet : http://blogs.codes-sources.com/phil/archive/category/3032.aspx ou sur le très bon article de ludo http://lefortludovic.developpez.com/tutoriels/sharepoint/custom-actions/

    A mon avis, il est necessaire de passer par cette solution.

    Tenez nous au courant.

    jeudi 4 septembre 2008 07:56
    Modérateur
  • Merci pour cette réponse.

     

    Je vais essayer de passer par la et je vous tiens au courant.

    jeudi 4 septembre 2008 08:01
  • J'ai créé le bouton dans l'ECB de la bibliothèque.

     

    Mon code c# à intégrer sert à modifier les propriétés de l'item.

     

    Pouvez-vous me guider pour créer la page de traitement ? Je dois réutilisé la page de modification des propriétés de sharepoint de base ? Y'a-t-il un moyen simple pour faire une page avec mon code  ?

     

    Ma question est certainement basique, mais je n'ai jamais fait d'asp...

    jeudi 4 septembre 2008 09:36
  • J'ai retrouvé un bout de code sur mon ordi qui correspond grosso modo à ce qu'il vous faut.

    DeleteAllItems

    Ce projet codeplex vous permettra de comprendre le fonctionnement que je vous recommande d'utiliser.

    Pour résumer.

    Création de page ASPX, ajout des composant boutton, label si besoin
    Dans le code behind de la page, la faire heriter de Microsoft.SharePoint.WebControls.LayoutsPageBase
    Dans l'evenement OnLoad, recuperer les ItemID et ListId (Request.QueryString["ListId"]Wink
    Une fois l'ID recupérer, instancier un SPWeb, SPList, SPListItem au besoin comme suit :

    using (SPSite siteCollection = this.Site)
                    {
                        using (SPWeb site = this.Web)
                        {
                            // create list object and list item object
                            SPList list = site.Lists[new Guid(listId)];

    .....
                        }

    Après faites votre trairement "metier".

    Voilà !
    jeudi 4 septembre 2008 10:11
    Modérateur