mercredi 25 mars 2009

[SharePoint 2007] Feature permettant de masquer les colonnes d'une liste en fonction de critères

Voici une feature disponible en téléchargement sur CodePlex permettant de masquer les colonnes d'une liste de façon systématique ou suivant des critères (comme l'appartenance du user à un groupe par exemple) pour les 3 modes d'affichage (View, New, Edit).

Une feature qui peut être bien utile pour éviter la création de modèles de listes Custom...

http://www.codeplex.com/SPListDisplaySetting

Sinon vous pouvez faire le même genre de manipulation avec ce petit outil sous la forme d'une application WinForms: http://patrikluca.blogspot.com/2008/08/hide-list-fields-upon-creation-of.html

lundi 9 mars 2009

[SharePoint 2007] Développer un workflow d'approbation custom utilisant le formulaire InfoPath standard

Lorsque l'on a besoin de customiser une fonctionnalité dans SharePoint, il est souvent nécessaire de repartir de zéro... Heureusement, il est parfois possible de ré-utiliser en partie l'existant.

J'avais besoin de créer un workflow d'approbation dont le comportement réponde réellement aux contraintes de mon client, mais que les formulaires de validation gardent le look-n-feel des formulaires standard de SharePoint :



Je ne vais pas revenir sur l'ensemble du processus de création d'un Workflow utilisant des formulaires InfoPath (cette page le fait très bien: http://stephaneey.developpez.com/tutoriel/sharepoint/workflowforms/) mais juste détailler ce qu'il faut savoir pour utiliser le formulaire de tâche d'approbation "out-of-the-box" avec un workflow custom.

Pour cela, il faut déjà configurer la feature de mon workflow de la manière suivante:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Workflow
Name="MonWorkflowAppro"
Description="Description de mon workflow d'approbation"
Id="e8c83205-5791-4c6d-8798-e35e5cad77ca"
CodeBesideClass="MonProjet.MonWorkflowAppro"
CodeBesideAssembly="MonProjet, Version=1.0.0.0, Culture=neutral, PublicKeyToken=99ad5b5da4846ba1"
TaskListContentTypeId="0x01080100C9C9515DE4E24001905074F980F93160"
AssociationUrl="_layouts/CstWrkflIP.aspx"
InstantiationUrl="_layouts/IniWrkflIP.aspx"
ModificationUrl="_layouts/ModWrkflIP.aspx"
StatusUrl="_layouts/WrkStat.aspx">

<Categories/>
<MetaData>
<InitiationType>OnNewItem</InitiationType>
<Task1_FormURN>urn:schemas-microsoft-com:office:infopath:workflow:ReviewRouting-Review:$Subst:LCID;</Task1_FormURN>
<AssociateOnActivation>true</AssociateOnActivation>
</MetaData>
</Workflow>
</Elements>

Je garde les url des pages aspx standard pour afficher les formulaires (Association, Instanciation, etc) et je fournis l'urn du formulaire InfoPath standard dans Task0_FormURN.
Un workflow peut créer différents types de tâches qui sont identifiées par un entier (0, 1, 2, ...), ici j'ai associé l'urn de mon formulaire InfoPath au type 0, il faut donc, lorsque que je créé ma tache dans mon workflow, lui assigner le type 0.
Pour cela, dans la méthode Invoking de mon activité CreateTask, je vais assigner 0 à la propriété TaskType de mes TaskProperties.

Autre point: le formulaire standard contient 2 liens en bas de page "Réaffecter la tâche" et "Demande de modification". Vous ne souhaitez peut être pas implémenter ces fonctionnalités dans votre workflow, il peut donc vous être utile de désactiver ces liens.
Pour cela, toujours dans le méthode Invoking de votre activité CreateTask, il faut mettre la valeur False aux entrées ows_AllowDelegation et ows_AllowChangeRequests des ExtendedProperties de vos TaskProperties:

MyTaskProps.ExtendedProperties["ows_AllowDelegation"] = "False"; MyTaskProps.ExtendedProperties["ows_AllowChangeRequests"] = "False";

Une fois votre tâche correctement créée par votre workflow vous voulez à juste titre récupérer la réponse saisie par l'utilisateur "Approuvé" ou "Rejeté".

Pour cela, dans votre méthode qui sera déclenché à la modification de la tâche, vous allez pouvoir utiliser la collection AfterProperties qui contient les valeurs du formulaire.
Pour récupérer le statut, il faut tester la valeur de MyTaskAfterProps.ExtendedProperties["TaskStatus"] qui prend "#" si approuvé et "@" si rejeté.

Si vous n'avez pas désactivé les boutons de délégation ou demande de modification, vous pouvez récupérer les infos suivantes:

Délégation:
MyTaskProps.ExtendedProperties["Decline"] prend les valeurs 0, 1 ou 2
0 = pas de délégation
1 = délégué à l'initiateur du workflow
2 = délégué à la personne définie par MyTaskProps.ExtendedProperties["DelegateTo"]

Demande de modification
MyTaskProps.ExtendedProperties["dcr"] prend les valeurs 0, 1 ou 2
0 = pas de demande
1 = demande à l'initiateur du workflow
2 = demande à la personne définie par MyTaskProps.ExtendedProperties["DelegateTo"]

Voila vous avez maintenant toutes les billes pour vous interfacer avec ce formulaire de tâche d'approbation.