Rodrigo Romano – MVP SharePoint Server

Registros de um Especialista SharePoint :)

Posts Tagged ‘Desenvolvimento

SharePoint Apps: Como utilizar o People Picker?

leave a comment »


Olá SharePointers,

Hoje vou falar sobre como utilizar o People Picker quando estamos desenvolvendo uma app para SharePoint.

O primeiro passo, é carregar os scripts que serão utilizados (ver imagem abaixo) e colocar a div quer será utilizada para criação do controle dinamicamente.

image

 

Após a criação dos controles acima, basta colocar o código abaixo em um arquivo .js e adicioná-lo a página como referência que o People Picker funcionará perfeitamente.

 

// Run your custom code when the DOM is ready. $(document).ready(function () { // Specify the unique ID of the DOM element where the // picker will render. initializePeoplePicker('peoplePickerDiv'); }); // Render and initialize the client-side People Picker. function initializePeoplePicker(peoplePickerElementId) { // Create a schema to store picker properties, and set the properties. var schema = {}; schema['PrincipalAccountType'] = 'User,DL,SecGroup,SPGroup'; schema['SearchPrincipalSource'] = 15; schema['ResolvePrincipalSource'] = 15; schema['AllowMultipleValues'] = true; schema['MaximumEntitySuggestions'] = 50; schema['Width'] = '280px'; // Render and initialize the picker. // Pass the ID of the DOM element that contains the picker, an array of initial // PickerEntity objects to set the picker value, and a schema that defines // picker properties. this.SPClientPeoplePicker_InitStandaloneControlWrapper(peoplePickerElementId, null, schema); } // Query the picker for user information. function getUserInfo() { // Get the people picker object from the page. var peoplePicker = this.SPClientPeoplePicker.SPClientPeoplePickerDict.peoplePickerDiv_TopSpan; // Get information about all users. var users = peoplePicker.GetAllUserInfo(); var userInfo = ''; for (var i = 0; i < users.length; i++) { var user = users[i]; for (var userProperty in user) { userInfo += userProperty + ': ' + user[userProperty] + '<br>'; } } $('#resolvedUsers').html(userInfo); // Get user keys. var keys = peoplePicker.GetAllUserKeys(); $('#userKeys').html(keys); // Get the first user's ID by using the login name. getUserId(users[0].Key); } // Get the user ID. function getUserId(loginName) { var context = new SP.ClientContext.get_current(); this.user = context.get_web().ensureUser(loginName); context.load(this.user); context.executeQueryAsync( Function.createDelegate(null, ensureUserSuccess), Function.createDelegate(null, onFail) ); } function ensureUserSuccess() { $('#userId').html(this.user.get_id()); } function onFail(sender, args) { alert('Query failed. Error: ' + args.get_message()); }

Bem simples, não acharam?

 

Abraços! 😀

 

Referência

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

Advertisements

Written by Rodrigo Romano

August 11, 2014 at 9:47 am

SharePoint e Javascript – Amor ou ódio?

leave a comment »


Olá SharePointers,

Javascript e suas bibliotecas assumem um papel cada vez mais relevante na vida de um desenvolvedor moderno. É comum encontrar pessoas que digam que atualmente é uma das “linguagens” mais importantes para um desenvolvedor de SharePoint. Sei que esse ponto é controverso, mas esse é um tema que está cada vez mais presente no nosso dia-a-dia.

Notamos que a Microsoft fez um grande esforço para “mudar” um pouco a nossa cabeça e colocou no SharePoint 2013 o conceito de Apps, que, de uma forma bem simplista, é HTML e JavaScript.

Para quem ainda não está familiarizado, David Mann (SharePoint MVP – EUA) fez um curso muito interessante no Pluralsight: http://pluralsight.com/training/Courses/TableOfContents/developing-sharepoint-2013-javascript.

O SharePoint contém uma quantidade enorme de funções prontas que podem ser reutilizadas para nos ajudar durante o desenvolvimento de alguma solução. Algumas delas não estão documentadas no MSDN.

Para ajudar no desenvolvimento, existem alguns plugins para o Visual Studio. Dentre eles, recomendo esse aqui: http://visualstudiogallery.msdn.microsoft.com/288a2b0f-1357-47b4-8215-1134c36bdf30

Voltando ao código, vou citar algumas funções que podem ajudar bastante no desenvolvimento e não estão documentadas em lugar nenhum:

  • url = SP.Utilities.UrlBuilder.replaceOrAddQueryString(url, key, value): Esse método recebe uma URL e modifica ou inclui um parâmetro na QueryStrig. O Retoro é a URL modificada.
  • url = SP.Utilities.UrlBuilder.removeQueryString(url, key): Esse método remove um parâmetro da query string (e seu valor) de uma URL.
  • url = SP.Utilities.UrlBuilder.urlCombine(url1, url2): Combina duas URLs e garante que não tenha nenhuma “/” redundante.

 

O ideal, antes de sair desenvolvendo, é pensar se o que precisamos fazer não existe no SharePoint. E, se existir, tentar entender como ele realiza tal operação e fazermos do mesmo jeito.

Referências Adicionais

http://msdn.microsoft.com/en-us/library/office/ee549589(v=office.14).aspx

http://chuvash.eu/2012/01/24/parameterize-an-javascript-object-and-create-url/

http://www.wictorwilen.se/Post/Working-with-URLs-in-SharePoint-2010-JavaScripts.aspx

 

Abraços!

Written by Rodrigo Romano

July 11, 2014 at 9:32 am

SPSiteDataQuery–Nenhum item é retornado

leave a comment »


Olá SharePointers,

Em um projeto fomos utilizar o SPSiteDataQuery para fazer queries mais performáticas no SharePoint (Seguindo esse artigo do Thiago Silva: http://thiagottss.com.br/2012/04/20/executando-queries-de-alta-performance-com-spsitedataquery/) e no nosso ambiente de homologação tudo funcionava.

 

Quando fazíamos o deploy no ambiente de produção, a query não funcionava e retornava 0 itens mesmo sabendo que teria itens que atendiam a condição especificada.

 

O que acontece é que se alguma coluna especificada no ViewFields for nula, o SharePoint aborta o processamento e retorna 0 itens.

Exemplo:

Abaixo temos uma lista de Usuário que contém 2 campos: Título e E-mail. Mesmo os 2 primeiros itens tendo todos os dados preenchidos, não são retornados por causa do terceiro.

User A; user_a@domain.com

User B; user_b@domain.com

User C;

 

Para resolver isso, precisamos colocar o parâmetro Nullable=’True’ , como abaixo:

query.ViewFields = "<FieldRef Name=’Email’ Nullable=’True’ />";

 

E pronto Alegre! Tudo funcionou como esperado.

 

Referência

http://www.mavention.nl/blog/spsitedataquery-not-returning-any-data

Written by Rodrigo Romano

January 25, 2014 at 8:43 pm

QuickTip: Como adicionar itens no Site Settings do SharePoint

with 3 comments


Olá SharePointers,

Hoje vou postar uma dica para ensinar como inserir uma Categoria e Links dentro do Site Settings, como na imagem abaixo.

image

 

Então, mãos à obra!!

 

1 – Abra o Visual Studio

2 – Escolha um SharePoint Empty Project e dê um nome para ele. Após isso, clique em OK.

image

3 -  Com a Solution criada, clique com o botão direito no Projeto e vá em Add, New Item…

image

image

 

4 – Escolha Empty Element e dê um nome, e depois clique em Add.

image

 

5 – Coloque o texto abaixo e faça o deploy! Smiley de boca aberta

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomActionGroup
    Id="5363598A-9CC6-42ED-8C35-B6DAFFE76427"
    Title="Rodrigo Romano – Meus Links"
    Location="Microsoft.SharePoint.SiteSettings"
    Sequence="110"
    ImageUrl="_layouts/images/lg_icdotx.png"
    >    
  </CustomActionGroup>
 
  <CustomAction
    Id="A2C6049B-F561-4BDA-A37A-E30ED4C95223"
    Title="Meu Blog"
    Location="Microsoft.SharePoint.SiteSettings"
    GroupId="5363598A-9CC6-42ED-8C35-B6DAFFE76427"
    Sequence="120"
    RequireSiteAdministrator="FALSE">
    <UrlAction Url="http://rodrigoromano.net"/>
  </CustomAction>    
</Elements>

image

 

Entendendo as TAGs

A tag <CustomActionGroup> representa a Categoria. Dentro dela, a propriedade Id deve ser gerada utilizando uma ferramenta, como o “Create GUID” que vem junto com o Visual Studio.

A tag <CustomAction> representa os Links internos da categoria. A sua propriedade GroupId deve ser igual ao Id da CustomActionGroup para dizer que esse link ficará dentro daquela categoria. A mesma regra de formação do Id é válida.

 

Para baixar a solução, utilizem esse link: http://sdrv.ms/1aI6utX.

 

Para saber mais sobre os elementos acima, acessem:

Custom Action Group – http://msdn.microsoft.com/en-us/library/ms438085.aspx

Custom Action – http://msdn.microsoft.com/en-us/library/ms460194.aspx

 

Obs: Esse post foi uma dica dada pelo Thiago Silva (http://thiagottss.com.br/). Man, OBRIGADO! Smiley de boca aberta

 

Abraços!

Written by Rodrigo Romano

January 16, 2014 at 2:40 pm

SharePoint 2013: Licenciamento de uma App

with 2 comments


Olá SharePointers,

Quando a versão nova do SharePoint 2013 foi lançada, muito se especulou sobre o modelo de licenciamento para Apps e como isso funcionaria, entreanto, após tanto tempo (estamos quase no SP1 do SharePoint 2013) pouco vejo falar sobre o assunto.

Em 2012, fiz uma apresentação para um evento no Senac São José dos Campos com vários profissionais renomados no mercado (http://pt.slideshare.net/rodrigoromano/mudanas-no-desenvolvimento-com-sharepoint-2013) e falei um pouco sobre o assunto.

Pensando na falta de conteúdo sobre o assunto, pensei em escrever um post.

 

Aquisição de Licenças

Ao comprar um App, a licença é enviada para o SharePoint em forma de um token. Esse token contém as informações básicas sobre a licença, tais como: data/hora da aquisição, quantas licenças foram adquiridas e etc.

Essas licenças podem ser por usuário ou por aplicativo.

 

image

OBS: O mais importante é entender que é necessário garantir a aplicação da licença via CÓDIGO customizado.

Sendo assim, o SharePoint fornece as APIs para buscar o Token de licenciamento na Store, validá-lo e tomar alguma ação no aplicativo baseado no resultado dessa validação. Dessa forma, o SharePoint provê uma funcionalidade extensível que atenda qualquer caso mais específico de uma App customizada.

 

image

 

 

 

Resumindo…

O SharePoint fornece toda a infraestrutura da App Store, permitindo a venda (gratuita ou paga) das Apps. Além disso, fornece o mecanismo para aquisição e gerenciamento das licenças, bem como WebService para validação de uma licença.

O único trabalho do desenvolvedor, nesse caso, é fazer a chamada ao Web Service, validar a licença obtida e tomar alguma ação baseada em seu resultado.

Simples, não?

SharePoint sempre pensando em nossa produtividade Smiley de boca aberta

 

Referências

(As imagens foram retiradas do link abaixo).

http://blogs.msdn.com/b/officeapps/archive/2012/11/09/licensing-your-apps-for-sharepoint.aspx

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

Written by Rodrigo Romano

January 14, 2014 at 8:04 pm

CodePlex: Trocar senha do usuário do AD–SharePoint 2010 e SharePoint 2013

with one comment


Olá SharePointers,

Compartilhei uma funcionalidade que permite ao usuário alterar sua própria senha do AD, através do SharePoint.

É uma primeira versão funcional, mas ainda pode ter várias alterações para atender os diversos ambientes existentes.

https://passwordchangesp.codeplex.com/

O processo é bem simples:

1 – Escolha a opção Alterar Senha

alterarSenha001

2 – Digite as informações solicitadas: Senha Anterior e nova Senha e clique no botão Alterar Senha.

alterarSenha002

 

 

Contribuições serão MUITO bem vindas Smiley de boca aberta

 

Abraços!

Written by Rodrigo Romano

January 13, 2014 at 9:25 am

Regular TimerJob e Work Item TimerJobs

leave a comment »


Olá SharePointers,

Com o natal chegando, festas, fim de ano e toda a correria já esperada do final de ano, vou fazer provavelmente o meu último post desse ano.

Em uma discussão no grupo de SharePointers dentro do Facebook (https://www.facebook.com/groups/sharepointers/) uma das sugestões – de um amigo Reynaldo Souza – foi falar sobre a diferença de Regular Timer Job e Work Item Timer Jobs.

Já fiz, no passado, um post falando sobre TimerJobs Criando Custom Timer Jobs no SharePoint.

Resumidamente, TimerJob é uma forma de realizar atividades em “lote”, de forma agendada, baseada em alguma recorrência. Como o processo não roda através do IIS (w3wp), não existe os problemas comuns de Timeout de operações que temos ao executar operações longas.

A grande diferença do Work Item TimerJob em relação ao TimerJob normal, é que elé já contém uma infraestrutura prevista para o processamento de itens em lote, inclusive inclui até mesmo a funcionalidade de Pausa durante o processamento (Fantástico!).

 

O que muita gente não sabe é que esse tipo de TimerJob já estava presente desde a versão 2007 do SharePoint (WSS 3.0) e ele é a maneira “correta” do SharePoint processar itens em lote sem gerar trabalhos adicionais para os desenvolvedores… (Adoro essa plataforma!)

Sendo assim, o foco do desenvolvedor é apenas processar o item e não gerar um mecanismo de fila de processamento, com listas adicionais e seja lá mais for necessário para a sua regra de negócio.

Abaixo, segue alguma referências de blogs que dão mais detalhes sobre o assunto e até mostram como criar e utilizar esse recurso:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spworkitemjobdefinition.aspx

http://blogs.technet.com/b/stefan_gossner/archive/2011/11/17/sharepoint-variations-the-complete-guide-part-4-timer-jobs.aspx

http://blog.mastykarz.nl/processing-items-work-item-timer-jobs-sharepoint-2010/

 

Pessoal, feliz natal e um ótimo ano novo a todos! Smiley de boca aberta

Abraços!

Written by Rodrigo Romano

December 23, 2013 at 10:46 am