Páginas

quarta-feira, 10 de fevereiro de 2016

SharePoint: problema em consulta de termos via JavaScript

O SharePoint tem um serviço de termos que pode ser usado tanto como navegação como classificação de itens (colocando tags em documentos, por exemplo).

Esse serviço de termos, chamado Managed Metadata Service, pode ser acessado através de uma API que pode ser consumida através de JavaScript.

Em uma funcionalidade na qual precisávamos acessar um conjunto de termos específico para popular um controle na tela, começamos a ter o erro abaixo quando a solução foi implantada no ambiente de testes.

Cannot read property 'toString' of null

O erro a princípio é simples de identificar, existe uma chamada do método toString em uma string que não recebeu nenhum valor. O problema é que esse erro dá dentro da biblioteca JavaScript do próprio SharePoint.

O código utilizado nessa chamada é o abaixo.

var termSetName = "NOME_TERMO";
var locale = 1046; //pt-BR
var clientContext = SP.ClientContext.get_current();
var taxonomySession = SP.Taxonomy.TaxonomySession.getTaxonomySession(clientContext);
var termStore = taxonomySession.getDefaultSiteCollectionTermStore();
var termSets = termStore.getTermSetsByName(termSetName, locale);
var termSet = termSets.getByName(termSetName);
var terms = termSet.getAllTerms();
clientContext.load(taxonomySession);
clientContext.load(termStore);
clientContext.load(termSet);
clientContext.load(terms);
clientContext.executeQueryAsync(function onSuccess() { 
    var enumerator = terms.getEnumerator(); 
    while (enumerator.moveNext()) { 
        var spTerm = enumerator.get_current(); 
        var name = spTerm.get_name(); 
        var id = spTerm.get_id(); 
        // ... 
    }
}, function onFailure(args) { 
    console.log(args.get_message()); 
});

Depois de analisar e comparar os ambientes, chegamos na raiz do problema: a obtenção do term store. Veja que no código estamos dizendo, na linha 5, para recuperar o term store padrão do site collection. Há uma outra forma de obter o term store, através do seu nome, mas havíamos decidido usar o padrão pois foi um código de exemplo que encontramos e funcionou!

A diferença dos ambientes foi uma configuração no serviço de termos:


Após selecionar a opção "This service is the default storage location for column specific term sets" nas propriedades do serviço, a solução começou a funcionar no ambiente de testes! Dessa maneira, há um term storage a ser usado no momento da chamada do método getDefaultSiteCollectionTermStore, cuja ausência aparentemente era a causa do problema.

Isso depois foi formalizado com o cliente, para que no ambiente de produção não haja esse tipo de erro.

[]'s