• Um estudo em RSS Parte 3: Publicando seu feed

    by  • 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('&','&amp;',$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&amp;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&amp;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.

    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 :D

    About

    Rafael Dohms is a PHP Evangelist, Speaker and contributor. He is a very active member of the PHP Community, having helped create and manage two PHP User Groups in Brazil. He shared the lead of PHPSP for 3 wonderful years making a positive mark on the local market. Developer, gamer and lover of code he also hosts Brazil’s first PHP Podcast: PHPSPCast, as well as contributing to well known projects. He moved to the Netherlands in search of new challenges and is now part of the team at WEBclusive, sharing his passion for quality code and working on new awesome ideas with the team. You can always find him at the nearest Community events, speaking, sharing, talking or just learning from the rest.

    http://doh.ms