Olá Pessoal,

Pretendo começar agora uma jornada de artigos sobre symfony, o framework de produtividade que usamos aqui na agência. Symfony é um framework open-source para PHP, que fornece uma arquitetura MVC completa e fácil de usar. Pretendo em outros posts falar um pouco mais sobre o symfony e sua instalação. Hoje porém, farei um tópico sobre um ítem muito importante para a otimização das páginas criadas com o framework em mecanismos de buscas (SEO): a criação de sitemaps dinâmicos.

Todos sabem que é fundamental criar o mapa do seu site (sitemap.xml) e enviá-lo ao Google. Através do sitemap o Google decide quais páginas do seu site serão indexadas. É importante também mantê-lo sempre atualizado e com as prioridades definidas corretamente. Não detalharei a criação e sintaxe do sitemap.xml (para isso recomendo o artigo “Sitemap.XML – O Guia Completo” da Mestre SEO).

A estrutura do arquivo de definição do mapa do site é bastante simples. Existem 6 elementos disponíveis, e destes, apenas 3 são obrigatórios:
1. urlset – o elemento raiz para o sitemap;
2. url – elemento xml para cada url, que contará todas as informações sobre a mesma;
3. loc – elemento interno que contará o endereço real da página que você deseja que seja indexada.

O Google permite que você especifique a localização do seu arquivo xml caso você esteja usando o Google Webmaster Tools, mas caso você não o esteja usando, os buscadores tentarão localizá-lo no endereço http://www.seusite.com.br/sitemap.xml.

Atualmente, grandes sistemas e bons frameworks permitem que você gere novas páginas automaticamente (um novo post em um blog por exemplo), porém não o ajudam muito a informar aos buscadores sobre essas mudanças.

Com o symfony você pode automatizar o processo de geração do sitemap, em 4 passos:

  1. Criar a rota para geração do sitemap
  2. Criar o módulo ‘sitemap’ e a ação ‘xmlSitemap’
  3. Implementar a ação
  4. Criar e implementar o template de sucesso

Duas coisas importantíssimas que não podemos esquecer ao gerar a saída automaticamente:

  1. O resultado do sitemap deve ser sempre um XML! Defina o tipo de conteúdo como text/xml.
  2. A ação de geração do sitemap não pode ser decorada com o layout padrão de seu sistema. Utilize a chamando sfAction::setLayout(false).

Para explicar nosso sistema de geração automática utilizaremos o exemplo de um sistema de notícias, em que cada nova notícas terá sua url própria e uma entrada no mapa. Devemos assumir o seguinte:

1. A aplicação de nosso projeto onde ficará nosso módulo ‘sitemap’ será a ‘frontend’.
2. A aplicação contém o modelo ‘Noticias’ com um método que lista todas os registros.
3. Seu servidor possui o módulo ‘mod_rewrite’ do apache habilitado, para que seu index.php de sua aplicação não seja exibido.

Criando a rota XML para o sitemap

/apps/frontend/config/routing.xml

1
2
3
xml_sitemap:
    url:  /sitemap.xml
    param:  { module: sitemap, action: xmlSiteMap }

Criando o módulo ‘sitemap’

Utilize o script para criação de módulos abaixo (ou através de IDEs que automatizem o processo. Recomendo fortemente o uso do NetBeans, que a partir da versão 6.8 oferece integração nativa com o symfony).

./symfony generate:module frontend sitemap

O comando acima irá criar o módulo sitemap em sua aplicação. Abra o arquivo de ações do novo módulo criado (/apps/frontend/modules/sitemap/actions.class.php) e crie uma nova ação chamada generateXmlSitemap.

1
2
3
public function generateXmlSitemap(sfRequest $request){
 
}

Implementando a ação

Adicione as seguintes linhas ao seu método:

1
2
3
4
5
public function generateXmlSitemap(sfRequest $request){
    $this->setLayout(false);
    $this->getResponse()->setContentType('text/xml');
    $this->noticias = Doctrine::getTable('Noticias')->findAll();
}

Repare que em nosso exemplo buscamos todas as notícias no sistema, nem nos preocupando com ordenação. Você poderá gerar seu mapa filtrando seus objetos e incluindo outros. O ideal é que todas as páginas ativas de seu sistema estejam listadas no sitemap.xml.

Crie e implemente o template de sucesso da ação

Por fim, crie o arquivo /apps/frontend/sitemap/templates/xmlSitemapSuccess.php e adicione o seguinte código:

1
2
3
4
5
6
7
8
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<?php foreach($noticias as $noticia); ?>
<url>
    <loc><?php echo url_for('noticia/view?slug=' . $noticia->getSlug())?></loc>
    <lastmod><?php echo $noticia->getDateTimeObject('updated_at')->format('c')?></lastmod>
</url>
<?php endforeach ?>
</urlset>

Repare em meu exemplo utilizei o módulo ‘noticia’ com a action ‘view’ para exibir as notícias. Você poderia informar qualquer rota para gerar a url de seu objeto. É importante ressaltar também que no exemplo geraremos apenas o mapa com links de suas notícias. Não se esqueça de incluir suas outras páginas internas, e claro, a url de sua página inicial!

Espero que seja útil. Não deixe de enviar seu comentário! 😉

Fonte: Final Concept – Symfony: Generate Google XML Sitemap