Sharepoint.Dev() Just another SharePoint weblog

27Jul/100

Buscar Informações do AD para Web Parts, sem utilizar SSP

Como já perceberam eu ando bem afastado do blog, faz tempo que não o atualizo e compartilho mais de minhas experiências em projetos... desculpe-me mas estou realmente complicado de tempo e assuntos pessoais a tratar.

Pois bem, mas não esqueci de vocês não e por isso vou deixar aqui uma dica bem interessante sobre como trabalhar com Informações do AD sem utilizar o SSP.

O texto é do meu amigo Marcelo Leite e pode ser lido neste link: Buscar Informações do AD para Web Parts, sem utilizar SSP !!

Abraços!

:)

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!

23Nov/090

Cancelar Workflow via programação

No último projeto tivemos que dar a possibilidade para o usuário encerrar o andamento do fluxo manualmente. Para isso um método foi criado:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
    using (SPSite site = new SPSite(siteID))
    {
          using (SPWeb web = new SPWeb(relativeWeb))
         {
              SPWorkflowManager manager = site.WorkflowManager;
              SPListItem item = web.Lists[listname].GetItemByID(itemID);
              foreach(SPWorkflow workflow in manager.GetItemActiveWorkflows(item))
              {
                       SPWorkflowManager.CancelWorkflow(workflow);
              }
          }
    }
});

Detalhe para o "SPSecurity.RunWithElevatedPrivileges()" que faz com que o código possa ser executado por qualquer usuário que esteja logado.

O código que está no nosso projeto não é exatamente este, não coloquei algumas ações específicas do nosso projeto, mas basicamente para encerrar o fluxo, que é o tema deste post é esse!

Até a próxima!

Referencia: http://pointstoshare.spaces.live.com/Blog/cns!AEC42F315B4528B0!3045.entry?sa=648616426

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

13Apr/090

Verificando se existe SPWeb

Segue um método simples e rápido que faz uma verificação se existe um SPWeb em um SPWebCollection()

private bool ChildWebExists(SPWeb parentWeb, string childWebName)
{
    using(SPweb childWeb = parentWeb.Webs[childWebName])
    {
      return childWeb.Exists;
    }
}
Filed under: Sharepoint, TI, WebPart No Comments
3Nov/081

Web Part de enquete!

Após um longo período sem publicar nada volto com uma dica muito bacana.

Já é "conhecido" pelos desenvolvedores SharePoint mas mesmo assim vale a dica novamente.

Precisei fazer no meu projeto atual uma web part de enquete mas o não conseguir configurar o "pesquisa" nativo do sharepoint com o formato de enquete padrão. Foi então que buscando na web eu encontrei o PollingWebPart.

Bom para instalar basta seguir os passos:

  • Baixar o "PollingWebPart.wsp" do link acima;
  • Para adicionar a web part execute o comando stsadm -o addsolution -filename PolligWebPart.wsp;
  • Fazer o deploy que pode ser feito pela Central Administração ou pela linha de comando também. Pela linha de comando execute: stsadm -o deploysolution -name PollingWebPart.wsp -immediate -allcontenturls;
  • Basta agora entrar na galeria de web parts, clicar em novo e procurar por "PhilWicklund.com.PollingWebPart.PollingWebPart" e clicar em Preencher Galera (Populate Galery)

Alguns detalhes que acho válido citar. Essa web part funciona tanto em wss 3.0 quando em MOSS 2007 seja em qual idioma for, porém a forma automática de criação da lista não funcionará corretamente se o site criado não estiver com idioma ingles. Mas se for criada manualmente o a web part funcionará perfeitamente.

Outro detalhe que vi no código fonte no site do desenvolvedor é que essa web part é controlada por cookie e o tempo de duração do cookie é de 2dias.

Até a próxima!

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.