quarta-feira, 13 de novembro de 2013

Como salvar um formulário InfoPath em uma subpasta de uma biblioteca SharePoint

Recentemente precisei salvar um formulário InfoPath 2007 ( :-P ) no seu local original, que era uma subpasta em uma biblioteca de formulários em um SharePoint (2007 tb, :-P ). Como o nome da pasta era gerada dinamicamente no momento da criação do formulário, baseado em um dado que não está presente no mesmo, não há como (pelo menos eu não consegui) criar uma conexão de dados para submeter o formulário para seu local de armazenamento.

A única solução que encontrei foi criar um campo no formulário que armazenasse sua URL, de forma a usar este valor na hora de salvar o formulário. Mas como o formulário está rodando no SharePoint, e é um item de uma lista, o modelo de objetos server do SharePoint está disponível no code-behind do formulário. Usando SPWeb.GetListItem() para acessar o item da lista correspondente ao formulário, as propriedades deste item fornecem a URL do formulário no SharePoint.

     public void FormEvents_Submit(object sender, SubmitEventArgs e)
     {
         // Recupera referência ao formulário na biblioteca SharePoint baseado na sua URL
         SPListItem item = SPContext.Current.Web.GetListItem(this.Uri);
         // Salva o formulário. No código a seguir, a conexão gera o nome do arquivo, mas se o nome
         // deve ser gerado em run-time, pode ser setado através de FileSubmitConnection.FileName
         FileSubmitConnection conexaoSP = (FileSubmitConnection)this.DataConnections["SalvarArquivo"];
         conexaoSP.FolderUrl = item.Web.Url + item.File.ParentFolder.ServerRelativeUrl;
         conexaoSP.Execute();
         e.CancelableArgs.Cancel = false; // Informa o InfoPath que o submit foi ok
     }