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…

Speaking on SharePoint Connections in Amsterdam

By bhoeijmakers at November 18, 2011 09:18
Filed Under: Sharepoint 2010

I’m happy to announce that I will be doing a session on SharePoint Connections 2011 in Amsterdam next Wednesday the 23th of November together with my collegae Donald Hessing. We will be doing the same session that we did on the European SharePoint Conference in Berlin last October.

 

i'm-a-speaker

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

Slide deck for my presentation on the European SharePoint Conference now available!

By bhoeijmakers at October 25, 2011 07:18
Filed Under: SharePoint 2010

I had a great time at the European SharePoint Conference in Berlin last week. Saw some great sessions and met a lot of cool new people. Thanks to everyone that attended our Managed Metadata black belt presentation. The slides are now available for download here

I’m speaking on the European SharePoint Conference in Berlin

By bhoeijmakers at September 13, 2011 08:07
Filed Under: SharePoint 2010

I’m very happy to announce that I will be giving a presentation on the European SharePoint Conference in Berlin. I will be doing a session on Managed Metadata together with my collegae Donald Hessing. Here is a description of the session:

 

The use of Managed Meta Data in SharePoint seems to be trivial. You link the managed meta data service application to the proxy group that you want to use in the webapplication, you add a managed meta data field to the list and link that to the termset you want to use. No magic here! But once we dive into the more advanced scenarios we will see that the use, development and management has a lot of dark sides. What is actually stored in a taxonomy field, do I need the note field, where is the TaxonomyHiddenList good for, can I use managed meta data in the sandbox, how do I use the taxonomy field with search, are there any restrictions from an architectural point of view?

The session will be on Thursday the 20th of October at 11:15.

 

Hope to meet you there!

Speaking on SharePoint Saturday Holland

By bhoeijmakers at March 24, 2011 17:32
Filed Under: SharePoint 2010

Next Saturday the 26th of march I will be doing a session on SharePoint Saturday together with Donald Hessing about using Managed Metadata in SharePoint 2010. Here is a description (in Dutch) of our session:

 

Het gebruik van Managed Meta data in SharePoint lijkt in eerste instantie erg triviaal. Je koppelt de managed meta data service application aan de proxy group die je wilt gebruiken in de webapplication, je voegt een managed meta data veld toe aan de lijst en geeft aan welke termset je daarbij wilt gebruiken. No magic here! Maar zodra we in de meer advanced scenario’s duiken zullen we zien dat het gebruik, programmering en beheer ervan nogal wat duistere kanten heeft. Wat wordt nu eigenlijk opgeslagen in een taxonomy field, heb ik nu wel of niet het notefield nodig, waar dient de TaxonomyHiddenList voor, kan ik managed meta data ook in de sandbox gebruiken, hoe gebruik ik het taxonomy field in combinatie met search, hoe zet ik eigenlijk de default value van een taxonomy field en zijn er vanuit architectuur oogpunt nog beperkingen? Kortom…”We will fight against the black magic of SharePoint and will show and explain the code to do it yourself!”

 

Lots of other great sessions too, hope to see you there!

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

Using taxonomyfields in SharePoint 2010: Introduction

By bhoeijmakers at October 31, 2010 18:17
Filed Under:

This is the introduction-post of my series on using taxonomyfields in SharePoint 2010 development. The series will, besides this introduction, consist of the following parts:

Part I: Declaration and initialization

Part II: Using taxonomy fields programmatically

Part III: Searching taxonomy fields

 

To understand how to use taxonomy fields in your projects, it is important to understand how they work under the hood.

Read this post from Wictor Wilen to learn (almost) all about it:

http://www.wictorwilen.se/Post/Dissecting-the-SharePoint-2010-Taxonomy-fields.aspx

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