Criar um Sistema RSS Através de uma Lista de Páginas 

Tags: SharePoint, SharePoint2010

IN Revista PROGRAMAR Edição 30 - Agosto de 2011

 

Introdução

 

Quem já utilizou as facilidades RSS do SharePoint certamen-te já se deparou com alguns problemas de configuração ao nível do output da informação que sai com RSS Standard, como por exemplo a designação dos campos e os longos caminhos que temos de utilizar do tipo:

_layouts/listfeed.aspx?List=ab4a2784-8309-4905-88be-71449afcd9a3&View=6db1464a-f5a1-43de-9526-dc94b064052e

Neste artigo vamos abordar uma forma simples e eficaz de através de RSS 2.0 fazer um "Response" directamente numa página ASPX com um Controlo de Utilizador

 

Estrutura XML RSS 2.0

 

<?xml version="1.0" encoding="UTF-8" ?>

<rss version="2.0">

<channel>

        <title>RSS Title</title>

        <description>This is an example of an RSS feed</description>

        <link>http://www.someexamplerssdomain.com/main.html</link>

        <lastBuildDate>Mon, 06 Sep 2010 00:01:00 +0000 </lastBuildDate>

        <pubDate>Mon, 06 Sep 2009 16:45:00 +0000 </pubDate>

 

        <item>

                <title>Example entry</title>

                <description>Here is some text containing an interesting description.</description>

                <link>http://www.wikipedia.org/</link>

                <guid>unique string per item</guid>

                <pubDate>Mon, 06 Sep 2009 16:45:00 +0000 </pubDate>

        </item>

 

</channel>

</rss>

 

Considerações Iniciais

 

A primeira consideração que temos de ter em atenção é que para efectuarmos o nosso response não podemos utilizar nenhum Layout de Página, temos de utilizar uma página que "saia" do SharePoint como acontece em todos os procedimentos deste tipo.

Neste exemplo vamos utiliza uma página ASPX e vamos adicionar um Controlo de Utilizador à mesma, visto a grande maioria das Aplicações SharePoint assentar em camadas, uma delas certamente a de estrutura do nosso site onde colocamos todas as nossas páginas ASPX, Controlos de Utilizador, Layouts e finalmente as nossas Features por for-ma a propagarmos a nossa estrutura na altura da Instalação do Portal activando-as.

Vamos separar o nosso CAML Query do método principal por forma a termos uma maior percepção do código.

 

Método CAML Query

 

Vamos criar um método Protected invocando o Object Model através do SPQuery.

  

protected SPQuery ONossoCamlQuery()
 {
     SPQuery qry =
new
SPQuery();
     qry.ViewAttributes +=
"Scope=\"Recursive\""
;

    
string
camlQry = String.Empty;
     qry.Query = camlQry;

 

O próximo passo, a nossa String para a Query. Neste passo temos de modificar ‘OSeuCampoData’ para o nome do cam-po que queremos filtrar, em que sugiro a utilização do CAML QUERY BUILDER

Deverá funcionar em ambos MOSS e SharePoint 2010, pelo me-nos para elaborarmos o nosso filtro.

 

     try
     {
         camlQry =
"<OrderBy><FieldRef Name='OSeuCampoData' Ascending='False' /></OrderBy>";
         qry.Query = camlQry;
     }
    
catch
(Exception)
     {
         
throw
;
    
}

 

Vamos deixar "Ascending=’False’" para ser apresentado por ordem decrescente.

Vamos limitar o nosso resultado a 10 páginas, caso contrário poderá ser lento e não funcionar correctamente visto que limitamos o nosso tempo limite de cache por forma a ser eficaz em todos os RSS Readers.

 

qry.RowLimit = 10;

 

O método completo:

 

protected SPQuery ONossoCamlQuery()
 {
     SPQuery qry =
new
SPQuery();
     qry.ViewAttributes +=
"Scope=\"Recursive\""
;

    
string
camlQry = String.Empty;
     qry.Query = camlQry;

    
try

     {
         camlQry =
"<OrderBy><FieldRef Name='OSeuCampoData' Ascending='False' /></OrderBy>";
         qry.Query = camlQry;
     }
    
catch
(Exception)
     {
        
throw
;
     }
     qry.RowLimit = 10;
    
return
qry;
 }

 

Limite de tempo de Cache

 

Primeiro vamos definir no ASPX do nosso controlo a duração do Cache de Saída, que será a duração permitida do Output-Cache por forma a não ficarmos com pedidos longos. Mais informação em ASP.NET Caching

 

<%@ OutputCache Duration="120" VaryByParam="*" %>

 

Método para construção do RSS

 

O método consiste em criarmos uma Response e dinamica-mente renderizar o XML Standard enumerando uma Lista de Páginas de SharePoint filtrado pelo nosso CAML Query

 

readonly string NossoUrlNivelRoot = String.Format("{0}//{1}:{2}", SPContext.Current.Site.Protocol, SPContext.Current.Site.HostName, SPContext.Current.Site.Port);

 

Vamos buscar o URL de Root dinamicamente:

Dentro do URL de Root vamos buscar a área onde está a lista de páginas, exemplo "Noticias"

 

string URL = NossoUrlNivelRoot + "/NossaAreaDentroDaRoot";

 

Limpamos a nossa Response e iniciamos uma nova baseada em XML.

 

Response.Clear();
Response.ContentType =
"text/xml";

 

Definir o encoding para UTF8 e começar a escrever o XML na página.

 

XmlTextWriter TextWriter = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
TextWriter.WriteStartDocument();

 

TAGS mandatórias RSS 2.0

 

TextWriter.WriteStartElement("rss");
TextWriter.WriteAttributeString(
"version", "2.0"
);

 

O Channel TAG que vai conter a informação do FEED crian-do o nosso nó XML "channel", dentro deste iremos criar a seguir outro nó chamado "item" com a informação das nossas páginas SharePoint.

 

TextWriter.WriteStartElement("channel");
TextWriter.WriteElementString(
"title", "JOAO TITO LIVIO"
);
TextWriter.WriteElementString(
"link", " http://msmvps.com/blogs/officept/default.aspx"
);
TextWriter.WriteElementString(
"description", "Espero que gostes deste RSS"
);
TextWriter.WriteElementString(
"copyright", "Copyright 2011 Joao Tito Livio. All rights reserved."
);

 

Abrir o nosso WEB usando o Object Model vamos utilizar Using por forma a não termos problemas de dispose dos objectos do SharePoint.

Abrir a nossa lista através do SPList e seguidamente enumerar as páginas através de uma SPListItemCollection. Nesta fase vamos chamar o nosso método em que definimos o nosso CAML Query. Vemos também que a nossa lista se chama "Pages", mude para "Paginas" ou o nome que deu à mesma.

 

SPList ListaDePaginas = web.Lists["Pages"];
SPListItemCollection ColecaoListaDePaginas = ListaDePaginas.GetItems(ONossoCamlQuery());

 

Agora dentro da nossa colecção de páginas vamos buscar a informação de cada uma através de um SPItem a que chamo elemento verificando sempre se dentro de cada elemento ele é nulo e começando a escrever um nó de XML chamado "item" citado anteriormente. Temos de ter em atenção a mu-dança dos nomes dos campos a que se refere cada elemen-to pelos definidos por si.

 

SPItem elemento = ColecaoListaDePaginas[z];
TextWriter.WriteStartElement(
"item"
);
if (elemento["CampoTituloPaginaSharepoint"] != null
)
     TextWriter.WriteElementString(
"title", elemento["CampoTituloPaginaSharepoint"
].ToString());
if (elemento["CampoDescricaoPaginaSharepoint"] != null
)
     TextWriter.WriteElementString(
"description", elemento["CampoDescricaoPaginaSharepoint"
].ToString());
if (elemento["CampoLinkPaginaSharepoint"] != null)

 

Neste elemento string "link" estamos a construir dinamicamente o Link para a lista de páginas que abrimos anterior-mente, novamente vemos que a nossa lista se chama "Pages", mude para "Paginas" ou o nome que deu à mesma

 

TextWriter.WriteElementString("link", String.Format("{0}/Pages/{1}", URL, elemento["CampoLinkPaginaSharepoint"]));
 
if (elemento["CampoDataPublicacaoPaginaSharepoint"] != null
)
     TextWriter.WriteElementString(
"pubDate", elemento["CampoDataPublicacaoPaginaSharepoint"
].ToString());
TextWriter.WriteEndElement();

 

Vamos fechar todos os elementos e acabar a nossa Response.

 

TextWriter.WriteEndElement();
TextWriter.WriteEndElement();
TextWriter.WriteEndDocument();
TextWriter.Flush();
TextWriter.Close();
Response.End();

 

Método completo

 

protected void GetYourRss()
        {

readonly string NossoUrlNivelRoot = String.Format("{0}//{1}:{2}", SPContext.Current.Site.Protocol, SPContext.Current.Site.HostName, SPContext.Current.Site.Port);
           
try

            {

                string URL = NossoUrlNivelRoot + "/NossaAreaDentroDaRoot";

                Response.Clear();
                Response.ContentType =
"text/xml";

                XmlTextWriter TextWriter = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
                TextWriter.WriteStartDocument();
                TextWriter.WriteStartElement(
"rss"
);
                TextWriter.WriteAttributeString(
"version", "2.0"
);
                TextWriter.WriteStartElement(
"channel"
);
                TextWriter.WriteElementString(
"title", "JOAO TITO LIVIO"
);
                TextWriter.WriteElementString(
"link", " http://msmvps.com/blogs/officept/default.aspx"
);
                TextWriter.WriteElementString(
"description", "Enjoy your RSS"
);
                TextWriter.WriteElementString(
"copyright", "Copyright 2011 Joao Tito Livio. All rights reserved.");               

using (SPSite site = new SPSite(URL))
                {
                   
using
(SPWeb web = site.OpenWeb())
                    {

SPList ListaDePaginas = web.Lists["Pages"];
                        SPListItemCollection ColecaoListaDePaginas = ListaDePaginas.GetItems(ONossoCamlQuery());
                       
for (int
z = 0; z < ColecaoListaDePaginas.Count; z++)
                        {


                           
SPItem elemento = ColecaoListaDePaginas[z];
                            TextWriter.WriteStartElement(
"item"
);
                           
if (elemento["CampoTituloPaginaSharepoint"] != null
)
                                TextWriter.WriteElementString(
"title", elemento["CampoTituloPaginaSharepoint"
].ToString());
                           
if (elemento["CampoDescricaoPaginaSharepoint"] != null
)
                                TextWriter.WriteElementString(
"description", elemento["CampoDescricaoPaginaSharepoint"
].ToString());
                           
if (elemento["CampoLinkPaginaSharepoint"] != null)

                                TextWriter.WriteElementString("link", String.Format("{0}/Pages/{1}", URL, elemento["CampoLinkPaginaSharepoint"]));
                           
if (elemento["CampoDataPublicacaoPaginaSharepoint"] != null
)
                                TextWriter.WriteElementString(
"pubDate", elemento["CampoDataPublicacaoPaginaSharepoint"
].ToString());
                            TextWriter.WriteEndElement();
                        }
                    }
                }
                TextWriter.WriteEndElement();
                TextWriter.WriteEndElement();
                TextWriter.WriteEndDocument();
                TextWriter.Flush();
                TextWriter.Close();
                Response.End();
            }
           
catch
(Exception ex)
            {
               
throw new
Exception(ex.ToString());
            }
        }

 

Considerações Finais

 

Desde que comecei a programar em SharePoint pela mão do MVP SharePoint André Lage, das primeiras coisas que me trans-mitiram foi que "já existe em SharePoint não se vai fazer de novo", mas realmente neste caso prefiro esta solução. Deixo ao vos-so critério HAPPY CODING!

 

Escrito por João Tito Lívio

http://msmvps.com/blogs/officept/default.aspx

É MCP e MCTS em SharePoint 2010 Application Development

É Microsoft Most Valuable Professional (MVP) na categoria de Office Systems Development desde 2002

 
Posted em 17-Aug-11
0 Comentários  |  Trackback Url  |  Link para este post | Bookmark este post com:        
 

Links para este post

Comentários

Nome:
URL:
Email:
Comentário: