SharePoint 4 Developers

Guia de referência adicional em desenvolvimento .NET / SharePoint

Configurando Taxonomy Field Values Programaticamente

A configuração de Taxonomy Field values pode ser comlicada, principalmente pela falta de documentação. Nesse post eu mostro um exemplo de como se trabalhar com o novo modelo de objetos para a migração de field values (Lookup fields X Taxonomy fields).

Oi pessoal,

Essa semana realizei a migração de Lookup Lists e Lookup fields. Fiquei impressionado pela falta de documentação e exemplos de como trabalhar com Taxonomy field values.

Nessa nota rápida vou mostrar a vocês um exemplo de como se trabalhar com o novo modelo de objetos para a migração de field values (Lookup fields X Taxonomy fields).

Premissa

Considere a seguinte Lookup List e Term Store nesse exemplo, que contém os jogadores da seleção da Copa de 2010, conforme Figura 1:

vs680 Figura 1 – Lookup List vs Taxonomy Term Store

OBS: Como você pode perceber, a decisão em migrar Lookup fields para Taxonomy fields é uma batalha. Será que vale a pena? No meu caso como estou criando um Content Type Hub, todos os Site Columns não podem possuir dependencias, então uma solução é se livrar dos Lookup fields.

Lookup fields X Taxonomy fields

Imagine uma Lista que contenha ambos os campos (fields), o primeiro mapeia a Lookup List e o segundo o Term Store. Nesse cenário o Lookup field contém valores, porém o Taxonomy field não, pois foi recentemente criado e precisa ser populado.

Como uma solução para isso, o código abaixo mapeia os Lookup field values para Taxonomy field values, também conhecido como Managed Metadata field values.

Code Snippet
  1. static void Main(string[] args)
  2. {
  3.     var url = ConfigurationManager.AppSettings["Url"].ToString();
  4.     var library = ConfigurationManager.AppSettings["Library"].ToString();
  5.  
  6.     // Leitura de XML, considere
  7.     // (key => lookup field,value => taxonomy field)
  8.     Dictionary<string, string> mappingFields = XMLHelper.ReadDictionaryXML("MappingFields.xml");
  9.  
  10.     using (SPSite site = new SPSite(url))
  11.     {
  12.         using (SPWeb web = site.RootWeb)
  13.         {
  14.             // Obtem a lista/library
  15.             SPList list = web.Lists[library];
  16.  
  17.             foreach (SPListItem item in list.Items)
  18.             {
  19.                 // Itera em todos os mapped fields
  20.                 foreach (var mappedField in mappingFields)
  21.                 {
  22.                     if (item.Fields.ContainsField(mappedField.Key))
  23.                     {
  24.                         // Atualiza sem deixar rastros
  25.                         web.Site.AllowUnsafeUpdates = true;
  26.  
  27.                         // Obtem a instancia do lookup field
  28.                         var lookupValueList = (item[mappedField.Key] as SPFieldLookupValueCollection).ToList();
  29.  
  30.                         // Obtem a instancia do taxonomy field
  31.                         TaxonomyField managedField = item[mappedField.Value] as TaxonomyField;
  32.  
  33.                         // Obtem a taxonomy session atual
  34.                         TaxonomySession session = new TaxonomySession(web.Site, false);
  35.  
  36.                         // Obtem o term store (pelo SspId)
  37.                         var termStoreCol = session.TermStores[managedField.SspId];
  38.  
  39.                         // Obtem os termos de um especifico term set (pelo TermSetId)
  40.                         var termCol = termStoreCol.GetTermSet(managedField.TermSetId).Terms;
  41.  
  42.                         var listTerms = new List<Term>();
  43.  
  44.                         // Itera em todos os lookup values
  45.                         foreach (var itemValue in lookupValueList)
  46.                         {
  47.                             string value = itemValue.LookupValue;
  48.  
  49.                             // Obtem o termo que corresponde a cada valor
  50.                             // encontrado na lista de lookup values
  51.                             var termToSet = termCol[value];
  52.  
  53.                             listTerms.Add(termToSet);
  54.                         }
  55.  
  56.                         // Define o field value utilisando a lista de termos
  57.                         managedField.SetFieldValue(item, listTerms);
  58.  
  59.                         // Salva o item
  60.                         item.SystemUpdate();
  61.  
  62.                         // Cancela unsafe updates
  63.                         web.Site.AllowUnsafeUpdates = false;
  64.                     }
  65.                 }
  66.             }
  67.         }
  68.     }
  69. }

OBS: O código acima está bem comentado, o que dispensa comentários.

Espero que essa nota rápida ajude.

Referência:
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.taxonomy.taxonomyfield.aspx

[]’s,

Marcel Medina

Clique aqui para ler o mesmo conteúdo em Inglês.