sábado, fevereiro 10, 2007

Woo-hoo!

Ainda não estou muito acostumado com Programação Orientada a Objeto. Não vou ficar falando das vantagens e desvantagens dela aqui, mas o fato é que ainda não tenho tanta prática com ela, o raciocínio muitas vezes ainda fica complicado, redundante...

Mas a vida é assim. É errando que se aprende (pelo menos comigo). Programação é ler muito e experimentar muito.

Eu estava querendo criar uma rotina com PHP que editasse o arquivo de RSS do meu site automaticamente assim que eu incluísse uma matéria, um artigo, uma notícia, etc... no banco de dados.

O arquivo de RSS é um arquivo de texto, que usa basicamente tags XML.

Até aí nada de errado; conheço as tags e tudo mais. Mas no PHP, muitas bibliotecas poderosas dão preferência à orientação a objetos, e aí surgiu o dúvida: fazer do modo procedural (abrir o arquivo, ler, encaixar o ponteiro e escrever as novidades, tudo no passo-a-passo procedural de sempre) ou usar as DOM functions do PHP (que servem justamente para esse tipo de coisa (trabalhar com arquivos XML)?

Pensei: "Essa biblioteca não está aí à toa... Certo, vou usar essa porra...".

Não foi tão difícil criar o esqueleto do código. Rapidinho estava funcionando. O problema era que o arquivo saía com uma formatação feia, errada... A estrutura estava certa, mas a formatação de saída... Isso mesmo setando a propriedade formatOutput para true. [$fileRSS->formatOutput = true].

E tenta daqui e tenta de lá. Codificação? ISO-8859-1 ou UTF-8 dava na mesma.

Precedência na hora de setar a propriedade? será?
$fileRSS->load(rss.xml);
$fileRSS->formatOutput = true; //(ou TRUE, ou True, ou 1)...

ou o contrário... nada ia, só o tempo...

Quando o arquivo estava vazio, ou de alguma forma se sobre escrevia tudo no arquivo a coisa funcionava. De qualquer jeito.

Google, PHP.net, uma caralhada de fóruns e blogs e nada. Já estava pensando em enviar um e-mail para o pessoal do PHP.

Veio a idéia: mandar ignorar os espaços de identação originais.
$fileRSS->preserveWhiteSpace = false;

Woo-hoo! Funfô! Funfô!

No final das contas os trechos fundamentais estão aí abaixo:

/* ... */
$fileRSS = new DOMDocument(); // aqui cria o objeto
$fileRSS->formatOutput = true; // para ter uma saída bonita
$fileRSS->preserveWhiteSpace = false; // e para conseguir a saída bonita
$fileRSS->load('path_to_file/rss.xml'); // lê o conteúdo do arquivo para o objeto

/* faz as alterações e inclusões */

$fileRSS->save('path_to_file/rss.xml'); // salva no arquivo de origem


Té+.

Nenhum comentário: