Querying on Managed Metadata Field Values in SharePoint Server 2010‏

This two posts from Mario Cortes will give you a good understanding on how to use the Taxonomy in SharePoint 2010:

http://geeks.ms/blogs/mcortes/archive/2010/06/30/metadatos-administrados-modelo-de-objetos-y-controles-i.aspx

http://geeks.ms/blogs/mcortes/archive/2010/07/06/metadatos-administrados-modelo-de-objetos-y-controles-ii.aspx

Metadatos administrados: Modelo de objetos y controles (I)

Mediante el servicio de metadatos podremos asociar a nuestro contenido metadatos con una estructura con sentido para nuestra organización. Además de la poder manejarlos desde la interfaz gráfica, dispondremos de un modelo de objetos para realizar el mantenimiento, consultas y visualizarlo mediante controles.

Modelo de objetos

SharePoint nos proporciona una serie de clases para manejar y navegar por la estructura de metadatos. Para obtener una referencia al conjunto de almacenes de términos definidos para una Colección de Sitios utilizaremos la clase TaxonomySession. Mediante la propiedad TermStores podremos obtener los distintos almacenes de términos del tipo TermStore que representa un almacén de grupos de términos.

Para obtener los grupos de términos utilizaremos la propiedad Groups de la clase TermStore que nos devolverá una colección de elementos del tipo Group.

Para obtener los conjuntos de términos de un grupo utilizaremos la propiedad TermSets.

Para ilustrar un ejemplo:

SPSite site = SPContext.Current.Site; TaxonomySession session = new TaxonomySession(site); TermStore termStore = session.TermStores[“Servicio de metadatos administrados”]; // Almacén de términos Group group = termStore.Groups[“MiGrupo”]; // Grupo de términos TermSet productsTermSet = group.TermSets[“MiConjunto”]; // Conjunto de términos

Term termino = productsTermSet.Terms[“MiTérmino”]; // Término o palabra

Para manejar una columna de tipo “Metadatos administrados” disponemos de la clase TaxonomyField, con el método GetFieldValue() obtendremos una referencia del tipo TaxonomyFieldValue para manejar los valores almacenados en la columna.

De la clase TaxonomyFieldValue podemos obtener el identificador del término almacenado con la propiedad TermGuid y con la propiedad Label el texto del término.

SPList listaConMetadato = SPContext.Current.Site.RootWeb.Lists[“NombreLista”]; SPListItem itemConMetdato = listaConMetadato.Items[0]; TaxonomyFieldValue valordeMetadato = new TaxonomyFieldValue((string)itemConMetdato[“NombreColumna”]); string idTermino = valordeMetadato.TermGuid; string textoTermino = valordeMetadato.Label;

Controles

En la parte visual dispondremos de varios controles como:

  • TaxonomyFieldControl
  • TaxonomyWebTaggingControl

Ambos controles los encontraremos en la dll Microsoft.SharePoint.Taxonomy.dll en el namespace Microsoft.SharePoint.Taxonomy. Para registrar estos controles en una página o control utilizaremos:

<%@ Register Tagprefix=”Taxonomy” Namespace=”Microsoft.SharePoint.Taxonomy” Assembly=”Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>

El control TaxonomyFieldControl lo utilizaremos para poder asociar un elemento de una lista o biblioteca a un metadato, es el control que utilizará SharePoint al visualizar una columna de tipo “Metadatos administrados”. Por ejemplo las páginas wiki disponen de la opción de catalogar las páginas mediante una columna de tipo “Metadatos administrados” y en el layouts:

<Taxonomy:TaxonomyFieldControl FieldName=”Wiki_x0020_Page_x0020_Categories” EmptyValueDescriptionForTargetTemplate=”<%$Resources:cms,enterwiki_nocategories_assigned%>” DisableInputFieldLabel=”true” runat=”server” />


El control TaxonomyWebTaggingControl lo utilizaremos para navegar por la estructura de metadatos. Para utilizarlo tendremos que indicarle que subconjunto del árbol de metadatos utilizará, por ejemplo:

taggingTaxonomy.SspId.Add(termStore.Id); taggingTaxonomy.TermSetId.Add(productsTermSet.Id); taggingTaxonomy.AllowFillIn = true; // Permite autocompletar taggingTaxonomy.IsMulti = false; // Indica si permite multiselección

Para leer el metadato seleccionado, disponemos de la propiedad “Text” que devuelve los términos seleccionados con el formato “Término|GUID”. En este caso no podremos utilizar una clase del tipo TaxonomyFieldValue para extraer los valores por separado ya que el formato que devuelve la propiedad TaxonomyWebTaggingControl.Text no es compatible.

Metadatos administrados: Modelo de objetos y controles (II)

Siguiendo con el post Metadatos administrados: Modelo de objetos y controles (I), veremos en esta ocasión cómo crear nuevas estructuras de metadatos y como consultar los elementos que estén asociadas a ellas mediante el modelo de objetos.

Creación de términos

Crearemos una estructura similar a la siguiente imagen:

Lo primero que haremos será hacer un “using Microsoft.SharePoint.Taxonomy;”, para conectar al servicio de metadatos obtendremos una referencia mediante “new TaxonomySession(site);”, a continuación agregaremos un código similar al siguiente:

public static void CrearTerminos() { using (SPSite site = new SPSite(“http://UrlColecciónDeSitios&#8221;)) { TaxonomySession session = new TaxonomySession(site); TermStore termStore = session.TermStores[“Servicio de metadatos administrados”]; // Almacén de términos Group NuevoGrupo = termStore.CreateGroup(“Grupo de Pruebas”); NuevoGrupo.AddContributor(“Dominio\\usuario”); TermSet conjuntoDeTerminos = NuevoGrupo.CreateTermSet(“Nuevo conjunto”); int lcidSpanish = System.Globalization.CultureInfo.GetCultureInfo(“es-ES”).LCID; Term termino1 = conjuntoDeTerminos.CreateTerm(“Término 1”, lcidSpanish); Term termino2 = conjuntoDeTerminos.CreateTerm(“Término 2”, lcidSpanish); termStore.CommitAll(); } }

Mediante la propiedad TermStores obtenemos una referencia al almacén de metadatos sobre el que crearemos nuestra estructura. Con el método CreateGroup() crearemos un nuevo grupo de términos. Con CreateTermSet crearemos un nuevo conjunto de términos, si no indicamos nada en el segundo parámetro se creará para el idioma por defecto. Con el método CreateTerm() crearemos términos por debajo del grupo de términos o debajo de otros términos, el segundo parámetro indica el código lcid del idioma del término.

Consulta de términos

Una vez hayamos asociado los metadatos a nuestros contenidos podremos realizar consultas sobre ellos con el modelo de objetos, CAML y el motor de búsqueda.

Para obtener un término a partir de su descripción utilizaremos el método GetTerms():

public static void ObtenerTerminos() { using (SPSite site = new SPSite(“http://UrlColecciónDeSitios&#8221;)) { TaxonomySession session = new TaxonomySession(site); int lcidSpanish = System.Globalization.CultureInfo.GetCultureInfo(“es-ES”).LCID; TermSetCollection termSetColl= session.GetTermSets(“Nuevo conjunto”, lcidSpanish); TermCollection termColl = session.GetTerms(“Término 1”, true); } }

Para realizar consultas con CAML nos encontraremos con que tendremos que realizar una serie de pasos adicionales ya que al agregar una columna de tipo “Metadatos administrados” SharePoint creará una columna oculta de tipo lookup para facilitar las búsquedas.

Tendremos que obtener entonces el identificador de la columna lookup para construir después la consulta CAML con una estructura similar a la siguiente:

<Query><Where><In><FieldRef LookupId=”TRUE” Name=”{Nombre interno de la columna a consultar}” /><Values><Value Type=”Integer”>{Id de la columna lookup de metadatos}</Value></Values></In></Where></Query>

El siguiente ejemplo muestra cómo obtener los elementos catalogados con el término “Automóvil” en una lista mediante CAML:

public static void ObtenerElementosConTermino() { using (SPSite site = new SPSite(“http://UrlColecciónDeSitios&#8221;)) { TaxonomySession session = new TaxonomySession(site); TermCollection termColl = session.GetTerms(“Automóvil”, true); foreach(Term term in termColl) { if (term.IsKeyword) { int[] arIdsDeElementos = TaxonomyField.GetWssIdsOfKeywordTerm(site, term.Id, 1000); }

int[] arIdsDeElementos2 = TaxonomyField.GetWssIdsOfTerm(site, term.TermStore.Id, term.TermSet.Id, term.Id, true, 1000); using (SPWeb web = site.OpenWeb()) { SPList listaDocumentos = web.Lists[“Documentos generales”]; SPQuery queryCAML = new SPQuery(); StringBuilder sb = new StringBuilder(); foreach(int idLookup in arIdsDeElementos2) { sb.Append(string.Format(“<Value Type=\”Integer\”>{0}</Value>”, idLookup)); } queryCAML.Query = string.Format(“<Query><Where><In><FieldRef LookupId=\”TRUE\” Name=\”{0}\” /><Values>{1}</Values></In></Where></Query>”, listaDocumentos.Fields[“Temática”].InternalName, sb.ToString()); SPListItemCollection items = listaDocumentos.GetItems(queryCAML); } } } }

Mediante el motor de búsqueda de SharePoint también podremos realizar filtros en base a términos. La propiedad de búsqueda “owstaxIdMetadataAllTagsInfo” nos permite filtrar por un identificador de un término. Además, cada vez que se agregue una nueva columna a una lista del tipo “Metadatos administrados” el motor de búsqueda crear una propiedad administrada para filtrar sobre esa columna, esta propiedad se creará con la estructura “owstax{NombreInternoDeColumna}”.

En el siguiente ejemplo se muestra cómo realizar una búsqueda con el motor de búsqueda de todos aquellos documentos catalogados con un término:

using Microsoft.Office.Server; using Microsoft.Office.Server.Search;

using Microsoft.Office.Server.Search.Query;

public static void ObtenerElementosConBuscador() { using (SPSite site = new SPSite(“http://UrlColecciónDeSitios&#8221;)) { TaxonomySession session = new TaxonomySession(site); TermCollection termColl = session.GetTerms(“Automóvil”, true);

FullTextSqlQuery myConsulta = new FullTextSqlQuery(site); myConsulta.RowLimit = 10; myConsulta.QueryText = string.Format(“SELECT Title, Author, URL FROM Scope() WHERE (\”SCOPE\” = ‘Todos los sitios’) AND (\”owstaxIdMetadataAllTagsInfo\”=’#0{0}’)”, termColl[0].Id); myConsulta.ResultTypes = ResultType.RelevantResults; ResultTableCollection misResultados = myConsulta.Execute(); ResultTable resultadosRelevantes = misResultados[ResultType.RelevantResults]; } }

En el filtro se ha utilizado la propiedad owstaxIdMetadataAllTagsInfo indicando un valor del tipo “#0{GUID del término}”. No se puede utilizar la propiedad owstaxIdMetadataAllTagsInfo en la parte de consulta Select, solo podremos utilizarla en la parte Where.

Podréis encontrar más información en:

http://msdn.microsoft.com/en-us/library/ff625182.aspx

Use Flash in SharePoint 2010

Post from Ryan McIntyre about how to use flash in SharePoint 2010:

http://blog.randomdust.com/index.php/2011/01/use-flash-in-sharepoint-2010/

The idea of using Flash inside SharePoint 2007 is well documented and I’ve even done it a few times myself. My preferred method (non-code) is to slap a Content Editor web part (CEWP) on the page, go into the HTML editor, and add my <object> code. Worked like a charm.

Not so much in 2010. You can add a CEWP to a 2010 page, you can go into the HTML editor and add your <object> code, but the page will never load the swf file. There are recommendations out there saying to change the Browser File Handling setting for the web application to Permissive from Strict, but this didn’t fix anything for me (tried in three separate environments.) What did work is the following method using a Page Viewer web part…

  1. Upload your swf file to a library in your site (I prefer Site Assets library if you’re not using publishing features)
  2. Create a HTML file locally with the content:
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>Flash Page</title>
        </head>
        <body>
        <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="300" height="300" id="&lt;your swf filename here>" align="middle">
        <param name="allowScriptAccess" value="sameDomain" />
        <param name="movie" value="&lt;your swf filename here>.swf" />
        <param name="quality" value="high" />
        <param name="bgcolor" value="#ffffff" />
        <embed src="http://site/SiteAssets/&amp;amp;lt;your swf filename here>.swf" quality="high" bgcolor="#ffffcc" width="300" height="300" name="<Flash File Name>" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
        </object>
        </body>
        </html>

    Replace the <your swf filename here> with your filename, and changing any other params you need.

  3. Upload the .html file to your Site Assets library (or wherever you put your .swf file)
  4. To test your progress, click on the .html file in the library. If you’ve done everything right so far, a page should open in your browser which loads the Flash file (it may prompt you to show the file depending on your browser settings)
  5. Copy the URL of the .html file in it’s new location
  6. Navigate to the page where you want the Flash file to appear and go into edit mode
  7. Add a Page Viewer web part
  8. Edit the Page Viewer web part and choose the Web Page option, entering the link to your .html file in the Link text box
  9. Click OK, and ta-da!
  10. You will want to edit the web part again to set height and width, and hide or change the title, etc. But that’s up to you.

That’s the only method that worked for me. I found that the Browser File Handling setting had no impact on whether this method worked or not, so don’t worry about messing with that.

Edit: Turns out the Browser File Handling does need to be set to Permissive. At least it needs to be Permissive when you upload your HTML file. You can change it back to Strict after that if you need to. It looks like SharePoint adds the headers during file upload, not run time. So if you upload the HTML file with Strict, headers get added that prompt the user to download the file instead of just view it in the browser.

Attach databases and upgrade to SharePoint Server 2010

Tehcnet article about how to upgrade to SharePoint 2010 attaching databases:

http://technet.microsoft.com/en-us/library/cc263299.aspx

SharePoint and SSL – Configuring https for SharePoint on Windows Server 2008 IIS7

Post: http://www.sharepointassist.com/2009/02/01/sharepoint-and-ssl-configuring-https-for-sharepoint-on-windows-server-2008-iis7/

Problem

You would like your windows Server 2008 instance of SharePoint to respond to https.

Solution

Start computer management

Select the Internet Information Services role

Double click on Server Certificates

In the actions menu Create Self Signed Certificate (or if you are using these instructions for a production instance you can import your new certificate to IIS here as well.

Provide a friendly name for your cert

Right mouse key on your SharePoint web application and select Edit Bindings

In the bindings window add a new binding

Select SSL Settings for the SharePoint web application you’d like to communicate with via SSL / https.

Bind your certificate to “https” for the necessary IP addresses. Please note that port 443 is the default SSL port so don’t change that setting unless you are planning on providing the servername and port number to your end users (e.g. https://sharepoint:42843/)

Now launch your website with the https prefix in the url, if you followed these directions closely you will receive a certificate error since your self signed certificate was not provisioned by a valid certificate authority such as Verisign.

Success!!!

If you need to get a real SSL certificate instead of a self signed version you can browse the trusted certificate authorities in your browser

SharePoint Online for Office 365 Developer Guide

http://msdn.microsoft.com/en-us/library/hh147180.aspx

The SPPersistedObject, Microsoft.SharePoint.Administration.SPJobDefinition, could not be updated because the current user is not a Farm Administrator

Post: http://unclepaul84.blogspot.com/2010/06/sppersistedobject-xxxxxxxxxxx-could-not.html

Insufficient SQL database permissions for user Name: NT AUTHORITY\IUSR SID: S-1-5-17

Post: http://social.technet.microsoft.com/Forums/eu/sharepoint2010setup/thread/aa68ede5-6278-46b2-a651-b1620bf96672

Solution:

In order to resolve the issue, I provided Execute permission to the database role “WSS_Content_Application_Pools” into the stored procedure “proc_GetProductVersions”. I performed the following steps to do this.

  1. In the database server, expand SharePoint Config database and naviage to Programmability/Stored Procedures/dbo.proc_GetProductVersions using SQL Server Management Studio.
  2. Right click on the above stored procedure and select Properties.
  3. On the popup screen, select Permissions on the left and click Search button.
  4. On the new popup screen, click Search, select [WSS_Content_Application_Pools] database role and click OK.
  5. Click OK again.
  6. On the first popup screen, select the role, check Execute permission and click OK.

The SPListItem being updated was not retrieved with all taxonomy fields

Turns out it’s a central admin setting that throttles the lookup return count, and Taxonomy fields are just lookups under the hood.

Go into Central Administration –> Manage Web Applications, select your web application, and then in the ribbon choose the dropdown under General Settings select Resource Throttling. Find the setting for “List View Lookup Threshold” and raise it from the default 8 (can go up to 1000, but 20 is likely fine depending how many lookup fields you’re pulling back in your SPListItem).