none
Epopéia: eu, meu site e meu blog RRS feed

  • Pergunta

  • Muito otimista com os avanços que fiz no SharePoint, tentei hoje mais uma façanha que, como vão perceber, falhou.

    Aparentemente é muito simples, mas como pode ser a duvida de outros novos sharepointers como eu, decidi lançar a  questão aqui.

    Tenho meus posts em um blog e quero mostrar apenas uma parte dos 2 primeiros na home do meu site. Ja os mostro inteiros, a consulta no blog é feita, tenho o retorno do post, filtro só o que quero e lanço na home. Tudo isso ja funciona que é uma beleza.

    Agora eu quero diminuir o espaço ocupado por esses posts na home colocando apenas uma parte de cada. Minha duvida é:

    Após receber o conteúdo da coluna Body do meu post como fazer para retirar dela uma parte do texto que faça sentido, tentei algumas lógicas com String.Split mas fica dificil pq a consulta vem em HTML : div, P, href.... tudo que pode ter em um post, daí sempre corto o fim de uma tag e ela acaba aparecendo como texto na home.

    Obrigado pela ajuda,

    Eduardo Araújo

    segunda-feira, 9 de agosto de 2010 22:38

Respostas

  • Eduardo,

    Para fazer isso, eu pegaria o seu código e faria o seguinte:

     

     var dc = new SPLinqDataContext(SiteUrl);

                //Capturo a Lista Posts que está mapeada na Classe SPLinq.cs
                //Lista que vai armazenar os posts já filtrados com apenas as informações relevantes
                var postagens = (from p in dc.GetList<Post>("Posts")
                                 select new
                                 {
                                     p.Id,
                                     p.Title,
                                     p.Body,
                                     p.Published

                                 }).Reverse().Take(2).ToList();
     
               
                try
                {
                    for (int i = 1; i <= 2; i++)
                    {

                        ((HyperLink)this.FindControl("HyperLinkTitulo" + i)).Text = postagens[i - 1].Title.ToString();

                                         

                        ((Literal)this.FindControl("Literal" + i)).Text = postagens[i - 1].Body;
     

                        ((Label)this.FindControl("labelData" + i)).Text = postagens[i - 1].Published.Value.ToShortDateString();
                        
                        ((HyperLink)this.FindControl("HyperLinkTitulo" + i)).NavigateUrl = 
                                                                                         ((HyperLink)this.FindControl("HyperLinkLeiaMais" + i)).NavigateUrl =
                                                                                         "http://shdevelopment/blog/Lists/Posts/Post.aspx?ID=" + postagens[i - 1].Id;

                    }
                }
                catch (ArgumentOutOfRangeException)
                {

                    Response.Redirect(SiteUrl);
                }
                catch (Exception)
                {
                    Response.Redirect(SiteUrl);
                }

            }

          // AQUI ENTRA O BODY

     

    Abraços

    Rodrigo A. Romano
    -
    SharePoint Specialist
    Microsoft MCP e MCTS
    -

    http://rodrigo-romano.spaces.live.com
    http://www.canalsharepoint.com.br

    http://www.doneit.com.br

     


    Rodrigo A. Romano 

    • Marcado como Resposta Eduardo Araújo terça-feira, 10 de agosto de 2010 02:08
    terça-feira, 10 de agosto de 2010 00:39
    Moderador
  • Entendi, você desenvolveu sua própria WebPart?

    Então faça o seguinte:

    http://www.canalsharepoint.com.br/thiagosilva/Lists/Postagens/Post.aspx?ID=13

    Using (SPSite site = new SPSite("URLDoSeuSite"))
    {
    using (SPWeb web = site.OpenWeb())
    {
    SPLista lista = web.Lists["SuaLista"];
    SPListItem item = lista.GetItemById(ID do seu item);
    SPFieldMultiLineText spcorpo = (SPFieldMultiLineText)item.Fields[“Corpo”]; 
    
    string corpo = spcorpo.GetFieldValueAsText(ListItem[“Corpo”]);
    
    }
    }

    Thiago Silva SharePoint Specialist - Done IT http://www.doneit.com.br http://www.canalsharepoint.com.br
    • Marcado como Resposta Eduardo Araújo terça-feira, 10 de agosto de 2010 03:17
    terça-feira, 10 de agosto de 2010 00:47
  • Eduardo,

    Para pegar apenas uma parte, você pode usar a sugestão do Thiago Silva, fazer um Substring.

     

      ((Literal)this.FindControl("Literal" + i)).Text = postagens[i - 1].Body.Substring(0, 500);

     

    No caso acima, os 500 primeiros caracteres

     

    Abraços

    Rodrigo A. Romano
    -
    SharePoint Specialist
    Microsoft MCP e MCTS
    -

    http://rodrigo-romano.spaces.live.com
    http://www.canalsharepoint.com.br

    http://www.doneit.com.br

     


    Rodrigo A. Romano 

    • Marcado como Resposta Eduardo Araújo terça-feira, 10 de agosto de 2010 03:18
    terça-feira, 10 de agosto de 2010 02:22
    Moderador

Todas as Respostas

  • Olá Eduardo,

    tudo bem?

    Use o SharePoint Designer para fazer isso. Abra a página que deseja, clique com o botão direito em cima da webpart de posts e escolha, editar em XSLT.

    Depois disso, clique em cima da parte onde o Body é renderizado. Veja no código que há algo como:

    <xsl:value-of select="substring(string(@Body), 1, 200)" disable-output-escaping="yes" />...

    Veja que acima eu já coloquei o substring, e estou mostrando os 200 primeiros caracteres. Original é assim:

    <xsl:value-of select="@Body" disable-output-escaping="yes" />...

    Espero ter ajudado!


    Thiago Silva SharePoint Specialist - Done IT http://www.doneit.com.br http://www.canalsharepoint.com.br
    segunda-feira, 9 de agosto de 2010 23:19
  • Thiago,

    Tudo bem obrigado.

    Eu não tenho o SPDesgner aqui agora ( estou na facul), mas tenho o meu código e assim de primeira eu acho que terei problemas em fazer isso, pq eu pego o conteúdo do Body e jogo em um Literal e é ele quem é renderizado na WebPart. Segue o código:

     Ignore os Catchs, ainda não criei uma classe para tratar isso.

    var dc = new SPLinqDataContext(SiteUrl);

                //Capturo a Lista Posts que está mapeada na Classe SPLinq.cs
                //Lista que vai armazenar os posts já filtrados com apenas as informações relevantes
                var postagens = (from p in dc.GetList<Post>("Posts")
                                 where p.Id.Value > dc.GetList<Post>("Posts").Count<Post>() - 2
                                 select new
                                 {
                                     p.Id,
                                     p.Title,
                                     p.Body,
                                     p.Published

                                 }).Reverse().ToList();

               
                try
                {
                    for (int i = 1; i <= 2; i++)
                    {

                        ((HyperLink)this.FindControl("HyperLinkTitulo" + i)).Text = postagens[i - 1].Title.ToString();

                                         
               // AQUI ENTRA O BODY

                        ((Literal)this.FindControl("Literal" + i)).Text = postagens[i - 1].Body;
     

                        ((Label)this.FindControl("labelData" + i)).Text = postagens[i - 1].Published.Value.ToShortDateString();
                        
                        ((HyperLink)this.FindControl("HyperLinkTitulo" + i)).NavigateUrl = 
                                                                                         ((HyperLink)this.FindControl("HyperLinkLeiaMais" + i)).NavigateUrl =
                                                                                         "http://shdevelopment/blog/Lists/Posts/Post.aspx?ID=" + postagens[i - 1].Id;

                    }
                }
                catch (ArgumentOutOfRangeException)
                {

                    Response.Redirect(SiteUrl);
                }
                catch (Exception)
                {
                    Response.Redirect(SiteUrl);
                }

            }

     O que acontece é que preciso mostrar apenas essas informações dos 2 últimos posts do blog.

    Será que com essa implementação eu consigo fazer o que vc disse?

    Obrigado pela ajuda.

    Eduardo Araújo

    segunda-feira, 9 de agosto de 2010 23:42
  • Eduardo,

    Para fazer isso, eu pegaria o seu código e faria o seguinte:

     

     var dc = new SPLinqDataContext(SiteUrl);

                //Capturo a Lista Posts que está mapeada na Classe SPLinq.cs
                //Lista que vai armazenar os posts já filtrados com apenas as informações relevantes
                var postagens = (from p in dc.GetList<Post>("Posts")
                                 select new
                                 {
                                     p.Id,
                                     p.Title,
                                     p.Body,
                                     p.Published

                                 }).Reverse().Take(2).ToList();
     
               
                try
                {
                    for (int i = 1; i <= 2; i++)
                    {

                        ((HyperLink)this.FindControl("HyperLinkTitulo" + i)).Text = postagens[i - 1].Title.ToString();

                                         

                        ((Literal)this.FindControl("Literal" + i)).Text = postagens[i - 1].Body;
     

                        ((Label)this.FindControl("labelData" + i)).Text = postagens[i - 1].Published.Value.ToShortDateString();
                        
                        ((HyperLink)this.FindControl("HyperLinkTitulo" + i)).NavigateUrl = 
                                                                                         ((HyperLink)this.FindControl("HyperLinkLeiaMais" + i)).NavigateUrl =
                                                                                         "http://shdevelopment/blog/Lists/Posts/Post.aspx?ID=" + postagens[i - 1].Id;

                    }
                }
                catch (ArgumentOutOfRangeException)
                {

                    Response.Redirect(SiteUrl);
                }
                catch (Exception)
                {
                    Response.Redirect(SiteUrl);
                }

            }

          // AQUI ENTRA O BODY

     

    Abraços

    Rodrigo A. Romano
    -
    SharePoint Specialist
    Microsoft MCP e MCTS
    -

    http://rodrigo-romano.spaces.live.com
    http://www.canalsharepoint.com.br

    http://www.doneit.com.br

     


    Rodrigo A. Romano 

    • Marcado como Resposta Eduardo Araújo terça-feira, 10 de agosto de 2010 02:08
    terça-feira, 10 de agosto de 2010 00:39
    Moderador
  • Entendi, você desenvolveu sua própria WebPart?

    Então faça o seguinte:

    http://www.canalsharepoint.com.br/thiagosilva/Lists/Postagens/Post.aspx?ID=13

    Using (SPSite site = new SPSite("URLDoSeuSite"))
    {
    using (SPWeb web = site.OpenWeb())
    {
    SPLista lista = web.Lists["SuaLista"];
    SPListItem item = lista.GetItemById(ID do seu item);
    SPFieldMultiLineText spcorpo = (SPFieldMultiLineText)item.Fields[“Corpo”]; 
    
    string corpo = spcorpo.GetFieldValueAsText(ListItem[“Corpo”]);
    
    }
    }

    Thiago Silva SharePoint Specialist - Done IT http://www.doneit.com.br http://www.canalsharepoint.com.br
    • Marcado como Resposta Eduardo Araújo terça-feira, 10 de agosto de 2010 03:17
    terça-feira, 10 de agosto de 2010 00:47
  • Rodrigo,

    Legal o Take(2), economiza a clausula where na consulta ^^. Esse LINQ é bom demais!

    Mas ainda fico na questão de pegar apenas uma parte do Body, um resumo do body.

    Mas valeu pela dica da consulta, ja alterei o meu código nesse ponto e achei mais clean.

    Muito Obrigado,

     

    Eduardo

    terça-feira, 10 de agosto de 2010 02:07
  • Eduardo,

    Para pegar apenas uma parte, você pode usar a sugestão do Thiago Silva, fazer um Substring.

     

      ((Literal)this.FindControl("Literal" + i)).Text = postagens[i - 1].Body.Substring(0, 500);

     

    No caso acima, os 500 primeiros caracteres

     

    Abraços

    Rodrigo A. Romano
    -
    SharePoint Specialist
    Microsoft MCP e MCTS
    -

    http://rodrigo-romano.spaces.live.com
    http://www.canalsharepoint.com.br

    http://www.doneit.com.br

     


    Rodrigo A. Romano 

    • Marcado como Resposta Eduardo Araújo terça-feira, 10 de agosto de 2010 03:18
    terça-feira, 10 de agosto de 2010 02:22
    Moderador
  • Thiago,

    Vc pode me dizer em que parte do código que passei entraria esse bloco? Eu tentei aqui e ele já chama exceção antes do :

    string corpo = spcorpo.GetFieldValueAsText(ListItem[“Corpo”]);

    Estou tentando usá-lo depois da minha consulta linq, ou seja, ja no FOR onde atribuo as informações para os componentes.

    Obrigado,

    Eduardo

    terça-feira, 10 de agosto de 2010 14:12
  • Oi Rodrigo,

    Se eu pegar a substring direto do que vem no Body, o HTML tbm vem quebrado e isso dá um monte de xabu, rsrs.

    O esquema, pelo oq to vendo é trazer o conteúdo literal do Body, do jeito que o Thiago falou e depois usar a substring e dai mudar o componente que recebe o body, não iria precisar mais de um Literal.

    Obrigado pela ajuda de vcs,

     

    Eduardo

     

    terça-feira, 10 de agosto de 2010 14:16
  • Achei uma soluça simples que me ajudou:

    string texto = Regex.Replace(text, @"<(.|\n)*?>"string.Empty);

    Agora com o conteúdo de texto eu faço o que preciso, seja com split ou outras expressões regulares.

    Obrigado gente,

    Eduardo.

    terça-feira, 10 de agosto de 2010 16:13