Wiring Taxonomy Fields in the Sandbox in SharePoint 2010 using PowerShell

By bhoeijmakers at July 30, 2012 14:21
Filed Under: .NET, SharePoint 2010

A while ago I did a series of blog posts about Taxonomy Fields. You can find those posts here: Part I, Part II, Part III. Most of the code in those posts is not usable when working in the Sandbox, since the Microsoft.SharePoint.Taxonomy namespace is not available when writing solutions for the sandbox.

 

The other day I had to write a solution for a customer which had (among others of course) the following requirements:

- Centrally managed content types

- Sandboxed Solution

- Automated Install

 

I decided to create a Sandboxed Content Type Hub that would contain my Site Columns and Content Types.

 

All this will be deployed to the SharePoint Farm using PowerShell Scripts. This gives me some flexibility to configure my Taxonomy Fields using PowerShell. The solution to declaring Taxonomy Fields described in my earlier post http://www.insidesharepoint.net/post/2010/11/05/Using-taxonomyfields-in-Sharepoint-2010-Part-I.aspx uses a Feature Receiver to connect the declared Taxonomy Field to its hidden notefield and to the Term Set from the TermStore. In order to do this, we need classes from the Microsoft.SharePoint.Taxonomy namespace that are not available in the Sandbox. So I couldn’t use that solution directly.

 

What I eventually did was declare the fields as usual in the solution, and then rewrite the feature receiver to a PowerShell function. Also I wrote scripts to create the Content Type Hub site collection and to upload the Sandboxed Solution containing my Content Types and Site Columns to the Content Type Hub site collection. I thought I share the code to do this with you, maybe it helps someone out there.

 

Wiring up a Taxonomy Field using PowerShell:

 

function ConfigureMetaDataField( [string]$taxFieldGuid, [string]$noteFieldGuid, [string]$siteUrl, [string]$mmaName, [string]$groupName, [string]$termSetName ) 
{
    # Get the site
    $site = Get-SPSite $siteUrl
    # Get the taxonomy field that was deployed by the Sandboxed WSP
    [Microsoft.SharePoint.Taxonomy.TaxonomyField]$field = $site.RootWeb.Fields | Where-Object { $_.Id -eq $taxFieldGuid }
    
    # Set the hidden note field
    $field.TextField = $noteFieldGuid
    # Get the correct Term Set from the Managed Metadata service app
    $session = new-object Microsoft.SharePoint.Taxonomy.TaxonomySession($site)
    $termstore = $session.TermStores[$mmaName]
    $group = $termstore.Groups | Where-Object { $_.Name -eq $groupName }
    $termSet = $group.TermSets[$termSetName]
    # Set the fields termstore id and termset id
    $field.SspId = $termstore.Id
    $field.TermSetId = $termSet.Id
    # Update the field

$field.Update()

 

# Dispose

$site.Dispose()

}
 

The PowerShell function assumes that you have already deployed the Taxonomy Field and its hidden note field using a (Sandboxed) WSP. How to do this is described in my earlier post here, but reprinted here for completeness:

 

Fields declaration:

 

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">  
	<Field Type="TaxonomyFieldTypeMulti"          
		DisplayName="MyTaxonomyField"          
		ShowField="Term1033" Required="TRUE"          
		ID="{8D0458C1-0FB7-4981-BEE1-52D0DF01895C}"          
		StaticName="MyTaxonomyField"          
		Name="MyTaxonomyField"          
		Group="Custom"         
		Mult="TRUE"         
		>
	</Field>    
	<Field Type="Note"          
		DisplayName="MyTaxonomyField_0"          
		StaticName="MyTaxonomyFieldTaxHTField0"          
		Name="MyTaxonomyFieldTaxHTField0"          
		ID="{3a913424-fc7f-49ef-8fb6-a2ca1712cdc3}"          
		Hidden="TRUE"         
		DisplaceOnUpgrade="TRUE"         
	/>
</Elements>
 

ContentType declaration:

 
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <!-- Parent ContentType: Item (0x01) -->
  <ContentType ID="0x0100b58d33764b384da58bbadee9721e1843"
               Name="MyCustomContentType"
               Group="Custom"
               Description="Custom provisioned contenttype containing a Taxonomyfield"
               Inherits="TRUE"
               Version="0">
    <FieldRefs>
      <FieldRef ID="8D0458C1-0FB7-4981-BEE1-52D0DF01895C" Name="MyTaxonomyField"/>
      <FieldRef ID="3a913424-fc7f-49ef-8fb6-a2ca1712cdc3" Name="MyTaxonomyFieldTaxHTField0"/>
      <FieldRef ID="f3b0adf9-c1a2-4b02-920d-943fba4b3611" Name="TaxCatchAll"/>
      <FieldRef ID="8f6b6dd8-9357-4019-8172-966fcd502ed2" Name="TaxCatchAllLabel"/>
    </FieldRefs>
  </ContentType>
  <Receivers>
    <Receiver>
      <Name>TaxonomyItemSynchronousAddedEventReceiver</Name>
      <Type>ItemAdding</Type>
      <Assembly>Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
      <Class>Microsoft.SharePoint.Taxonomy.TaxonomyItemEventReceiver</Class>
      <SequenceNumber>10000</SequenceNumber>
    </Receiver>
    <Receiver>
      <Name>TaxonomyItemUpdatingEventReceiver</Name>
      <Type>ItemUpdating</Type>
      <Assembly>Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
      <Class>Microsoft.SharePoint.Taxonomy.TaxonomyItemEventReceiver</Class>
      <SequenceNumber>10000</SequenceNumber>
    </Receiver>
  </Receivers>
</Elements>
  

Uploading the Sandboxed Solution (WSP) to the Content Type Hub Site Collection:

 

Add-SPUserSolution -LiteralPath $wspPath -Site $siteUrl

 

Activating the Sandboxed Solution:

 

Install-SPUserSolution -Identity SolutionName.wsp -Site $siteUrl

 

Activate the Content Type Feature using the commandlet Enable-SPFeature.

 

This feature automatically activates the Site columns feature. If you make the Site Columns feature hidden and you create an activation dependency between the Content Type feature and the Site Columns feature, the Site columns feature will automatically be activated when activating the Content Type Feature. Pretty neat.

 

Calling the PowerShell function:

 

ConfigureMetaDataField -taxFieldGuid "8D0458C1-0FB7-4981-BEE1-52D0DF01895C" -noteFieldGuid "3a913424-fc7f-49ef-8fb6-a2ca1712cdc3" ‘

-siteUrl "http://mycontenttypehub" -mmaName "My Managed Meta Data Service Application" -group "MyGroup" -termSet "MyTermSet"

 

Thats it! Hope this helps someone…

I’m speaking on the TechDays 2012 in The Hague

By bhoeijmakers at February 14, 2012 21:24
Filed Under: .NET, SharePoint 2010

On thursday the 16th of february I’m speaking on the TechDays 2012 NL in The Hague. I’m doing a level 200 session called SharePoint 2010 for ASP.NET developers together with my collegue Donald Hessing. Hope to meet you there!

Implementing logging in SharePoint 2010 using the SharePoint Guidance library

By bhoeijmakers at December 04, 2011 08:18
Filed Under: .NET, SharePoint 2010

In this post I will talk about a way to implement a logging component in SharePoint 2010 that uses the Microsoft SharePoint Guidance Patterns and Practices library. The SharePoint Guidance library contains a lot of cool and very useful components. I will only focus on the logging component in this post and how to use it in practice to create your own logging component. In this post I am creating a Farm Solution. In a later post I will talk about how to do this in a sandboxed solution.

 

If you don’t want to read the theory and go straight to downloading the example solution, click here

 

More...

Taxonomy fields revisited: Getting the Term Store programmatically

By bhoeijmakers at November 04, 2011 16:12
Filed Under: .NET, SharePoint 2010

In my series of posts about using Taxonomy Fields in SharePoint 2010 I am using code to do all kinds of stuff with Taxonomy Fields and Terms from code. Because I can´t leave those fascinating Taxonomy Fields for what they are, here is yet another post about this subject Smile 

 

This is a follow up on my previous posts on this subject:

Using Taxonomy Fields in SharePoint 2010 - Part I

Using Taxonomy Fields in SharePoint 2010 - Part II

Using Taxonomy Fields in SharePoint 2010 - Part III

 

This post is meant for those of you that have read the previous posts (or attended one of my sessions on Managed Metadata Fields), and want to know more in order to write better code.

 

To get the Term Store from code I was using the following code in the Using Taxonomy Fields in SharePoint 2010 series of posts:

 

// set up the field for my termstore
TaxonomySession session = new TaxonomySession(site);
 
if (session.TermStores.Count > 0)
{
      // get termstore
      TermStore ts = session.TermStores[0];
 
      // more code here...
}

 

This is not very robust code and should not be used in a production environment. The code above gets the first (default) Term Store from the Taxonomy Session. But what if there are multiple Term Stores associated with the Web Application? In this post I will show you how to get the Term Store programmatically the right way More...

Creating a sortable CoreResultsWebPart in SharePoint 2010

By bhoeijmakers at February 16, 2011 18:41
Filed Under: .NET, SharePoint 2010

If you are using the out of the box SharePoint CoreResultsWebParts to show your search query results, you are limited to two options for sorting your results: Relevance (Rank) and Modified Date. What if we want to sort our search results to some other column? This post describes how to write code to create a custom CoreResultsWebPart that lets you sort search result on any column you want. Pretty sweet, so let’s get to it! More...

Using taxonomy fields in SharePoint 2010: Part III

By bhoeijmakers at January 13, 2011 21:21
Filed Under: .NET, SharePoint 2010

This is part III in my series about using TaxonomyFields in SharePoint 2010. In this part I will talk about how to search TaxonomyFields. I will show how to set up the metadata properties and how to search TaxonomyFields programmatically. This post continues on my previous posts about this subject:

 

Introduction

Part I: Declaration and initialization

Part II: Using taxonomyfields programmatically

Part III: Searching taxonomy fields (you are reading it!)

 

Managed Properties

To use our taxonomyfields in SharePoint search they need to be available in the managed properties of the farm. This works a little bit different with TaxonomyFields than with other fieldtypes. In this example I use the custom contenttype created in part I of this series and make the contained TaxonomyField “My taxonomy field” searchable using SharePoint search.

More...

Using taxonomy fields in SharePoint 2010: Part II

By bhoeijmakers at November 21, 2010 02:13
Filed Under: .NET, SharePoint 2010

In this series of posts I will talk about using Taxonomy fields in SharePoint 2010 development. They are a funky bunch and don´t work quite as you would expect. I will talk about the following subjects:

 

Introduction

Part I: Declaration and initialization

Part II: Using taxonomyfields programmatically (you are reading it!)

Part III: Searching taxonomy fields

 

The other part will be online in the next couple of weeks.

 

In this part I will talk about using the TaxonomyFields in your code. Read part I of my series to read about how to declare a TaxonomyField and create a contenttype containg the field.

 

Creating the basis

If I create a custom list on my site called TaxList and add the contenttype I’ve created in part 1 of this series to the Content Types of the list, I get a list with the following settings: More...

Using taxonomyfields in Sharepoint 2010: Part I

By bhoeijmakers at November 05, 2010 13:18
Filed Under: .NET, SharePoint 2010

In this series of posts I will talk about using Taxonomy fields in SharePoint 2010 development. They are a funky bunch and don´t work quite as you would expect. I will talk about the following subjects:

 

Introduction

Part I: Declaration and initialization (you are reading it!)

Part II: Using taxonomyfields programmatically

Part III: Searching taxonomy fields

 

The other parts are now also online!

 

Declaration and initialization

The problem with declaring TaxonomyFields programmatically is that you’ll have to do all the wiring of the field by hand. If you fail to follow all the neccesary steps, strange behaviour will occur and your TaxonomyField will not behave properly. In this post I try to give you a practical guide how to properly initialize a TaxonomyField. If you want to know why exactly all this is necessary, send me a message or do some more searching on the Internet. In the introduction post I’ve posted a link to a good blogpost about this.

 

For this example i'm using a new Visual Studio project and choosing the "Empty SharePoint project" template.

More...

About the author

Bart-Jan Hoeijmakers is Lead SharePoint Developer at VX Company. Since 2006 he is the driving force behind the development of several enterprise SharePoint projects within VX Company. He is a hardcore developer in both SharePoint and ASP.NET and loves to dive into the dark sides of SharePoint development.

Month List