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

- Power Tools 2008 CTP Juillet par Noham Choulant le il y a 32 minutes

- Disparition de variables de session PHP après une redirection ? par MadMatt le il y a 10 heures et 29 minutes

- [MOSS 2007] Publier ses formulaires InfoPath via feature par Adrien Siffermann le il y a 13 heures et 36 minutes

- Imagine Cup 2008 - Paris - Les résultats par TheSaib .NET blog le il y a 14 heures et 58 minutes

- L'Egypte accueille Imagine Cup 2009 par Code is poetry le il y a 15 heures et 10 minutes

- PowerShell : Mise en ligne de fonctions intéressantes pour SharePoint par Blog Technique de Romelard Fabrice le il y a 16 heures et 17 minutes

- Raccourcis clavier et CRM 4 par Clark, C#, MSCRM, SBS le il y a 20 heures et 23 minutes

- [Silverlight] Comment échanger des données entre une application Silverlight et une page ASP.NET via cookies ? par Thomas Lebrun le il y a 20 heures et 59 minutes

- SharePoint 2007 : Trouver les fichiers CheckOut dans une librairie de document par Philippe Sentenac [MVP SharePoint] le il y a 23 heures et 27 minutes

- [Open XML] Travailler avec Open XML : Linq To XML (Partie 2 - Requêtes/XPath) par Julien Chable le 07-08-2008, 02:05