Skip to main content

How to deloy InfoPath 2010 "Administrator-approved form template" to SharePoint 2010 programaticaly


Scenario: you've developed and InfoPath 2010 form. This form contains code that requires full trust, so you need to deploy it as a administrator-approved form template.

This requires an farm administrator to check, upload and activate the form for the site collection.

Solution: to automate this operation I created a farm level feature - when the feature is activated upload the form programmatically and when the feature is deactivated remove the form programmatically.

Here is how I did it:

1. Create an Empty SharePoint Project and set it to be deployed as a farm solution

2. Add an Empty element item - EmptyElement1. This will also generate a feature - Feature1

3. Delete the Elements.xml file of the EmptyElement1

4. Copy/Paste the InfoPath 2010 form into the EmptyElement1

5. Right click on the added form and click Properties:
 - Deployment Type: ElementFile
 - Deployment Location> Path: set it to blank

6. Open the generated feature, Feature1

7. Set the scope to Farm level and save it

8. Right click on the feature and select "Add Event Receiver"

9. Comment out the FeatureActivated and FeatureDeactivating methods

10. Add the following code to the FeatureActivated method to upload the form:

  SPSecurity.RunWithElevatedPrivileges(() =>
  {
   SPFarm localFarm = SPFarm.Local;
   FormsService localFormsService;
   string solutionPath = properties.Definition.RootDirectory + @"\Form.xsn";
   try
   {
    localFormsService = localFarm.Services.GetValue(FormsService.ServiceName);
    localFormsService.FormTemplates.UploadFormTemplate(solutionPath);
   }
   catch (Exception ex) {
    // Handle exception Here
   }
  });

10. Add the following code to the FeatureDeactivating method to remove the form:

  SPSecurity.RunWithElevatedPrivileges(() =>
  {
   SPFarm localFarm = SPFarm.Local;
   FormsService localFormsService;
   string solutionPath = properties.Definition.RootDirectory + @"\Form.xsn";
   try
   {
    localFormsService = localFarm.Services.GetValue(FormsService.ServiceName);
    FormTemplate formTemplateToRemove = (from formTemplates in localFormsService.FormTemplates
              where formTemplates.DisplayName == "Form"
              select formTemplates).Single();
    localFormsService.FormTemplates.RemoveFormTemplate(formTemplateToRemove);
   }
   catch (Exception ex) {
    // Handle exception Here
   }
  });

11. Build and deploy the solution.


That is it!


Note that you need to reference the Microsoft.Office.InfoPath.Server.dll. This is usually located here:  C:\Program Files\Microsoft Office Servers\14.0\Bin\

Comments

Popular posts from this blog

Emmet in Visual Studio Code | cheat sheet link

Support for   Emmet   snippets and expansion is built right into Visual Studio Code,   no extension required .   Emmet 2.0   has support for the majority of the   Emmet Actions   including expanding   Emmet abbreviations and snippets .   Emmet is a web-developer’s toolkit that can greatly improve your HTML & CSS workflow   Links: Emmet in Visual Studio Code   Cheat Sheet (emmet.io)  

How to create a custom Workflow Task / SharePoint Server Workflow Task content type using Visual Studio?

If you are designing an Workflow and you want to create custom  Workflow Task or SharePoint Server Workflow Task  using Visual Studio interface then you'll need to make these two content types visible. To make them visible I'm using the following  PowerShell   script: $site = Get - SPSite "http://site/url/here" $web = $site . RootWeb # Workflow Task $contentType = $web . ContentTypes [ "Workflow Task" ] $contentType . Group = "Custom Content Types" $contentType . Hidden = $FALSE $contentType . Update () # SharePoint Server Workflow Task $contentType = $web . ContentTypes [ "SharePoint Server Workflow Task" ] $contentType . Group = "Custom Content Types" $contentType . Hidden = $FALSE $contentType . Update () $site . Dispose () Then when you can add a new Content Type from Visual Studio and you will see the two Content Type in the list. To revert these changes run this PowerShell script: ...