Advanced Feature Development
Neil Iversen
Inetium
http://justaddcode.com
The Plan
• Feature Refresher• Feature Limitations• Custom Actions• Dealing with Dependencies• Stapling• Managing Files• Feature Receivers• Some Techniques• Questions
Feature Refresher
• Deployment vehicle for SharePoint applications• The Goal
● Setup.exe style deployment• The Reality
● Not exactly
Feature Refresher
• Ability to customize SharePoint● Used extensively by SharePoint itself
• Actions● Install/Uninstall● Activate/Deactivate
• Stored in the Hive● 12\TEMPLATE\FEATURES● Separate directory for each feature
• Scopes● Web, Site, Farm, Web App
• Common Scenarios● List Templates● Workflow
Key Feature Limitations
• Limited set of supported schemas• Supports fewer file options than Solutions• Must be bundled in Solutions for larger farms• Upgrading deployed features is difficult
● Might not follow expected behavior
Feature Lifecycle
Mentioning Solutions
• Bundled into one file (.wsp)• Can combine multiple features• Deploys across all web front ends• Can easily update SafeControls in web.config• Deploy Code Access Security (CAS)
Custom Actions
• Create your own menu options• Many extensibility points• Main Attributes
● Title● Location● GroupId● Sequence
• HideCustomAction● Hides an existing Custom Action
Custom Actions
• URL Prefixes● ~site – Relative link to the SPWeb● ~sitecollection – Relative link to the SPSite
• URL Replacements● {ItemId} – List Item’s ID● {ItemUrl} – List Item URL● {ListId} – ID of the List● {SiteUrl} – Like ~site except it can be used anywhere
• Example<CustomAction Id="325b7c78-f041-4d1b-856b-f9b1e49ddfeb" GroupId="PersonalActions" Location="Microsoft.SharePoint.StandardMenu" Sequence="1000" Title=“My Title" Description=“A Custom Action
<UrlAction Url=“javascript:alert(‘You were at {SiteUrl}’);"/> </CustomAction>
Managing Files in Features
• Deploy a file into a site● Web● Document Library
• URL can be aliased● MobileRedirect (\m) uses it
• Not as powerful as Solutions• Uninstall behavior is non-intuitive• Example:
<Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Module Name=“file" Url=“” Path=“”"> <File Url=“MyFile.aspx" />
</Module></Elements>
DEMO: Features and Files
Dealing with Dependencies
• Problem: Feature depends on another SharePoint Object
• Solution: Create dependency between the features
• Example● <ActivationDependencies>
<ActivationDependency FeatureId="52890518-036f- 4027-babd-f4c7df3ee429" />
<ActivationDependency FeatureId="6d276cfc-1c84- 46cc-8566-500e66213e06 " />
</ActivationDependencies>
Dependency Limitations
• Feature Chains● Limited to one visible feature
• Dependencies can’t be triggered at a higher scope● Ex: Farm Feature can’t depend on a Web Feature
• Features can’t be automatically activated at different scopes
● Ex: Web Feature can’t activate a Farm Feature
• Hidden Features● Automatically Activated for Dependencies● Automatically Deactivated when the last Dependency is
Deactivated● Can’t be depended on in different scopes● Can’t have their own dependencies● Can add an additional level to Feature Chains
Stapling
• Problem: Can’t customize out of the box Site Definitions
• Solution: Stapling!• Scopes: Farm, Web App, Site
● Note: Not Web• FeatureSiteTemplateAssociation
● <FeatureSiteTemplateAssociation Id="b04e59b1-2c21-48fa-9497-470b1ab711b0" TemplateName="STS#0" />
● <FeatureSiteTemplateAssociation Id="fd45b13f-6334-4bce-b87c-49e3f820a74c" TemplateName=“GLOBAL#0" />
DEMO: Stapling in Action
Feature Receivers
• The ‘Custom’ Feature• .NET Code
● Override• FeatureInstalled, FeatureUninstalling• FeatureActivated, FeatureDeactivating
• Example● <Feature Id="0a7e1ca9-ee71-4407-80a0-b5b57f4f6f5d"
Title=“My Feature Reciever" Scope="Site" ReceiverAssembly=“MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e35a4d2663eae0ae" ReceiverClass=“MyAssembly.MyFeatureReciever" xmlns="http://schemas.microsoft.com/sharepoint/">
Feature Receivers – Getting Context
• Getting Context● Retrieving the Current Scoped Object
• SPFeatureReceiverProperties– SPFeatureReceiverProperties.Feature.Parent
• Cast to the appropriate type– Scope: Web
» SPWeb web = (SPWeb)properties.Feature.Parent;» SPSite site = (SPSite)properties.Feature.Parent
• Example Usages● Perform clean uninstalls of features● ‘Upgrade’ features using Activate● Set dependencies to chain actions together● Web.config changes● Address gaps in current supported Features
• Policies, Custom Fields, …
Feature Receivers - Debugging
• Based on Deployment/Activation Method• Stsadm
● Runs as currently logged in user● Console.WriteLine
• Web Interface● Runs as App Pool user● Need to use logger (EventLog, or some Logging
code)• DLL Deployment
● Overwrite Existing DLL● iisreset
Feature Properties
• Configuration for your Feature• Allow different values for Dev/Test/Prod• Combine with scoped property bags to set
configurations• Example
<Properties><Property Key=“MyKey" Value=“123" /><Property Key=“DBServer" Value=“prodsql001" />
</Properties>
DEMO: Deploying SPWeb Properties
Manually Activating Features
• Why?● Evade chaining restrictions (at your own peril)● Working with Hidden Features● Manage Stages of a Site with a Web Part● Creating a ‘Suicide Feature’
Manually Activating Features
• Get your Context● Ex: SPWeb
• Find the Feature Collection● Ex: SPWeb.Features
• Find the Feature’s Guid● Ex: Guid featureGuid = new Guid(“0a7e1ca9-ee71-
4407-80a0-b5b57f4f6f5d”)• Activate!
● Ex: SPWeb.Features.Add(featureGuid)
DEMO: Feature Activation
Your Feedback is Important
Please fill out a session evaluation form and either put them in the basket near the exit
or drop them off at the conference registration desk.
Thank you!
Questions?
Thanks!
Neil Iversen
Inetium
http://justaddcode.com
Other Sessions:• SharePoint 212 – Customizing the Mobile Experience
When – Thursday 11:15amWhere – Mandalay Bay B
• SharePoint 314 – PowerShell for SharePoint DevelopersWhen – Thursday 2pmWhere – Mandalay Bay B