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.

Download Report

Transcript 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.

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
Installed
Activated
Deactivated
Uninstalled
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-036f4027-babd-f4c7df3ee429" />
<ActivationDependency FeatureId="6d276cfc-1c8446cc-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-9497470b1ab711b0" TemplateName="STS#0" />
●
<FeatureSiteTemplateAssociation Id="fd45b13f-6334-4bce-b87c49e3f820a74c" TemplateName=“GLOBAL#0" />
Site Template (STS#0)
OOB Features
• teamcollab
• eventslist
•…
Stapled Features
(FeatureSiteTemplateAssoc)
• My Stapled Feature
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-ee714407-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!
Other Sessions:
• SharePoint 212 – Customizing the Mobile Experience
When – Thursday 11:15am
Where – Mandalay Bay B
• SharePoint 314 – PowerShell for SharePoint Developers
When – Thursday 2pm
Where – Mandalay Bay B
Neil Iversen
Inetium
http://justaddcode.com