Um estudo em RSS Parte 3: Publicando seu feed
by Rafael Dohms • September 6, 2006 • MySQL, PHP, RSS, XML
Nos últimos posts aprendemos o que é um Feed RSS, como surgiu, qual é sua cara e como ler suas informações. Agora chegou a hora de juntar tudo isso e descobrir como criar um RSS do seu site, publicando as suas notícias para que todos possam conferir.
O cenário de testes que vou propor se tratará de um site simples de notícias, por exemplo, um site corporativo que deseja divugar as novidades sobre sua empresa ou ramo. Vamos detalhar a base de dados e mostrar de forma geral como transformar os dados da tabela em um feed RSS atualizado.
1º Passo – Base de Dados
Ok, então voce tem uma base de dados com notícias, digamos que ela tem a estrutura abaixo:
CREATE TABLE `materias` ( `idmaterias` int(10) unsigned NOT NULL auto_increment, `datarg` datetime default NULL, `credito` varchar(100) default NULL, `chamada` varchar(150) default NULL, `conteudo` text, `imagem` varchar(60) default NULL, PRIMARY KEY (`idmaterias`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
A tabela contêm as informações básicas que precisamos, como data de publicação, chamada e conteúdo.
2º Passo – Resgatar informações
Ok, então vc tem um banco de dados com uma lista de matérias, digamos umas 5, e agora?
Como cada pessoa usa uma classe diferente para acessar o banco de dados, ou usa as funções nativas do PHP, não vou entrar em detalhes e mostrar como buscar dados no MySQL. Vamos pular para o resultado final, um array com as matérias neste formato:
Array
(
[0] => Array
(
[idmat] => 2525
[datarg] => 06/09/2006 00:25:42
[chamada] => Câmara aprova fim do voto secreto em plenário
[conteudo] => A Câmara dos Deputados aprovou nesta terça-feira, em primeiro turno, por 383 votos...
)
)
3º Passo – Montar a estrutura do RSS
Nos artigos anteriores já aprendemos como montar um XML usando DOM no PHP e conhecemos a estrutura de um arquivo RSS, agora só precisamos juntar estes conhecimentos.
A idéia aqui é simples, primeiro devemos montar a estrutura básica do RSS, e então devemos percorrer o array acima cadastrando cada uma das matérias. O código abaixo realiza esta ação, e seria executada logo após nossa busca no banco de dados.
< ?
//Formata texto para inserção no XML para evitar erros
//de invalidade, ou charset (Veja artigo "Ajax e acentos")
function xmlSafeText($text){
$text = strip_tags($text);
$text = utf8_encode($text);
$text = str_replace('&','&',$text);
$text = htmlspecialchars($text);
return $text;
}
//Funçao EXEMPLO que retorna array de notícias como descrito no artigo
$noticias = getNoticiasFromDB();
//Iniciar documento XML
$xmlDoc = new DOMDocument('1.0','utf-8');
$xmlDoc->formatOutput = true;
//elemento RSS
$xmlRSS = $xmlDoc->createElement('rss');
$xmlRSS->setAttribute('version','2.0');
$xmlRSS = $xmlDoc->appendChild($xmlRSS);
//Elemento CHANNEL
$xmlChannel = $xmlDoc->createElement('channel');
$xmlChannel = $xmlRSS->appendChild($xmlChannel);
//Setar dados do Canal
$xmlCanalTitle = $xmlDoc->createElement('title',xmlSafeText('Meu Exemplo - Últimas Notícias'));
$xmlCanalDescription = $xmlDoc->createElement('description',xmlSafeText('Últimas notícias do meu exemplo'));
$xmlCanalLink = $xmlDoc->createElement('link','http://blog.rafaeldohms.com.br');
//Anexar nodes na arvore xml
$xmlCanalTitle = $xmlChannel->appendChild($xmlCanalTitle);
$xmlCanalDescription = $xmlChannel->appendChild($xmlCanalDescription);
$xmlCanalLink = $xmlChannel->appendChild($xmlCanalLink);
//Percorrer array de notícias adicionando cada uma no xml
foreach ($noticias as $mat){
//Criar node ITEM
$xmlItem = $xmlDoc->createElement('item');
$xmlItem = $xmlChannel->appendChild($xmlItem);
//Adicionar código unico de identificação
$xmlMatGuid = $xmlDoc->createElement('guid','http://blog.rafaeldohms.com.br/index.php?idpaginas=20&idmaterias='.$mat['idmat']);
//Título da materia
$xmlMatTitle = $xmlDoc->createElement('title',xmlSafeText($mat['chamada']));
//Conteudo - resumo, vamos colocar apenas 250 chars desta matéria ou podemos colocar completo, sua escolha, seu objetivo
$xmlMatDescription = $xmlDoc->createElement('description',xmlSafeText(substr($mat['desc'],0,255).'...');
//Link para materia completa
$xmlMatLink = $xmlDoc->createElement('link','http://blog.rafaeldohms.com.br/index.php?idpaginas=20&idmaterias='.$mat['idmat']);
//Data de publicação (r = data no formato RFC 2822 - Padrão para o RSS)
//Ex: Thu, 21 Dec 2000 16:01:07 +0200
$xmlMatPubDate = $xmlDoc->createElement('pubDate',date('r',strtotime($mat['datarg'])));
//Anexar no XML
$xmlMatGuid = $xmlItem->appendChild($xmlMatGuid);
$xmlMatTitle = $xmlItem->appendChild($xmlMatTitle);
$xmlMatDescription = $xmlItem->appendChild($xmlMatDescription);
$xmlMatLink = $xmlItem->appendChild($xmlMatLink);
$xmlMatPubDate = $xmlItem->appendChild($xmlMatPubDate);
}
//Definir CHARSET para xml (Veja artigo "Ajax e acentos")
header("Content-type:application/xml; charset=utf-8");
//Echoar XML Final, jogar para browser
echo $xmlDoc->saveXML();
?>
4º Passo – Publicando seu RSS
Executando os passos anteriores temos agora um arquivo que ao ser executado busca matérias recentes no banco, gera uma string em formato RSS e retorna estes dados para serem lidos por um leitor de RSS. Agora precisamos avisar o usuário que nosso site tem um feed RSS que ele pode utilizar.
Duas formas de fazer isso são as mais utilizadas, a primeira é simples e visual, focada realmente no usuário. Se trata de adicionar em local estratégicos do site um pequeno botão laranja, com RSS ou XML escrito (BOTAO), linkando este botão para o endereço do feed.
A segunda forma é focada nos navegadores e ferramentas de RSS. Um código especial (link header) inserido no cabecalho da pagina indica que ela possui um equivalente em formato RSS no endereço específico, pense nisso como uma bandeira indicando uma cópia de tal página em outra lingua. Navegadores preparados ou leitores de RSS identificam esta tag e automaticamente interpretam o endereço indicado ou alertam o usuário sobre o feed, questionando se ele deseja adicionar a sua lista de feeds ou não. Veja abaixo o formato do tag que deve ser adicionado dentro do elemento <head>:
<link rel="alternate" type="application/rss+xml" href="http://www.comuniweb.com.br/rss.php" title="RSS: ComuniWEB - Últimas Notícias"></link>
Conclusão
Com isso chegamos ao final desta sequencia de artigos sobre RSS.
- Um estudo em RSS – Parte 1: XML DOM — O primeiro artigo descreveu o que é um RSS e como pode ser “lido” ou agregado. Também falei sobre como gerar arquivos XML no PHP usando o DOM.
- Um estudo em RSS Parte 2: O Formato RSS — No segundo artigo apresentei o histórico do formato RSS 2.0 e descrevi cada item de sua estrutura XML.
Finalmente neste arquivo juntamos todo conhecimento e geramos um feed a partir de um banco de dados com notícias. Espero que estes artigos tenham ajudado vocês, aos leigos um pouco sobre como usar e por que usar um RSS, e aos desenvolvedores como publicar seus conteúdos neste formato.
Por favor sintam-se a vontade para deixar perguntas e sugestões nos comentários, posso sempre voltar ao assunto com novos tutoriais e artigos se for necessário. Obrigado pela paciência de todos que seguiram até aqui