Sharepoint.Dev() Just another SharePoint weblog

9Feb/100

Biblioteca de WebParts – dotDEV

Depois de mais uns tempos conturbados eis-me aqui novamente atualizando o blog. E mais uma vez com notícias boas também.
Além de estar preparando um post sobre como usar LINQ para buscar e trabalhar as informações do SharePoint eu estou planejando também uma área onde armazenarei algumas WebParts que já tive situações em que tive que desenvolve-las e outras WP que surgiram na minha cabeça numa ou outra hora qualquer.

Só preciso organizá-las, gerar os pacotes de instalação para disponibiliza-las aqui no site. Ainda dando continuidade à idéia de difundir mais o SharePoint, principalmente detalhes técnicos, estas WebParts ficarão disponíveis para download.

De qualquer forma estou a disposição caso queiram se adiantar antes dessa seção nova. Basta entrar em contato comigo pelo email filipe.cavalcante@dotdev.com.br ou filipe.cavalcante@gmail.com!

Aguardem mais atualizações!

18Nov/090

Estamos de volta… e com novidades.

Olá pessoal,

Faz um bom tempo que não mexia no meu blog. Eu havia migrado para este novo servidor, mas depois por um vacilo meu acabei apagando-o involuntariamente e depois fiquei com preguiça de reconfigurar, restaurar tudo de novo...
Mas enfim... o importante é que agora estamos de volta e com novidades.

Todos ja sabem que o Sharepoint 2010 está chegando né? Pois bem, algumas das pessoas que trabalham comigo foram na conferência em Las Vegas sobre o Sharepoint 2010 e em breve pretendo fazer alguns comentários sobre as novidades da nova versão.

Mas enquanto isso, vou deixar aqui um exemplo de código simples para fazer upload de documento para uma biblioteca de documentos do sharepoint com metadados

public static bool UploadDocumento(SPWeb web, string docLib, Documento documento, ParametrosList parametros, bool overwrite)
        {
            try
            {
                Hashtable docProperties = new Hashtable();
                // Metadados
                foreach (Parametros var in parametros)
                {
                    docProperties[var.Parametro] = var.Valor;
                }

                SPFolder folder = web.Folders[docLib];
                SPFile file = folder.Files.Add(documento.Nome, documento.FileBytes, docProperties ,overwrite);

                return true;
            }
            catch
            { return false; }
        }

Bem simples.

Nesse método existem dois objetos que eu criei na mão para auxiliar na passagem dos parametros para este método. O objeto 'Documento" basicamente carrega as informações vindas do componente FileUpload, e o objeto "ParametroList" é uma lista de parametros genérico que utilizo para o sistema todo, e conterão as informações dos metadados e seus respectivos valores.

Nesse exemplo não fiz tratamento de erro, simplesmente e retorna um BOOLEANO indicando se foi feito o upload corretamente na biblioteca de documento ou não.

Abraços

26Jun/081

Exibindo dados no SPGridView com grupos colapsados por default

Hoje me deparei com uma situação. Estamos desenvolvendo um tipo de um relatório e estamos usando o componente SPGridView (nativo do DLL do Sharepoint) e com esse componente é possivel agrupar por coluna. Então habilitamos o "AllowCollapseGroup" do SPGridView.
A questão é que, o relatório é extremamente extenso e todos os grupos são listados expandidos.
Como o relatório ficou bem extenso a visualização de todo ele ficou ruim, visto que pra enxergar o ultimo registro teria que rolar a página até o final, collapsar todos os grupos um a um... e por aí vai.
O componente SPGridView não tem uma propriedade pra marcar que faça com que os grupos apareçam collapsados por padrão mas para fazer isso acontecer, utilizamos o velho e bom JavaScript.

Utilizando o script abaixo, conseguimos fazer com que o evento de clique seja acionado assim que os dados do grid forem populados.

Se estiver usando WebUserControl, acrescente logo abaixo do componente se não estiver usando, faça executar este script logo depois de carregar o grid.

No caso de estar usando WSS/MOSS com o language pack em português, altere a linha:

 if (rows[i].firstChild.firstChild.title.toLowerCase() == "expand/collapse")

Para a linha:

 if(rows[i].firstChild.firstChild.title == "Expandir/Recolher)

Explicação: Existe uma função chamada "ToggleSPGridViewGroup" (que fica no arquivo "spgridview.js" na pasta Layouts) que é disparado sempre que clicado no ícone de expandir/recolher do grupo. Então, Robin Meuré pensou, "Porque não disparar esse evento em todos os grupos para que todos estejam recolhidos por default?".

E foi assim que surgiu este script.

Thanks Robin for helping me! :)

Segue o link do blog dele de referencia. http://glorix.blogspot.com/2007/08/spgridview-and-collapsed-grouping-by.html

21Jun/080

Usando SPAlert

Mais um post com dica de Sharepoint. Esses dias precisei usar a função "Alert me" em umas listas mas precisei implementar via código. A função é muito simples e usei o próprio SPAlert nativo do Sharepoint (Microsoft.Sharepoint.dll).

Para isso, eu criei um método que retorna um valor booleano quando criar ou não (por algum motivo) o alerta.

public bool AlertME(string urlSITE, string TituloAlerta, SPListItem itemAlerta)
{
   try
   {
      using (SPSite site = new SPSite(urlSITE))
      {
         SPWeb web = site.OpenWeb();
         SPUser userLogged = web.SiteUsers.GetByID(SPContext.Current.Web.CurrentUser.ID);
         SPAlert _alert = userLogged.Alerts.Add();
         _alert.AlertType = SPAlertType.Item;
         _alert.AlertFrequency = SPAlertFrequency.Immediate;
         _alert.EventType = SPEventType.All;
         _alert.AlwaysNotify = true;
         _alert.Title = TituloAlerta;
         _alert.Item = itemAlerta;
         _alert.Update(true);
        return true;
      }
   }
   catch
   {
        return false;
   }
}

A função é simples. Quando clicar em um botão que eu criei, esse método será acionado tendo como parametro uma string com o endereço do site onde o alerta será criado, uma string com o título do alerta e um SPListItem que é o item que será "alertado".

O que eu defini para meu alerta:

SPAlertType.Item = significa que o alerta está associado à um item;

SPAlertFrequency.Immediate = significa que o alerta será enviado imediatamente assim que o item da lista for alterado e salvo;

SPEventType.All = o alerta será enviado para qualquer ação que seja feita no item da lista;

Aguardem mais dicas!

:D

EDIT: Segue link de referência Microsoft.Sharepoint.SPAlert Class

5Dec/070

Discussion Board customizado via Web Part

IPra uma pessoa que nunca viu Sharepoint e trabalha a pouco mais de 2 meses com isso até que estou aprendendo bem... claro também se não fosse o auxilio que venho tendo lá na empresa. Esses dias eu tive que fazer uma customização no fórum de discussão que tem no projeto do cliente.

É, o layout é personalizado, e com isso algumas áreas padrões do sharepoint, como o conteúdo de criação de novo post ou resposta à um tópico, ficaram fora de contexto, com tamanhos desproporcionais que "estragavam" o layout do site. Por isso então que tivemos que personalizá-lo. Mas aí veio a pergunta... se o fórum é um componente padrão do sharepoint e funciona "internamente", como eu poderia fazer para criar um item novo na lista? Bom, a resposta até que viria rápida... mas depois me compliquei.

Simplesmente abri a lista numa webpart em C# e depois fiz um método para salvar os campos assunto e mensagem nas colunas relacionadas. Porém a sequencia que foi mais chata de entender.

"Como eu vou fazer para salvar as respostas se não há colunas respostas?"

Sorte que a Microsoft também pensou nisso. E mais uma vez, na referencia Microsoft.Sharepoint.dll existe a solução.

Existem dois métodos chamados CreateNewDiscussion() e CreateNewDiscussionReply(). Haaaa assim ficou fácil. hehe

Segue o trecho do código dos métodos que cria e depois responde o post.

protected void CriarNovoPost()
{
            SPWeb web = SPControl.GetContextWeb(this.Context);
            try
            {
                      SPList lstForum = web.GetList(web.Url + "/Lists/Forum/");
                      SPListItem post = SPUtility.CreateNewDiscussion(lstForum.Items, this.txtAssunto.Text);
                      post[SPBuiltInFieldId.Body] = this.txtMensagem.Text;
                     post.Update();
                    newPost = true;
            }
           catch (Exception ex)
           {
                    newPost = false;
                    throw ex;
            }
}

E abaixo o método que cria a resposta no post. Utilizando também o método da referencia do Sharepoint.

protected void ResponderPergunta(SPListItem _parentListItem){
            SPListItem reply = SPUtility.CreateNewDiscussionReply(_parentListItem);
            reply[SPBuiltInFieldId.Body] = this.txtMensagem.Text;
            reply.Update();Â
            boolReply = true;
}

 Â
Espero que ajude quem mais possa precisar!

6Nov/071

Web Part de uma Image Library – Sharepoint

Eu comecei recentemente a trabalhar também com Microsoft Sharepoint (pra quem não conhece vale a pena dar uma olhada no site da Microsoft pra conhecer), e como com todas as ferramentas que não conheço, sempre apanho no começo pra conseguir fazer alguma coisa funcionar.

Uma das características bem interessantes do Sharepoint, é que você pode desenvolver as chamadas "web parts" no visual studio e integrá-lo ao seu site. É nisso basicamente que estou trabalhando atualmente, além de ter entrado no mundo dos programadores .NET C# eu também entrei para o mundo dos "Sharepointer's".

Bom, vou então ao que interessa. Como disse, apanhei pra caramba pra desenvolver uma web part onde eu tenho uma biblioteca de imagens e eu precisaria personalizar de uma forma, que as opções do Sharepoint não me davam, numa área pequena da página. Então eu fiz uma busca imensa pela internet sobre algum site que desse uma sugestão de como fazer isso... finalmente depois de tanto suor achei em um outro blog (Share the Learning) algumas dicas relacionadas. Então resolvi mandar um email para eles sobre minha dúvida. Gary Payne me respondeu sugerindo a classe SPPictureLibrary

Show de bola, o método da web part que desenvolvi ficou assim:

protected void ListarImagens()
{
try
{
using (SPSite spSITE = new SPSite(this.Page.Request.Url.ToString()))
{
SPWeb spWEB = spSITE.OpenWeb();
SPPictureLibrary ImageLibrary = (SPPictureLibrary)spWEB.Lists["Bottons"];
SPQuery spQUERY = new SPQuery();
spQUERY.Query = "";
SPListItemCollection lstIMAGE = ImageLibrary.GetItems(spQUERY);
int i = 0;
foreach (SPListItem item in lstIMAGE)
{
if (i < 2)
{
Literal ltrimagem = new Literal();
ltrImage.text = "<img src="item['Nome']" style="'Float:left;">";
Controls.Add(ltrimagem);
}
i++;
}
}
}
catch (Exception ex)
{
throw ex;
}
}

Isso é uma parte só do código, ainda tem outras coisas, mas dessa forma eu peguei a Image Library que criei com as imagens e assim consegui personaliza-la no site.

Deixo aqui essa dica pra quem precisar um dia também. Sharepoint ainda é novo e por isso tem pouquissimos sites e foruns falando sobre isso.