27
Advanced Feature Development Neil Iversen Inetium http://justaddcode.com

Advanced Feature Development Neil Iversen Inetium

Embed Size (px)

Citation preview

Page 1: Advanced Feature Development Neil Iversen Inetium

Advanced Feature Development

Neil Iversen

Inetium

http://justaddcode.com

Page 2: Advanced Feature Development Neil Iversen Inetium

The Plan

• Feature Refresher• Feature Limitations• Custom Actions• Dealing with Dependencies• Stapling• Managing Files• Feature Receivers• Some Techniques• Questions

Page 3: Advanced Feature Development Neil Iversen Inetium

Feature Refresher

• Deployment vehicle for SharePoint applications• The Goal

● Setup.exe style deployment• The Reality

● Not exactly

Page 4: Advanced Feature Development Neil Iversen Inetium

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

Page 5: Advanced Feature Development Neil Iversen Inetium

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

Page 6: Advanced Feature Development Neil Iversen Inetium

Feature Lifecycle

Page 7: Advanced Feature Development Neil Iversen Inetium

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)

Page 8: Advanced Feature Development Neil Iversen Inetium

Custom Actions

• Create your own menu options• Many extensibility points• Main Attributes

● Title● Location● GroupId● Sequence

• HideCustomAction● Hides an existing Custom Action

Page 9: Advanced Feature Development Neil Iversen Inetium

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>

Page 10: Advanced Feature Development Neil Iversen Inetium

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>

Page 11: Advanced Feature Development Neil Iversen Inetium

DEMO: Features and Files

Page 12: Advanced Feature Development Neil Iversen Inetium

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>

Page 13: Advanced Feature Development Neil Iversen Inetium

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

Page 14: Advanced Feature Development Neil Iversen Inetium

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" />

Page 15: Advanced Feature Development Neil Iversen Inetium
Page 16: Advanced Feature Development Neil Iversen Inetium

DEMO: Stapling in Action

Page 17: Advanced Feature Development Neil Iversen Inetium

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/">

Page 18: Advanced Feature Development Neil Iversen Inetium

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, …

Page 19: Advanced Feature Development Neil Iversen Inetium

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

Page 20: Advanced Feature Development Neil Iversen Inetium

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>

Page 21: Advanced Feature Development Neil Iversen Inetium

DEMO: Deploying SPWeb Properties

Page 22: Advanced Feature Development Neil Iversen Inetium

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’

Page 23: Advanced Feature Development Neil Iversen Inetium

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)

Page 24: Advanced Feature Development Neil Iversen Inetium

DEMO: Feature Activation

Page 25: Advanced Feature Development Neil Iversen Inetium

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!

Page 26: Advanced Feature Development Neil Iversen Inetium

Questions?

Page 27: Advanced Feature Development Neil Iversen Inetium

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