Activating Content Type Feature at Web Application Scope

In SharePoint 2007, one of the ways of provisioning content type is by packaging content type definition as SharePoint Feature. This method allows a single content type definition to be leveraged across multipe site collections. One drawback of  this method is it's inability to restrict the Feature to be activated within a pariticular web application.

Content Type Features can be scoped only at a Site level. When this Feature is installed, it appears on every site collection in every web application. There are scenarios when this Feature needs to be activated only at a particular web application. For e.g. if you have two web applications; one for Sales and other for Marketing, you wouldn't want Sales specific content types to be activated in Marketing web application and vice versa.

One approach to work around this challenge is to write custom code in Feature activated event that makes the decision on whether the Feature can be activated. The other approach is to create a dependent Feature, scoped at Web Application, which would prevent Content Type Feature activation unless the dependent Feature is activated. Following section demonstrates the dependent Feature method:

Step 1 - Create Web Application Feature:

In this step, we will create a blank Feature, scoped at Web Application. Sole purpose of this Feature is to provide Activation Dependency for the Content Type Feature. Unless this Feature is activate for a Web Application, the content type Feature cannot be activated at site collection

________________________________ 

<?xml version="1.0" encoding="utf-8"?>
<Feature  Id="E4160D49-39CC-4a17-B700-03E4129F1350"
          Title="Allow Customer Content Type Feature"
          Description="Activating this Feature will allow site collection administrators to activate Customer Content Type Feature"
          Version="12.0.0.0"
          Hidden="FALSE"
          Scope="WebApplication"
          DefaultResourceFile="core"
          xmlns="https://schemas.microsoft.com/sharepoint/">
 <ElementManifests>
 </ElementManifests>
</Feature>

______________________

Note that ElementManifest tag is empty because this Feature does not contain any elements.

 

Step 2 - Create Content Type Definition and Feature:

In this step, we will create content type definition and Feature that will provision the content type. The imporant part here is the Activation Dependency to the Web application Feature.

Content Type Definition

<?xml version="1.0" encoding="utf-8"?>
<Elements Id="25994054-FF0E-49b1-8785-143D1A433924" xmlns="https://schemas.microsoft.com/sharepoint/">
 <ContentType ID="0x01010043e1c49b93d74e4b968fb95a6a330da40204"
  Name="Customer"
  Group="Document Content Types"
  Description="Content Type for Customer related documents"
  Version="0">
  <FieldRefs>
   <FieldRef ID="{7c8b4e26-cb9d-405c-84bd-18e76c40433e}" Name="CustomerName" />
  </FieldRefs>
 </ContentType>

<Field ID="{7c8b4e26-cb9d-405c-84bd-18e76c40433e}"
         Type="Text"
         Name="CustomerName"
         DisplayName="Customer Name"
         StaticName="CustomerName"
         Hidden="FALSE"
         Required="FALSE"
         Sealed="FALSE" />
</Elements>

Feature Definition

<?xml version="1.0" encoding="utf-8"?>

<Feature  Id="{969A3FA2-1357-48f8-9FC8-D40422A462D8}"

          Title="Customer Content Type"

          Description="Contains Content Types for Customer content"

          Version="12.0.0.0"

          Hidden="FALSE"

          Scope="Site"

          DefaultResourceFile="core"

          xmlns="https://schemas.microsoft.com/sharepoint/">

            <ElementManifests>

                        <ElementManifest Location="Customer.xml"/>

            </ElementManifests>

            <ActivationDependencies>

                        <ActivationDependency FeatureId=" E4160D49-39CC-4a17-B700-03E4129F1350"/>

</ActivationDependencies>

</Feature>

Note the ActivationDependency element in the content type Feature that points to Feature ID of the web applications scoped Feature that we created in step 1. This will ensure that content type Feature cannot be activated at a site collection, unless the Web application Feature is activated for the web application.