SharePoint 2007 : Personnaliser SharePoint avec les CustomActions (Partie 2)

Lors du précédent billet, je vous ai rapidement présenté une utilisation basique des CustomActions.

Mais si on veut aller plus loin, on découvre que l'on peut utiliser ses propres WebControl lorsqu'on souhaite rajouter des menus dans SharePoint. Ca laisse reveur ...

Ce post va donc vous présenter le genre de personnalisation que l'on peut obtenir avec cette méthode.

L'idée de départ est simple : je souhaite pouvoir lancer le plus simplement possible un workflow spécifique sur l'ensemble des éléments de ma liste. Comment faire  ? la preuve en images.

  • Présentation de la solution :

image

Ce projet comprend une feature, une page qui sera déployer dans les layouts et un peu code que nous allons détaillé par la suite.

  • Creation de la feature

image 

  • Creation de la CustomAction

image

Ici, je souhaite rajouter un nouveau menu au niveau de la boite à outil de ma liste dans la menu Action. Je souhaite que mon menu n'apparaisse uniquement que sur les listes (RegistrationType=List) de type librairie de document (RegistrationId=101).

  • Creation du WebControl associé

image

On va créer une nouvelle Classe qui va hériter de WebControl. Jusqu'ici que du classique.

image

L'ensemble du "vrai" travail, se fait dans la méthode CreateChildControls. Nous allons tout simplement rajouter un nouveau control de type SubMenuTemplate qui va nous permettre de rajouter un MenuItemTemplate pour chaque Workflow associé à la liste.

On récupère les workflows associés à la liste via WorkflowAssociations et on s'assure que le workflow peut être lancé (Enabled, AllowManual à True).

L'utilisation de la méthode FindListView() est une astuce développée par TheKid qui permet de circonvenir un bug avec le token {ListId} qui n'est pas forcément transformer à l'éxécution de la réquête. Plus de détails à cette adresse : http://blog.thekid.me.uk/archive/2008/04/29/sharepoint-custom-actions-in-a-list-view-webpart.aspx

Voilà la méthode en question :

image

Il ne reste plus qu'à déployer, compiler et voilà le résultat. Je sais , j'aurais pu faire un effort au niveau du désign ;)  :

image

Maintenant, il ne nous reste plus qu'à sélectionner les éléments que l'on souhaite soumettre au Workflow. Pour faire au plus simple, j'ai choisi de faire cette action dans une page générique que j'aurais déployé dans les layouts.

  • Rajout de la page qui va se charger de lancer le workflow sur chaque élément sélectionné
    • Aspx

image

Rien de transcendant ici, on ajoute simplement une CheckBoxList à cette page "type". Vous pourrez retrouver comment faire des formulaires qui gardent le "look" SharePoint sur le livre "Inside WSS 3.0" de Ted Pattison. J'en reparlerais sans doute dans les prochains posts.

A noter simplement, que cette page fait appel à l'assembly Phil.SharePoint.Workflow.CustomMenu.RunSelectedWorkflowForm dont le code est détaillé ci-dessous.

    • CodeBehind

image

Ici, on va travailler essentiellement sur la CheckBoxList, la liste d'élément et l'objet WorkflowAssociation

image

On récupère les paramètres passé dans l'URL (ListId et WFAssociationId) et on remplie la CheckBoxList.

Ce qui est un peu particulier ici est qu'il est nécessaire de faire tout un tas de vérification afin de ne pas pouvoir lancer le workflow sur un élément qui a déjà ce workflow en cours. C'est à cela que nous sert le SPFieldWorkflowStatus.

image

Ici, cette méthode lancera le workflow pour chaque élément sélectionné via la méthode StartWorkflow du WorkflowManager du site. A noter que l'on ne passe pas d'InstanciationData, ce qui peut être peu pratique pour certains workflows. Ce cas serait a traiter à l'occasion.

image

La gestion des erreurs de workflow "copié-collé" du livre de Ted Pattison.

Au final, la page donne ceci :

image

Voilà, j'espère vous avoir démontrer qu'il pouvait se révéler très intéressant de personnaliser l'interface SharePoint via les CustomAction et que grâce à l'utilisation de l'attribut ControlClass, les possibilités sont infinies :)

PS : Pour ceux qui se disent que j'aurais pu faire un copier coller de VisualStudio plutôt que des captures d'écrans. Je suis passé sous Hyper-V et Windows Serveur 2008, du coup je galère un peu pour la configuration de l'ensemble et jusqu'à présent je ne sais pas copier de ma VPC vers mon PC et j'ai quelques soucis pour échanger des fichiers entre les deux :).

<Philippe/>

Publié lundi 5 mai 2008 10:30 par phil
Classé sous , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

About phil

Leader Technique SharePoint chez Winwise, je m'occupe de missions d'expertise autour de WSS 3.0 et MOSS 2007, tout en me tenant au courant de ce qui se fait autour de Asp.net, Silverlight et des technologies Web by Microsoft en général.

Les 10 derniers blogs postés

- [WPF] Comment charger dynamiquement un fichier XAML qui définit des eventhandler ? par Thomas Lebrun le il y a 21 heures et 41 minutes

- Article sur le filtrage des modèles de site SharePoint par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 09-04-2008, 00:11

- Adopter votre Redo en 3D - Clone Virtuel - avec photosynth par RedoBlog - The .NET Gentleman !!! le 09-04-2008, 00:07

- [Expression Web] Astuce de la Semaine : Mettre en bouton ses macros dans une barre d'outils. par Expression Web & Me le 09-03-2008, 20:48

- [.Net] Présentation du Client Profile par Elise's blog le 09-03-2008, 12:28

- SharePoint : Test de Chrome avec SharePoint 2007 (MOSS et WSS) par Blog Technique de Romelard Fabrice le 09-03-2008, 11:38

- Google Chrome : Faille de Sécurité ?!? par The diary of EBArtSoft le 09-03-2008, 11:35

- ASP.net - tout savoir sur la validation des entrées utilisateurs | les controles de validation par Atteint de JavaScriptite Aiguë [Cyril Durand] le 09-02-2008, 23:43

- Google Chrome J'adopte ! par The diary of EBArtSoft le 09-02-2008, 21:36

- SharePoint : Eviter les Access Denied pour l’indexation de ferme SharePoint distante par Blog Technique de Romelard Fabrice le 09-02-2008, 20:50