Lorsque l'on veut publier des formulaires InfoPath sur un serveur SharePoint, il faut passer par l'administration centrale pour le télécharger sur le serveur, puis l'activer pour chacune des collections de sites pour lesquelles on veut le rendre disponible. Cette solution, bien que simple, nécessite forcemment une intervention humaine, ce qui peut être pénalisant dans le cadre de multiples déploiements, ou tout simplement si l'on souhaite activer un formulaire InfoPath à la création d'une collection de sites.
Analysons de plus près ce que génèrent ces actions dans l'administration centrale.
Lorsqu'on choisit de télécharger un nouveau formulaire InfoPath, on peut se rendre compte qu'une solution est automatiquement ajoutée au magasin du serveur. Le nom de cette solution commence par "form-", suivi par le nom du formulaire précédemment téléchargé.
De plus, dans la liste des fonctionnalités de la collection de site, on voit apparaître une nouvelle fonctionnalité du nom de notre formulaire.
Et lorsque nous activons un formulaire pour une collection de sites, cette fonctionnalité se retrouve tout simplement activée.
Super ! Des solutions, des fonctionnalités, voilà un modèle de déploiement auquel nous sommes habitués dans SharePoint, et qui peut être automatisé. Il va donc nous falloir reproduire le comportement de celles qui sont générées par l'interface d'administration.
Grâce à une petite application console, on peut récupérer tous les fichiers .wsp correspondants aux solutions actuellement installés sur le serveur :
SPSite site = new SPSite("http://localhost");
SPFarm farm = site.WebApplication.Farm;
foreach (SPSolution solution in farm.Solutions)
{
SPPersistedFile solutionFile = solution.SolutionFile;
solutionFile.SaveAs(solution.Name);
}
En renommant le fichier solution en .cab, on s'aperçoit qu'il contient les éléments suivants :
Il s'agit donc d'une solution assez simple, avec une seule feature, contenant un fichier de définition, un fichier de provisionning et le modèle de formulaire .xsn. La gestion des multiples versions du formulaire est assurée par un système de dossiers différents pour chaque version.
Pour pouvoir reproduire une telle fonctionnalité, il s'agit d'identifier les informations clés des fichiers XML. Il s'agit notamment d'un FeatureReceiver particulier, de quelques propriétés et du téléchargement du fichier XSN dans une librairie spécifique. Ainsi, voilà comment faire une simple fonctionnalité d'activation de formulaire InfoPath :
Feature.xml
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
Id="D2BD3DFB-178E-4fda-89E1-77F67C45641D"
Title="Identity Form"
Description="Provides a simple form to give his identity."
Hidden="FALSE"
Scope="Site"
Version="1.0.0.0"
ReceiverClass="Microsoft.Office.InfoPath.Server.Administration.XsnFeatureReceiver"
ReceiverAssembly="Microsoft.Office.InfoPath.Server, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
<ElementManifests>
<ElementManifest Location="Elements.xml" />
</ElementManifests>
<Properties>
<Property Key="FeatureName" Value="IdentityForm" />
<Property Key="OriginalFileName" Value="Identity.xsn" />
</Properties>
<ActivationDependencies>
<!-- XsnFeatureReceiver -->
<ActivationDependency FeatureId="C88C4FF1-DBF5-4649-AD9F-C6C426EBCBF5" />
<!-- WSS Fields -->
<ActivationDependency FeatureId="CA7BD552-10B1-4563-85B9-5ED1D39C962A" />
</ActivationDependencies>
</Feature>
Elements.xml
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="XSN" Url="FormServerTemplates" RootWebOnly="TRUE">
<File Url="Identity.xsn" Name="Identity.xsn" Type="GhostableInLibrary"/>
</Module>
</Elements>
Il suffit juste d'ajouter le fichier .xsn dans le répertoire de la fonctionnalité pour que cela fonctionne. Comme nous avons déterminé un GUID spécifique pour notre fonctionnalité, nous pouvons alors demander automatiquement son activation dans le fichier de définition d'un site par exemple, ou tout simplement l'inclure dans une solution globale.
A noter que si votre formulaire contient du code C# ou VB pour exécuter des actions spécifiques, il faut alors juste mettre la DLL de ce code dans le répertoire de la fonctionnalité.
J'espère que cela vous aidera !
Adrien
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 :