<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ataraxia! &#187; pear</title>
	<atom:link href="http://www.ataraxia.com.br/posts/tag/pear/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ataraxia.com.br</link>
	<description>O estado da arte em TI</description>
	<lastBuildDate>Sun, 17 Jul 2011 21:36:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Imprimindo em formulários contínuos em PHP</title>
		<link>http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php</link>
		<comments>http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php#comments</comments>
		<pubDate>Thu, 08 Jan 2009 02:29:21 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[impressão]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.ataraxia.com.br/?p=161</guid>
		<description><![CDATA[Um problema que as vezes surge é a impressão em formulário contínuo. Seja nota fiscal, etiqueta, ou qualquer outra coisa, muitas vezes precisamos desenvolver uma aplicação que faça isso. O grande problema de imprimir nesse tipo de papel é saber onde a &#8220;folha&#8221; termina e começa a próxima. A solução que eu usei pra resolver [...]]]></description>
			<content:encoded><![CDATA[<p>Um problema que as vezes surge é a impressão em formulário contínuo. Seja nota fiscal, etiqueta, ou qualquer outra coisa, muitas vezes precisamos desenvolver uma aplicação que faça isso. O grande problema de imprimir nesse tipo de papel é saber onde a &#8220;folha&#8221; termina e começa a próxima.</p>
<p>A solução que eu usei pra resolver um problema de impressão de notas fiscais foi usar uma classe do PEAR chamada File_PDF, que como o próprio nome já deixa claro, serve para gerar arquivos PDF.</p>
<p>Como todos sabemos, o formato <acronym title="Portable Document Format">PDF</acronym> é ideal para situações em que precisamos ter certeza de que ele sempre será impresso da mesma forma, independente da máquina onde é aberto. O problema em usar outros formatos (DOC do Word, por exemplo), é que as informações necessárias para a impressão não ficam no arquivo. Detalhes como as fontes usadas, os tamanhos, acabam dependendo de configurações de cada máquina.</p>
<p>Voltando ao problema, eu tinha um formulário de 10 páginas para testes, com um tamanho não muito usual, e os campos da nota fiscal que eu precisaria preencher.</p>
<p>Pra resolver o problema do posicionamento, não tem outro jeito, tem que medir com régua mesmo. A idéia é anotar as posições X e Y de cada campo, usando milímetros pra evitar números fracionários. O tamanho do papel também se mede com régua, não tem muito mistério.</p>
<p>Tendo o tamanho do papel e o posicionamento de cada campo, o grande truque é gerar um PDF dinamicamente, com &#8220;páginas&#8221; do tamanho da nossa nota fiscal, e depois posicionar os textos dentro dessa página.</p>
<p>No fim do script, teremos um PDF já todo pronto pra ser mandado para a impressora, tudo já formatado com o tamanho e posição corretas.</p>
<p>Segue o código, por partes.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'File/PDF.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$pdf</span> <span style="color: #339933;">=</span> File_PDF<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'orientation'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'P'</span><span style="color: #339933;">,</span>
                               <span style="color: #0000ff;">'unit'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'mm'</span><span style="color: #339933;">,</span>
                               <span style="color: #0000ff;">'format'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">206</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">165</span><span style="color: #009900;">&#41;</span>
                        <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFont</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Courier'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Até aqui, sem muitos mistérios. Incluí o arquivo da classe File_PDF, e instanciei um objeto em $pdf. A orientação do documento é P (de Portrait, ou &#8220;em pé&#8221;), a unidade que eu vou usar será milímetros, e o formato da minha folha é de 206 mm de altura por 165 mm de largura. Depois disso, eu escolho a fonte Courier 10 para o documento inteiro.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$venda</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$item</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addPage</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'P'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">text</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">171</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">44</span><span style="color: #339933;">,</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'nome_cliente'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">text</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">171</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">49</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'Prest. Serv.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">text</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">171</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">57</span><span style="color: #339933;">,</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'data'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">...</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Agora, eu percorro um vetor ($venda) já criado com as informações que eu precisarei colocar na nota fiscal. Para cada entrada desse vetor, eu crio uma nova página com a mesma orientação (em pé). A partir daí, é só posicionar cada texto. Em 171 x 44, coloco o nome do cliente, em 171 x 49, a natureza da operação, em 171 x 57, a data da venda, e por aí vai.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: application/pdf&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pdf</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">output</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'notas.pdf'</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Para terminar, dou a saída do documento. Marco o tipo da saída para &#8220;application/pdf&#8221;, e mando o objeto soltar o documento para o navegador com o nome de &#8220;notas.pdf&#8221;. O segundo parâmetro é se a saída é inline ou como um arquivo para download. Passamos false para que o navegador entenda que o PDF é para ser baixado.</p>
<p>Se tudo deu certo, o navegador vai perguntar se você quer abrir ou salvar o PDF. Se abrir em algum programa como o Adobe Reader, basta imprimir diretamente do programa, e bingo. Resolvida a questão.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2" title="XML no PHP com XML_Serializer, parte 2 de 2">XML no PHP com XML_Serializer, parte 2 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2" title="XML no PHP com XML_Serializer, parte 1 de 2">XML no PHP com XML_Serializer, parte 1 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/validacao-de-dados-em-php" title="Validação de dados em PHP">Validação de dados em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress" title="Agendando eventos no WordPress">Agendando eventos no WordPress</a></li><li><a href="http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress" title="Removendo o &#8220;generator&#8221; do Wordpress">Removendo o &#8220;generator&#8221; do Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress" title="Escrevendo plugins para o Wordpress">Escrevendo plugins para o Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/criando-captchas-em-php" title="Criando CAPTCHAs em PHP">Criando CAPTCHAs em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML no PHP com XML_Serializer, parte 2 de 2</title>
		<link>http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2</link>
		<comments>http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2#comments</comments>
		<pubDate>Fri, 02 Jan 2009 02:20:59 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.ataraxia.com.br/?p=138</guid>
		<description><![CDATA[Na primeira parte do artigo, vimos como usar a classe PEAR XML_Serializer para transformar dados do PHP em documentos XML. Nesta segunda parte, veremos como fazer o inverso, ou seja, transformar um documento XML em uma variável no PHP. Um pequeno problema Um problema que podemos ter é em relação ao mapeamento de dados do [...]]]></description>
			<content:encoded><![CDATA[<p>Na <a href="http://blog.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2">primeira parte do artigo</a>, vimos como usar a classe PEAR XML_Serializer para transformar dados do PHP em documentos XML.</p>
<p>Nesta segunda parte, veremos como fazer o inverso, ou seja, transformar um documento XML em uma variável no PHP.</p>
<h4>Um pequeno problema</h4>
<p>Um problema que podemos ter é em relação ao mapeamento de dados do XML para classes no PHP. Como o XML normalmente não possui a informação de qual classe do PHP corresponde a quais entidades do XML, isto precisará ser informado por nós, caso queiramos fazer este mapeamento. Caso contrário, teremos arrays ou instâncias de <em>StdClass</em>, a classe genérica do PHP, para descrever os objetos. Veremos como resolver isto mais adiante.</p>
<p>Isto não se aplica ao nosso exemplo, pois utilizamos <em>type hints</em> na geração do XML, para não termos a informação perdida.</p>
<h4>O script</h4>
<p>Assumindo que gravamos o XML gerado pelo exemplo anterior em um arquivo chamado <em>doc.xml</em>, o seguinte script irá ler e traduzir o XML:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'XML/Unserializer.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$unserializer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XML_Unserializer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unserialize</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;erro.xml&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$erro</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$unserializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getUnserializedData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$erro</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>O segundo parâmetro passado para o método <em>unserialize()</em> especifica que o primeiro parâmetro é o nome de um arquivo, e não uma string com o XML. A saída deste script é a variável com o erro original.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">PEAR_Error Object
<span style="color: #009900;">&#40;</span>
    <span style="color: #009900;">&#91;</span>error_message_prefix<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>mode<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>level<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1024</span>
    <span style="color: #009900;">&#91;</span>code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">999</span>
    <span style="color: #009900;">&#91;</span>message<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> rah<span style="color: #339933;">!</span>
    <span style="color: #009900;">&#91;</span>userinfo<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>backtrace<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
        <span style="color: #009900;">&#40;</span>
            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                <span style="color: #009900;">&#40;</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #990000;">file</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">/</span>usr<span style="color: #339933;">/</span>share<span style="color: #339933;">/</span>php<span style="color: #339933;">/</span>PEAR<span style="color: #339933;">.</span>php
                    <span style="color: #009900;">&#91;</span>line<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">576</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> PEAR_Error
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> PEAR_Error
                    <span style="color: #009900;">&#91;</span>type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">-&gt;</span>
                    <span style="color: #009900;">&#91;</span>args<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                        <span style="color: #009900;">&#40;</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> rah<span style="color: #339933;">!</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">999</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1024</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
                        <span style="color: #009900;">&#41;</span>
&nbsp;
                <span style="color: #009900;">&#41;</span>
&nbsp;
            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                <span style="color: #009900;">&#40;</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #990000;">file</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">/</span>home<span style="color: #339933;">/</span>lustosa<span style="color: #339933;">/</span>xml<span style="color: #339933;">.</span>php
                    <span style="color: #009900;">&#91;</span>line<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">4</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> raiseError
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> PEAR
                    <span style="color: #009900;">&#91;</span>type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">::</span>
                    <span style="color: #009900;">&#91;</span>args<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                        <span style="color: #009900;">&#40;</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> rah<span style="color: #339933;">!</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">999</span>
                        <span style="color: #009900;">&#41;</span>
&nbsp;
                <span style="color: #009900;">&#41;</span>
&nbsp;
        <span style="color: #009900;">&#41;</span>
&nbsp;
    <span style="color: #009900;">&#91;</span>callback<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
<span style="color: #009900;">&#41;</span></pre></div></div>

<p>O objeto só foi retornado exatamente ao estado original por causa das <em>type hints</em> que colocamos ao gerar o XML. Caso não tivéssemos colocado, teríamos problemas nesse ponto, pois as informações do tipo de dado original teriam sido perdidas, e precisaríamos dar algum tratamento extra para termos exatamente o objeto original.</p>
<p>Normalmente, ao desenvolver, nós temos que fazer ou uma parte ou outra. Ou precisamos disponibilizar dados em XML para alguém, ou precisamos processar dados em XML gerados por alguém.</p>
<p>Caso a necessidade seja a geração, muito provavelmente os programadores que irão tratar o XML não precisarão dessas informações extras de tipo, pois são pertinentes apenas ao sistema de origem, onde o XML foi gerado.</p>
<p>E da mesma forma, caso precisemos apenas processar um XML gerado, a informação do tipo original nem sempre é útil para nós. Porém, dependendo da estrutura do XML, pode ser útil fazer o mapeamento de algumas estruturas do XML para classes no PHP preparadas para receber a informação do XML.</p>
<p>Existem diversas opções que podem ser passadas para o Unserializer, de forma a fazer este mapeamento. Temos, por exemplo:</p>
<ul>
<li><em>complexType</em>, que deve ser setado ou para &#8216;array&#8217; ou para &#8216;object&#8217;, dependendo de como se deseja receber os dados do XML. Por padrão, a conversão é feita para arrays.</li>
<li><em>tagMap</em>, que recebe um array associativo, com as chaves correspondendo às entidades do XML, e os valores correspondendo à classe no PHP.</li>
</ul>
<p>Assim, se no XML temos uma tag &lt;util&gt; e queremos mapeá-la a um objeto do tipo XML_Util, poderíamos passar para o Unserializer um array como o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$opt</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'complexType'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'object'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'tagMap'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'util'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'XML_Util'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pronto, teremos objetos no lugar de arrays, que por padrão serão objetos genéricos, do tipo <em>StdClass</em>, mas que no caso das tags &#8216;util&#8217;, serão mapeados para objetos do tipo XML_Util.</p>
<p>Existem <a href="http://pear.php.net/manual/en/package.xml.xml-serializer.xml-unserializer.options.php">muitas outras opções</a> que podem ser usadas, dependendo to nível de customização necessário.</p>
<h4>Conclusão</h4>
<p>O PHP disponibiliza várias opções para mexermos com XML, e embora o SimpleXML e o DOM sejam opções bem populares, a classe XML_Serializer do PEAR pode ser uma opção bastante versátil, dependendo do que se deseja fazer.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2" title="XML no PHP com XML_Serializer, parte 1 de 2">XML no PHP com XML_Serializer, parte 1 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php" title="Imprimindo em formulários contínuos em PHP">Imprimindo em formulários contínuos em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/validacao-de-dados-em-php" title="Validação de dados em PHP">Validação de dados em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress" title="Agendando eventos no WordPress">Agendando eventos no WordPress</a></li><li><a href="http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress" title="Removendo o &#8220;generator&#8221; do Wordpress">Removendo o &#8220;generator&#8221; do Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress" title="Escrevendo plugins para o Wordpress">Escrevendo plugins para o Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/criando-captchas-em-php" title="Criando CAPTCHAs em PHP">Criando CAPTCHAs em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML no PHP com XML_Serializer, parte 1 de 2</title>
		<link>http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2</link>
		<comments>http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2#comments</comments>
		<pubDate>Thu, 01 Jan 2009 19:31:54 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.ataraxia.com.br/?p=127</guid>
		<description><![CDATA[XML é a linguagem da moda! Parece que todo programa, para conseguir ter algum respeito hoje em dia, precisa usar XML pra alguma coisa. Como o XML é uma linguagem em texto, existem diversas formas de se ler um documento XML. Uma das formas é tratar o documento como uma grande string, e ir &#8220;fatiando&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p><acronym title="eXtensible Markup Language">XML</acronym> é a linguagem da moda! Parece que todo programa, para conseguir ter algum respeito hoje em dia, precisa usar XML pra alguma coisa. Como o XML é uma linguagem em texto, existem diversas formas de se ler um documento XML.</p>
<p>Uma das formas é tratar o documento como uma grande string, e ir &#8220;fatiando&#8221; as tags para se conseguir buscar os valores desejados. De todos, acredito que este seja o método menos flexível, pois ignora toda a estrutura do documento. Além disso, fica bastante complexo extrair informações de objetos compostos codificados em XML (um Array de objetos, por exemplo). Porém, é uma forma simples, e que não requer muito conhecimento (apenas as funções de tratamento de string, ou expressões regulares).</p>
<p>O PHP disponibiliza outras formas de se trabalhar com XML, como as funções para leitura de XML usando a <a href="http://br2.php.net/manual/en/book.dom.php"><acronym title="Application Programming Interface">API</acronym> de <acronym title="Document Object Model">DOM</acronym></a>, e também a bastante conhecida <a href="http://br2.php.net/manual/en/book.simplexml.php">SimpleXML</a>.</p>
<p>Como mais uma alternativa, apresentarei as classe XML_Serializer e XML_Unserializer do <acronym title="PHP Extension and Application Repository">PEAR</acronym>.</p>
<h4>PEAR XML_Serializer</h4>
<p>Esta classe do PEAR transforma tipos de dados complexos, como arrays e objetos, em um documento XML. Seu uso é bastante simples, e para ilustrar com um objeto um pouco complexo, vou usar o método <em>raiseError</em> da classe PEAR para gerar um objeto de erro.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'XML/Serializer.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$erro</span> <span style="color: #339933;">=</span> PEAR<span style="color: #339933;">::</span><span style="color: #004000;">raiseError</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'rah!'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">999</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$erro</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Imprime a estrutura do objeto na tela</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Serializa o erro em um documento XML</span>
<span style="color: #000088;">$opt</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'indent'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'  '</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'addDecl'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'typeHints'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$serializer</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XML_Serializer<span style="color: #009900;">&#40;</span><span style="color: #000088;">$opt</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$serializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">serialize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$erro</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$serializer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSerializedData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Executando-se este script, primeiro temos impressa a estrutura do erro gerado, com a função <em>print_r()</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">PEAR_Error Object
<span style="color: #009900;">&#40;</span>
    <span style="color: #009900;">&#91;</span>error_message_prefix<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>mode<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>level<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1024</span>
    <span style="color: #009900;">&#91;</span>code<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">999</span>
    <span style="color: #009900;">&#91;</span>message<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> rah<span style="color: #339933;">!</span>
    <span style="color: #009900;">&#91;</span>userinfo<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>backtrace<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
        <span style="color: #009900;">&#40;</span>
            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                <span style="color: #009900;">&#40;</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #990000;">file</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">/</span>usr<span style="color: #339933;">/</span>share<span style="color: #339933;">/</span>php<span style="color: #339933;">/</span>PEAR<span style="color: #339933;">.</span>php
                    <span style="color: #009900;">&#91;</span>line<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">576</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> PEAR_Error
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> PEAR_Error
                    <span style="color: #009900;">&#91;</span>type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">-&gt;</span>
                    <span style="color: #009900;">&#91;</span>args<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                        <span style="color: #009900;">&#40;</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> rah<span style="color: #339933;">!</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">999</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1024</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
                        <span style="color: #009900;">&#41;</span>
&nbsp;
                <span style="color: #009900;">&#41;</span>
&nbsp;
            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                <span style="color: #009900;">&#40;</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #990000;">file</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">/</span>home<span style="color: #339933;">/</span>lustosa<span style="color: #339933;">/</span>xml<span style="color: #339933;">.</span>php
                    <span style="color: #009900;">&#91;</span>line<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">4</span>
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> raiseError
                    <span style="color: #009900;">&#91;</span><span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> PEAR
                    <span style="color: #009900;">&#91;</span>type<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">::</span>
                    <span style="color: #009900;">&#91;</span>args<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">Array</span>
                        <span style="color: #009900;">&#40;</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> rah<span style="color: #339933;">!</span>
                            <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">999</span>
                        <span style="color: #009900;">&#41;</span>
&nbsp;
                <span style="color: #009900;">&#41;</span>
&nbsp;
        <span style="color: #009900;">&#41;</span>
&nbsp;
    <span style="color: #009900;">&#91;</span>callback<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
<span style="color: #009900;">&#41;</span></pre></div></div>

<p>E em seguida, fazemos a conversão deste objeto usando o XML Serializer. Existem <a href="http://pear.php.net/manual/en/package.xml.xml-serializer.constants.php">várias opções</a> que podem ser passadas para o construtor, mas no exemplo só passei o parâmetro que especifica o que deve ser usado para indentar o código (no caso, escolhi 2 espaços em branco), e o parâmetro <em>addDecl</em>, que coloca o prólogo XML no início do documento. O prólogo XML é a declaração que inicia todo documento XML (&lt;?xml version=&#8221;1.0&#8243; ?&gt;).</p>
<p>Além disso, como pretendo usar a saída em XML deste exemplo na segunda parte deste artigo, também passei a opção <em>typeHints</em>, que coloca atributos nas tags com &#8220;dicas&#8221; sobre o tipo original do dado. Isto é necessário para que a decodificação seja feita com sucesso, pois sem ela, as informações de qual tipo o dado é (objeto, de qual classe, ou array, etc) são perdidas.</p>
<p>A saída do método <em>getSerializedData()</em> já é o documento XML formatado:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;PEAR_Error</span> <span style="color: #000066;">_class</span>=<span style="color: #ff0000;">&quot;PEAR_Error&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;object&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;error_message_prefix</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mode</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mode<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;level</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>1024<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/level<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;code</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>999<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/code<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;message</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>rah!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/message<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;userinfo</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;NULL&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;backtrace</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;array&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;array&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;file</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>/usr/share/php/PEAR.php<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;line</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>576<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/line<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;function</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>PEAR_Error<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/function<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>PEAR_Error<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;type</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>-<span style="color: #ddbb00;">&amp;gt;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/type<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;args</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;array&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>rah!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>999<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;2&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;3&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>1024<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;4&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;NULL&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/args<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;array&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;file</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>/home/lustosa/xml.php<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/file<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;line</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>4<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/line<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;function</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>raiseError<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/function<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>PEAR<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;type</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>::<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/type<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;args</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;array&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;string&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>rah!<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;XML_Serializer_Tag</span> <span style="color: #000066;">_originalKey</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>999<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/args<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/XML_Serializer_Tag<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/backtrace<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;callback</span> <span style="color: #000066;">_type</span>=<span style="color: #ff0000;">&quot;NULL&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/PEAR_Error<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Pronto! Transformamos o objeto em um XML válido. Você talvez tenha notado várias tags <em>XML_Serializer_Tag</em> espalhadas pelo XML. Isto acontece quando temos um array de índices numéricos. Os atributos &#8216;_type&#8217; e &#8216;_originalKey&#8217; são as dicas mencionadas anteriormente, e ajudarão o XML Unserializer a retornar o XML para o objeto original.</p>
<p>Na <a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2">parte 2 deste artigo</a>, veremos a classe XML_Unserializer, que faz justamente o trabalho inverso, transformando um documento XML em uma variável no PHP.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2" title="XML no PHP com XML_Serializer, parte 2 de 2">XML no PHP com XML_Serializer, parte 2 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php" title="Imprimindo em formulários contínuos em PHP">Imprimindo em formulários contínuos em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/validacao-de-dados-em-php" title="Validação de dados em PHP">Validação de dados em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress" title="Agendando eventos no WordPress">Agendando eventos no WordPress</a></li><li><a href="http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress" title="Removendo o &#8220;generator&#8221; do Wordpress">Removendo o &#8220;generator&#8221; do Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress" title="Escrevendo plugins para o Wordpress">Escrevendo plugins para o Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/criando-captchas-em-php" title="Criando CAPTCHAs em PHP">Criando CAPTCHAs em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validação de dados em PHP</title>
		<link>http://www.ataraxia.com.br/posts/validacao-de-dados-em-php</link>
		<comments>http://www.ataraxia.com.br/posts/validacao-de-dados-em-php#comments</comments>
		<pubDate>Tue, 30 Dec 2008 02:10:39 +0000</pubDate>
		<dc:creator>Bruno Lustosa</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.ataraxia.com.br/?p=95</guid>
		<description><![CDATA[Parte do trabalho de qualquer programador é validar os dados que são entrados em seus programas. No PHP, isso não é diferente. O meio mais convencional para se receber dados dos usuários é através de formulários, mas também pode-se receber dados de outras formas (XML, arquivos, conexões de rede, entre outras). A validação é importantíssima, [...]]]></description>
			<content:encoded><![CDATA[<p>Parte do trabalho de qualquer programador é validar os dados que são entrados em seus programas. No PHP, isso não é diferente. O meio mais convencional para se receber dados dos usuários é através de formulários, mas também pode-se receber dados de outras formas (XML, arquivos, conexões de rede, entre outras).</p>
<p>A validação é importantíssima, pois sem ela, o programa pode trabalhar com dados inválidos, e muitos problemas podem acontecer:</p>
<dl>
<dt>Resultados inesperados</dt>
<dd>Se o programa pede, por exemplo, um número entre 1 e 100, o usuário entra com 200, e o programa não faz essa checagem, pode acabar utilizando o número em alguma conta e terminando com um resultado inválido.</dd>
<dt>Segurança</dt>
<dd>Um dos problemas mais graves da falta de checagem, quando por exemplo a entrada do usuário é utilizado diretamente em uma query <acronym title="Structured Query Language">SQL</acronym> ou como parâmetro de um comando. Os dados entrados pelo usuário podem manipular a query ou o comando e conseguir acesso não autorizado ao banco de dados ou ao servidor.</dd>
<dt>Dados inconsistentes</dt>
<dd>Se, por exemplo, em um campo onde deveria se entrar um CEP, o usuário coloca números inválidos, letras, ou deixa em branco, o a empresa terá problemas, por exemplo, para enviar uma mala direta postal para seus clientes.</dd>
</dl>
<p>No caso de aplicações em PHP, com a saída via web, a validação ainda deve ser feita, preferencialmente, duas vezes: uma do lado do cliente (em Javascript) para se evitar que os dados inválidos sejam enviados, e outra do lado do servidor (em PHP), para evitar que dados inválidos tenham sido enviados por um navegador sem Javascript (ou com o Javascript desligado), ou maliciosamente por alguem. A validação em Javascript foge do escopo deste artigo, que irá tratar da validação dos dados em PHP.</p>
<h4>A classe PEAR Validate</h4>
<p>Sempre que possível, devemos evitar reescrever código já disponível, principalmente quando o código já disponível é de qualidade, como acontece com a maioria das classes disponíveis no <acronym title="PHP Extension and Application Repository">PEAR</acronym>, que devem seguir uma padronização de código bem rigorosa para serem aceitas.</p>
<p>Uma das classes disponíveis no PEAR é a <a href="http://pear.php.net/package/Validate">Validate</a>, que é uma classe genérica para validação de dados. A classe pode validar os seguintes tipos de dados:</p>
<ul>
<li>Números, podendo-se especificar valor mínimo e máximo, e número de casas decimais;</li>
<li>Emails, checando a sintaxe do email, se o domínio é válido, e se o email está no formato da RFC 822;</li>
<li>Strings, com constantes pré-definidas para facilitar a validação de maiúsculas e minúsculas, tamanho da string, entre outras;</li>
<li>Datas, com checagem de data mínima e máxima, e se o formato é RFC 822;</li>
<li>URLs, checando se o formato é válido (de acordo com a RFC 2396).</li>
</ul>
<p>A utilização é bastante simples. Uma vez instalada (é apenas um arquivo, chamado Validate.php), basta chamar estaticamente seus métodos, passando o dado a ser validado como primeiro parâmetro, e as opções de validação (quando aplicáveis) como segundo parâmetro. Os métodos retornam true ou false, indicando se a validação passou ou não.</p>
<p>Por exemplo, para validar um número em $num como sendo um número de 0 a 100 com no máximo 2 casas decimais, a chamada seria a seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$opt</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'decimal'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'dec_prec'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'min'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
             <span style="color: #0000ff;">'max'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>Validate<span style="color: #339933;">::</span><span style="color: #004000;">number</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$num</span><span style="color: #339933;">,</span> <span style="color: #000088;">$opt</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// validação ok!</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Os outros métodos são semelhantes, e para se saber quais são as opções que podem ser passadas, basta olhar <a href="http://pear.php.net/package/Validate/docs/latest/Validate/Validate.html#class_methods">os métodos disponíveis</a> diretamente na documentação da classe, ou então diretamente dentro do arquivo da classe.</p>
<h4>A classe PEAR Validate_ptBR</h4>
<p>Assim como a classe Validate provê métodos úteis para a validação de dados genéricos, temos também disponível a classe <a href="http://pear.php.net/package/Validate_ptBR">Validate_ptBR</a>, que disponibiliza métodos para validação de dados específicos do Brasil. A classe valida os seguintes tipos de dados:</p>
<ul>
<li><acronym title="Código de Endereçamento Postal">CEP</acronym>, com 8 dígitos;</li>
<li><acronym title="Cadastro de Pessoa Física">CPF</acronym>, checando se os dígitos verificadores correspondem ao restante do número;</li>
<li><acronym title="Cadastro Nacional de Pessoa Jurídica">CNPJ</acronym> e <acronym title="Programa de Integração Social">PIS</acronym>, também usando a checagem de dígitos verificadores;</li>
<li>Estados brasileiros (siglas);</li>
<li>Números telefônicos, com ou sem código de área;</li>
<li>Placas de carros, com 3 letras e 4 dígitos.</li>
</ul>
<p>A utilização da classe é semelhante à classe Validate, bastando chamadas estáticas aos seus métodos. Assim como na classe Validate, para saber os métodos disponíveis e seus parâmetros, basta examinar <a href="http://pear.php.net/package/Validate_ptBR/docs/latest/Validate_ptBR/Validate_ptBR.html#class_methods">a documentação da classe</a>.</p>
<h3  class="related_post_title">Artigos relacionados</h3><ul class="related_post"><li><a href="http://www.ataraxia.com.br/posts/imprimindo-em-formularios-continuos-em-php" title="Imprimindo em formulários contínuos em PHP">Imprimindo em formulários contínuos em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-2-de-2" title="XML no PHP com XML_Serializer, parte 2 de 2">XML no PHP com XML_Serializer, parte 2 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/xml-no-php-com-xml_serializer-parte-1-de-2" title="XML no PHP com XML_Serializer, parte 1 de 2">XML no PHP com XML_Serializer, parte 1 de 2</a></li><li><a href="http://www.ataraxia.com.br/posts/agendando-eventos-no-wordpress" title="Agendando eventos no WordPress">Agendando eventos no WordPress</a></li><li><a href="http://www.ataraxia.com.br/posts/removendo-o-generator-do-wordpress" title="Removendo o &#8220;generator&#8221; do Wordpress">Removendo o &#8220;generator&#8221; do Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/escrevendo-plugins-para-o-wordpress" title="Escrevendo plugins para o Wordpress">Escrevendo plugins para o Wordpress</a></li><li><a href="http://www.ataraxia.com.br/posts/evitando-sql-injection-em-php" title="Evitando SQL injection em PHP">Evitando SQL injection em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/criando-captchas-em-php" title="Criando CAPTCHAs em PHP">Criando CAPTCHAs em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/pegadinhas-no-php" title="Pegadinhas no PHP">Pegadinhas no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/otimizacao-em-php-parte-1-minify" title="Otimização em PHP, parte 1: Minify">Otimização em PHP, parte 1: Minify</a></li><li><a href="http://www.ataraxia.com.br/posts/precedencia-no-php" title="Precedência no PHP">Precedência no PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/envio-de-emails-em-php" title="Envio de emails em PHP">Envio de emails em PHP</a></li><li><a href="http://www.ataraxia.com.br/posts/seguranca-no-envio-de-emails" title="Segurança no envio de emails em PHP">Segurança no envio de emails em PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.ataraxia.com.br/posts/validacao-de-dados-em-php/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

