<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Oscar Dias - Blog Pessoal</title>
	
	<link>http://oscardias.com/br</link>
	<description>Desenvolvimento de Software e Assuntos Relacionados</description>
	<lastBuildDate>Wed, 16 May 2012 22:43:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/oscardias/br" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="oscardias/br" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">oscardias/br</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Criando um App usando CodeIgniter (Parte 1): Introdução</title>
		<link>http://oscardias.com/br/desenvolvimento/php/codeigniter/criando-um-app-usando-codeigniter-parte-1-introducao/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/codeigniter/criando-um-app-usando-codeigniter-parte-1-introducao/#comments</comments>
		<pubDate>Wed, 16 May 2012 22:43:03 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Quadro de Tarefas]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=257</guid>
		<description><![CDATA[Semana passada eu escrevi sobre um pequeno aplicativo desenvolvido utilizando CodeIgniter chamado Simple Task Board. Ele é capaz de gerenciar projetos e tarefas, sendo muito simples, especialmente agora que está na primeira versão. Então achei que seria uma boa ideia explicar como ele foi feito. Essa explicação vai se estender por alguns artigos, começando hoje com uma introdução sobre CodeIgniter [...]]]></description>
			<content:encoded><![CDATA[<p><em><a title="Projeto em PHP: Simple Task Board" href="http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/">Semana passada</a> eu escrevi sobre um pequeno aplicativo desenvolvido utilizando CodeIgniter chamado Simple Task Board. Ele é capaz de gerenciar projetos e tarefas, sendo muito simples, especialmente agora que está na primeira versão. Então achei que seria uma boa ideia explicar como ele foi feito. Essa explicação vai se estender por alguns artigos, começando hoje com uma introdução sobre CodeIgniter e sobre a aplicação em si.</em></p>
<p><span id="more-257"></span></p>
<h1>Introdução</h1>
<p><a title="CodeIgniter" href="http://codeigniter.com/">CodeIgniter</a> é um Framework MVC (model-view-controller, ou modelo-visão-controlador) para PHP muito level. Isso significa que ele possui diversas funções que ajudam a organizar e acelerar o processo de desenvolvimento de aplicações web. Além disso ele é bem simples quando comparado com outros frameworks.</p>
<p>A comunidade envolvida com um framework também deve ser levada em consideração ao se escolher. CodeIgniter tem uma comunidade bem ativa (em inglês e em português) e um bom guia de usuário, então é fácil encontrar a informação que precisar. Vou explicar o que MVC significa.</p>
<h3>Model-View-Controller</h3>
<p>Traduzindo, ficaria Modelo-Visão-Controlador). É um design pattern que divide a aplicação em três partes:</p>
<ul>
<li>Modelo: interação com o banco de dados e lógica de negócio. Operações CRUD (create, read, update, delete).</li>
<li>Visão: o que o usuário vê. Nosso HTML.</li>
<li>Controlador: lógica da aplicação e tratamento de input. O controlador utiliza o modelo para buscar/registrar informações no banco de dados e chama as visões necessárias para exibir para o usuário.</li>
</ul>
<p>Numa explicação simplória, é uma arquitetura ou modelo para estruturar sua aplicação. Para quem já trabalhou com aplicações em PHP puro que tratam inputs no mesmo arquivo que possui o HTML, incluem conexões com banco de dados e executam operações de banco, trabalhar com um framework MVC é extremamente bom. No início pode parecer complicado, mas com um pouquinho de tempo para entender a simplicidade e organização do código, você não vai mais trabalhar sem ele.</p>
<h1>Estrutura e Arquivos</h1>
<p>A instalação do CodeIgniter tem uma estrutura padrão. Isso pode ser alterado mudando alguns arquivos, mas para esse aplicativo vamos  manter os diretórios como estão. Então vá para <a title="CodeIgniter" href="http://www.codeigniter.com">http://www.codeigniter.com</a> e baixe a última versão (atualmente 2.1.0). Descomprima o conteúdo na pasta que você escolher. Isso é o que você vai ver:</p>
<ul class="directory">
<li class="directory">application</li>
<li class="directory">system</li>
<li class="directory">user_guide</li>
<li class="phpfile">index.php</li>
<li class="genericfile">license.txt</li>
</ul>
<p>O arquivo <em>index.php<em> indica o ambiente (desenvolvimento, produção, etc) e as pastas de sistema e aplicação. Então, se você quiser, você pode renomear essas pastas para outra coisa e modificar esses valores no arquivo <em>index.php<em>. Isso ajuda na segurança do seu aplicativo.</em></em></em></em></p>
<p>O arquivo <em>license.txt</em> contém o acordo de uso do CodeIgniter.</p>
<h3>application</h3>
<p>Nesta pasta ficam todas as informações específicas da aplicação. As subpastas mais importantes, onde você vai trabalhar mais, são:</p>
<ul class="directory">
<li class="directory">config: configuração do app. Dados de acesso ao banco de dados, auto carregamento de bibliotecas e helpers, rotas, etc.</li>
<li class="directory">controllers: controladores do app. Cada controlador é uma classe PHP que estende a classe CI_Controller. Para acessar o controlador é só você acessar server/controller_name no seu navegador.</li>
<li class="directory">models: modelos para acessar o banco de dados. Os modelos também são classes, mas elas estendem a classe CI_Model.</li>
<li class="directory">views: todas as suas visões estarão aqui.</li>
</ul>
<p>Existem várias outras subpastas, como libraries (bibliotecas) e helpers, onde você pode adicionar suas classes específicas e suas funções.</p>
<h3>system</h3>
<p>Este diretório contém a &#8220;engine&#8221; do CodeIgniter. Todas as bibliotecas do sistema estão aqui, então você não precisa se preocupar com o que está aqui..</p>
<h3>user_guide</h3>
<p>Como você deve estar imaginando, nesta pasta está o guia do usuário que acompanha o CodeIgniter. Você pode remover esta pasta ou manter ela em um local separa para referências futuras. Voce pode visitar este <a title="CodeIgniter User Guide" href="http://codeigniter.com/user_guide/">guia do usuário online</a> também.</p>
<h1>Fluxo Simplificado</h1>
<p>Este é um fluxo simplificado para explicar como um cenário simples funciona.</p>
<p style="text-align: center;"><a href="http://oscardias.com/wp-content/uploads/2012/05/CodeIgniter-Flow.png"><img class="size-medium wp-image-283 aligncenter" title="CodeIgniter Flow" src="http://oscardias.com/wp-content/uploads/2012/05/CodeIgniter-Flow-300x203.png" alt="" width="300" height="203" /></a></p>
<p>Nesse exemplo nós estamos acessando um usuário para editar seus detalhes. O CodeIgniter trata as URLs de uma maneira simples, utilizando a primeira parte como o nome do controlador e a próxima como o método. Outras partes podem ser parâmetros do método. Se o controlador não for definido, o controlador padrão será executado (isso é definido no diretório config). Se o método não estiver definido, o método index será utilizado por padrão.</p>
<p>Eu vou explicar em detalhe como nós fazemos cada coisa nos próximos artigos. O meu objetivo é ir passo a passo, explicando como o CodeIgniter funciona em situações práticas. Agora deixe-me explicar o que será o aplicativo que estaremos desenvolvendo.</p>
<h1>Simple Task Board</h1>
<p>O aplicativo que estaremos criando é o Simple Task Board (traduzindo, Quadro de Tarefas Simples). Ele está disponível <a title="Projeto em PHP: Simple Task Board" href="http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/">aqui neste blog</a> e também no <a title="Repositório GitHub" href="https://github.com/oscardias/Simple-Task-Board">GitHub</a>. Foi criado por mim mesmo, para me ajudar a organizar meus projetos pessoais. Eu decidi disponibilizá-lo aqui para poder fazer melhorias e, talvez, usar ele para gerenciar os projetos na minha empresa. Como eu não preciso e não quero perder muito tempo gerenciando os projetos, eu não preciso de muitas funcionalidades. Eu acabo usando um agile board ou simples planilhas. Por isso o Simple Task Board poderia ser customizado para compreender apenas as necessidades mais básicas, sendo ao mesmo tempo simples e útil.</p>
<h1>Conclusão</h1>
<p>Isso é tudo para a Introdução. Já fiz uma nova instalação do CodeIgniter na minha máquina local, então estou pronto para dar início no tutorial passo a passo. Na próxima semana vou preparar a parte 2 do tutorial. Tenha um bom resto de semana.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=jeuqHgQpHQ0:HMPhjOzAA4Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=jeuqHgQpHQ0:HMPhjOzAA4Y:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=jeuqHgQpHQ0:HMPhjOzAA4Y:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=jeuqHgQpHQ0:HMPhjOzAA4Y:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/codeigniter/criando-um-app-usando-codeigniter-parte-1-introducao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projeto em PHP: Simple Task Board</title>
		<link>http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/#comments</comments>
		<pubDate>Fri, 04 May 2012 16:07:25 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Gerenciamento de Projetos]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Quadro de Tarefas]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=235</guid>
		<description><![CDATA[Simple Task Board é um aplicativo para gerenciamento de tarefas bem simples. Ele é destinado a pessoas como eu, que não precisam de várias funcionalidades dessas ferramentas mais complexas e/ou não querem pagar por isso. Além disso é mais uma ferramenta de gerenciamento, criado a partir do zero e open source, onde qualquer um pode [...]]]></description>
			<content:encoded><![CDATA[<p><em>Simple Task Board é um aplicativo para gerenciamento de tarefas bem simples. Ele é destinado a pessoas como eu, que não precisam de várias funcionalidades dessas ferramentas mais complexas e/ou não querem pagar por isso. Além disso é mais uma ferramenta de gerenciamento, criado a partir do zero e open source, onde qualquer um pode participar dando idéias e fazendo suas próprias modificações. Quem sabe com a ajuda de outras pessoas podemos evoluir esse app para atender as necessidades mais comuns sem deixar ele muito complicado. Esse post vai funcionar como um repositório de informações, sendo uma porta de entrada para o <a title="Repositório GitHub Simple Task Board" href="https://github.com/oscardias/Simple-Task-Board">repositório GitHub</a>.</em></p>
<p><span id="more-235"></span></p>
<h1>Introdução</h1>
<p>Criado utilizando o CodeIgniter, a ideia é que este aplicativo permaneça simples, compreendendo apenas os requisitos mais básicos de um gerenciador de tarefas. Seu objetivo é auxilias no processo de gerenciamento de projetos.</p>
<p class="simplenote">Essa é a primeira versão &#8220;usável&#8221; deste aplicativo. Portanto utilize somente para testes e para aprender.</p>
<p>A versão atual é a 1.0. Mas ela ainda está em desenvolvimento e não está completamente testada. Deve ser utilizada para testes e se você quiser aprender um pouco mais sobre CodeIgniter. Nas próximas seções eu vou falar sobre os seguintes tópicos:</p>
<ul>
<li>Instalação</li>
<li>Capturas de Tela</li>
<li>Atualizações Futuras</li>
<li>Download</li>
</ul>
<h2>Instalação</h2>
<p>Crie o banco de dados utilizando db/create.sql, coloque os arquivos no seu servidor e atualize o seguinte:</p>
<ul>
<li>application/config/config.php: atualize $config['base_url'] com a sua URL.</li>
<li>application/config/database.php: atualize as informações do seu banco de dados.</li>
</ul>
<p>Execute &lt;servidor&gt;/install (onde &lt;servidor&gt; deve ser o seu localhost ou domínio/diretório).<br />
Se você tiver algum problema é só avisar.</p>
<h2>Capturas de Tela</h2>

<a href='http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/attachment/task-board-dashboard/' title='Task Board   Dashboard'><img width="150" height="150" src="http://oscardias.com/br/wp-content/uploads/2012/05/Task-Board-Dashboard-150x150.png" class="attachment-thumbnail" alt="Task Board   Dashboard" title="Task Board   Dashboard" /></a>
<a href='http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/attachment/task-board-edit-task-2/' title='Task Board   Edit Task  2'><img width="150" height="150" src="http://oscardias.com/br/wp-content/uploads/2012/05/Task-Board-Edit-Task-2-150x150.png" class="attachment-thumbnail" alt="Task Board   Edit Task  2" title="Task Board   Edit Task  2" /></a>
<a href='http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/attachment/task-board-login/' title='Task Board   Login'><img width="150" height="150" src="http://oscardias.com/br/wp-content/uploads/2012/05/Task-Board-Login-150x150.png" class="attachment-thumbnail" alt="Task Board   Login" title="Task Board   Login" /></a>
<a href='http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/attachment/task-board-project-test/' title='Task Board   Project  Test'><img width="150" height="150" src="http://oscardias.com/br/wp-content/uploads/2012/05/Task-Board-Project-Test-150x150.png" class="attachment-thumbnail" alt="Task Board   Project  Test" title="Task Board   Project  Test" /></a>

<h2>Atualizações Futuras</h2>
<p>Eu planejo continuar atualizando algumas partes desse aplicativo nos próximos meses. Atualmente, a lista de atualizações sé a seguinte:</p>
<ul>
<li>Comentário nas tarefas: adicionar comentários em cada tarefa.</li>
<li>Nível de usuário: implementar a verificação do nível do usuário e permitir acesso somente as funcionalidades corretas.</li>
<li>Perfil do usuário: criar um perfil de usuário com mais informações sobre o usuário.</li>
<li>Histórico das tarefas: registrar oque acontece com cada tarefa e quanto tempo ela leva em cada fase.</li>
<li>Estimativa das tarefas: adicionar um campo de estimativa para permitir comparar o estimado e o realizado.</li>
<li>&#8230; se você tiver outras idéias, poste nos comentários &#8230;</li>
</ul>
<h2>Download</h2>
<p class="downloadnote">Se você quiser baixar este projeto, por favor vá para o <a title="Repositório GitHub Simple Task Board" href="https://github.com/oscardias/Simple-Task-Board">repositório GitHub</a>. Desta maneira você pode baixar a última versão.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=s9svgH02UCM:nVgrNLqZ5o4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=s9svgH02UCM:nVgrNLqZ5o4:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=s9svgH02UCM:nVgrNLqZ5o4:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=s9svgH02UCM:nVgrNLqZ5o4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/codeigniter/projeto-em-php-simple-task-board/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projeto em PHP: My Trip Emission</title>
		<link>http://oscardias.com/br/desenvolvimento/php/projeto-em-php-my-trip-emission/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/projeto-em-php-my-trip-emission/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 23:49:09 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[aquecimento global]]></category>
		<category><![CDATA[emissão de CO2]]></category>
		<category><![CDATA[Google Maps]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=228</guid>
		<description><![CDATA[Depois de um ano na Austrália, estou de volta ao Brasil. Está na hora de trazer este blog de volta a vida. Então vou começar escrevendo sobre uma aplicação PHP que fiz alguns anos atrás chamada My Trip Emission. É uma aplicação que informa a emissão de CO2 de sua viagem, você só precisa selecionar [...]]]></description>
			<content:encoded><![CDATA[<p><em>Depois de um ano na Austrália, estou de volta ao Brasil. Está na hora de trazer este blog de volta a vida. Então vou começar escrevendo sobre uma aplicação PHP que fiz alguns anos atrás chamada My Trip Emission. É uma aplicação que informa a emissão de CO2 de sua viagem, você só precisa selecionar um modelo de carro e a sua viagem (de &#8211; para). Essa aplicação foi desenvolvida em PHP utilizando jQuery e a API do Google Maps.</em></p>
<p><span id="more-228"></span></p>
<h1>Introdução</h1>
<p>My Trip Emission é (ou era &#8211; o domínio não existe mais) uma aplicação que eu desenvolvi que permite ao usuário detectar a emissão de CO2 baseado numa viagem definida no Google Maps e na seleção de um automóvel. Foi desenvolvida em PHP, utilizando a API do Google Maps. Eu irei explicar a estrutura de diretórios e as partes mais importantes. Esse projeto é relativamente antigo para os padrões Web e não foi atualizado por um bom tempo, o que significa que o código pode estar utilizando versões antigas do PHP/jQuery/Google Maps API.</p>
<p style="text-align: center;"><a href="http://oscardias.com/wp-content/uploads/2012/04/mytripemission.png"><img class="size-medium wp-image-225 aligncenter" title="MyTripEmission" src="http://oscardias.com/wp-content/uploads/2012/04/mytripemission-300x147.png" alt="MyTripEmission" width="300" height="147" /></a></p>
<p class="downloadnote">Você pode baixar o projeto completo <a title="Arquivos do MyTripEmission" href="http://oscardias.com/wp-content/uploads/2012/04/mytripemission.zip">aqui</a>.</p>
<h1>Estrutura de Diretórios</h1>
<p>Este projeto é bem simples, com poucos arquivos, portanto vou mostrar a maioria deles aqui.</p>
<ul class="directory">
<li class="directory">css</li>
<ul class="directory">
<li class="cssfile">bkp_style.css</li>
<li class="cssfile">style.css</li>
<li class="cssfile">styleIE.css</li>
</ul>
<li class="directory">images</li>
<li class="directory">include</li>
<ul class="directory">
<li class="phpfile">config.php</li>
</ul>
<li class="directory">js</li>
<ul class="directory">
<li class="genericfile">jquery_cookies.js</li>
<li class="genericfile">scripts.js</li>
</ul>
<li class="phpfile">about.php</li>
<li class="phpfile">contact.php</li>
<li class="phpfile">contact_sent.php</li>
<li class="genericfile">favicon.ico</li>
<li class="phpfile">get_emission.php</li>
<li class="phpfile">get_model.php</li>
<li class="phpfile">get_version.php</li>
<li class="phpfile">help.php</li>
<li class="phpfile">index.php</li>
<li class="genericfile">mytripemission.sql</li>
<li class="genericfile">robots.txt</li>
<li class="genericfile">sitemap.xml</li>
</ul>
<h2>Diretório CSS</h2>
<p>Esse diretório incluí três arquivos. bkp_style.css e style.css são o mesmo arquivo, mas o style.css está &#8220;minificado&#8221;. styleIE.css tem estilos específicos para o IE. Eu não vou explicar os detalhes de estilo aqui. Se você quer mais informações, me avise nos comentários.</p>
<h2>Diretório Images</h2>
<p>Apenas imagens&#8230;</p>
<h2>Diretório Include</h2>
<p>O diretório include contém o arquivo config.php, que faz a conexão com o banco de dados. Você precisa atualizar esse arquivo com as informações do seu banco de dados. Além disso, esse arquivo define duas funções, chamadas cleanInput($input) e sanitize($input), que são responsáveis por limpar a varíavel GET e garantir que nenhuma string incorreta vá para o banco de dados.</p>
<pre class="brush: php; title: ; notranslate">
// Database information
$db_user = 'root';
$db_pass = '';
$db_host = 'localhost';
$db_name = 'mytripemission';

// Database connection
$dbc = mysql_connect($db_host, $db_user, $db_pass) OR die('It was not possible to connect to MySQL: ' . mysql_error());
mysql_select_db ($db_name) OR die('It was not possible to select the database: ' . mysql_error());

define('BASE_URL', 'http://localhost/mytripemission/');

// Cleaning function
function cleanInput($input) {

    $search = array(
        '@&lt;script[^&gt;]*?&gt;.*?&lt;/script&gt;@si',   // Strip out javascript
        '@&lt;[\/\!]*?[^&lt;&gt;]*?&gt;@si',            // Strip out HTML tags
        '@&lt;style[^&gt;]*?&gt;.*?&lt;/style&gt;@siU',    // Strip style tags properly
        '@&lt;![\s\S]*?--[ \t\n\r]*&gt;@'         // Strip multi-line comments
    );

    $output = preg_replace($search, '', $input);
    return $output;
}
// Sanitizing function
function sanitize($input) {
    if (is_array($input)) {
        foreach($input as $var=&gt;$val) {
            $output[$var] = sanitize($val);
        }
    }
    else {
        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        $input  = cleanInput($input);
        $output = mysql_real_escape_string($input);
    }
    return $output;
}
</pre>
<h2>Diretório JS</h2>
<p>Contém arquivos JavaScript. jquery_cookies.js é um plugin para tratar cookies para jQuery desenvolvido por Klaus Hartl. Ele é utilizado em outro arquivo deste diretório, scripts.js. Esse arquivo trata diferentes eventos e é importante para o funcionamento do aplicativo, portanto vou explicar algumas coisas.<br />
A primeira parte é baseada nos exemplos da API do Google Maps e é responsável por gerar o mapa e alguns eventos.</p>
<pre class="brush: jscript; title: ; notranslate">
var map;
var gdir;

function initialize() {
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById(&quot;map_canvas&quot;));
    map.setCenter(new GLatLng(geoip_latitude(), geoip_longitude()), 10);
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.enableScrollWheelZoom();
    gdir = new GDirections(map, document.getElementById(&quot;directions&quot;));
    GEvent.addListener(gdir, &quot;load&quot;, onGDirectionsLoad);
    GEvent.addListener(gdir, &quot;error&quot;, handleErrors);
  }
}

function setDirections(fromAddress, toAddress, locale) {
  gdir.load(&quot;from: &quot; + fromAddress + &quot; to: &quot; + toAddress,
            { &quot;locale&quot;: locale });
}

function handleErrors(){
       if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
         alert(&quot;No corresponding geographic location could be found for one of the specified addresses. This may be due to the fact that the address is relatively new, or it may be incorrect.\nError code: &quot; + gdir.getStatus().code);

       else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
         alert(&quot;A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: &quot; + gdir.getStatus().code);

       else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
         alert(&quot;The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: &quot; + gdir.getStatus().code);

       else if (gdir.getStatus().code == G_GEO_BAD_KEY)
         alert(&quot;The given key is either invalid or does not match the domain for which it was given. \n Error code: &quot; + gdir.getStatus().code);

       else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
         alert(&quot;A directions request could not be successfully parsed.\n Error code: &quot; + gdir.getStatus().code);

       else alert(&quot;An unknown error occurred.&quot;);

}

function onGDirectionsLoad(){
    distance = gdir.getDistance().meters;

    // Get value for emission
    $.ajax({
        type: 'GET',
        url: 'get_emission.php',
        data: 'manufact=' + $('#manufact').val() + '&amp;model=' + $('#model').val() +
              '&amp;version=' + $('#version').val() + '&amp;meters=' + distance +
              '&amp;fuel_uom=' + $.cookie('fuel_uom'),
        success: function(result){
            $('#emissions').html(result);
        }
    });
}
</pre>
<p>A função setDirections(fromAddress, toAddress, locale) carrega a nova definição de viagem. A outra função interessante aqui é onGDirectionsLoad() porque ela chama o cálculo de emissões utilizando AJAX e exibe na barra lateral. A seguir mais algumas coisas nesse mesmo arquivo.</p>
<pre class="brush: jscript; title: ; notranslate">
/*
 * jQuery
 */
function setError(field) {
    if($(field).val() == 0) {
        $(field).animate({
        backgroundColor: 'red'
            }, 1000, function() {
            $(field).animate({
            backgroundColor: '#FFD1D1'
            }, 1000);
        });

        return false;
    }
    else {
        $(field).css('background-color','white');
        return true;
    }
}

function executeForm() {
    var ok = true;

    ok = setError('#manufact');
    ok = setError('#model');
    ok = setError('#version');
    ok = setError('#fromAddress');
    ok = setError('#toAddress');

    if(!ok) return false;

    // Set cookies
    $.cookie('manufacturer',$('#manufact').val(), { expires: 30 });
    $.cookie('model',$('#model').val(), { expires: 30 });
    $.cookie('version',$('#version').val(), { expires: 30 });
    $.cookie('fromAddress',$('#fromAddress').val(), { expires: 30 });
    $.cookie('toAddress',$('#toAddress').val(), { expires: 30 });

    // Define directions according to language
    if($.cookie('language')){
        setDirections($('#fromAddress').val(), $('#toAddress').val(), $.cookie('language'));
    } else {
        setDirections($('#fromAddress').val(), $('#toAddress').val(), 'en_US');
    }

    return false;
}

function changeUom() {
    if ($.cookie('fuel_uom') == 'km/l') {
        $.cookie('fuel_uom','mpg_US', { expires: 180 });
    } else if ($.cookie('fuel_uom') == 'mpg_US') {
        $.cookie('fuel_uom','mpg_UK', { expires: 180 });
    } else if ($.cookie('fuel_uom') == 'mpg_UK') {
        $.cookie('fuel_uom','km/l', { expires: 180 });
    }

    $.ajax({
        type: 'GET',
        url: 'get_emission.php',
        data: 'manufact=' + $('#manufact').val() + '&amp;model=' + $('#model').val() +
            '&amp;version=' + $('#version').val() + '&amp;meters=' + distance +
            '&amp;fuel_uom=' + $.cookie('fuel_uom'),
        success: function(result){
            $('#emissions').html(result);
        }
    });
}
</pre>
<p>Essa seção mostra duas outras funções importantes. A função executeForm() vai verificar por erros no formulário, definir cookies (para que o usuário não precise definir as informações novamente na próxima vez que visitar o site) e executar a função setDirections(), que vai rodar a API do Google Maps.<br />
A segunda função é changeUom(), que atualiza o cookie da unidade de medida e faz uma chamada AJAX para atualizar o HTML das emissões na barra lateral. O resto do código são eventos do jQuery.</p>
<pre class="brush: jscript; title: ; notranslate">
// Change window and DIV's width and height on resize
$(window).resize(
    function(){
        $('#container').css('height',($(window).height()-26)+'px');
        if($(window).width() &gt; 734){
            $('#container').css('width',($(window).width()-3)+'px');
        } else {
            $('#container').css('width','730px');
        }
        $('#sidebar').css('height',($('#container').height()-$('#header').height())+'px');
        $('#directions').css('height',($('#sidebar').height()-150)+'px');
        $('#map_canvas').css('height',($('#container').height()-$('#header').height())+'px');
        $('#map_canvas').css('width',($('#container').width()-310)+'px');
    }
);
</pre>
<p>Esta parte redimensiona o mapa, fazendo com que ele caiba na tela corretamente. Finalmente nós chegamos no evento quando o documento está pronto, que inicializa algumas coisas e adiciona alguns eventos.</p>
<pre class="brush: jscript; title: ; notranslate">
$(document).ready(function(){
    // Hide scrollbars
    $(&quot;body&quot;).css(&quot;overflow&quot;, &quot;hidden&quot;);

    // Initialize window and DIV's width and height
    $('#container').css('height',($(window).height()-26)+'px');
    if($(window).width() &gt; 734){
        $('#container').css('width',($(window).width()-3)+'px');
    } else {
        $('#container').css('width','730px');
    }
    $('#sidebar').css('height',($('#container').height()-$('#header').height())+'px');
    $('#directions').css('height',($('#sidebar').height()-150)+'px');
    $('#map_canvas').css('height',($('#container').height()-$('#header').height())+'px');
    $('#map_canvas').css('width',($('#container').width()-310)+'px');

    // Settings dialog
    $(&quot;#settings&quot;).dialog({
      bgiframe: true, autoOpen: false, height: 60, width: 400, modal: false, closeOnEscape: true
    });

    // Initialize settings from cookies
    if($.cookie('fuel_uom')) {
        $('#fuel_uom').val($.cookie('fuel_uom'));
    } else {
        $.cookie('fuel_uom', 'mpg_US', { expires: 180 });
    }

    if($.cookie('language')) {
        $('#language').val($.cookie('language'));
    } else {
        $.cookie('language', 'en_US', { expires: 180 });
    }

    // Initialize values - get cookies
    if($.cookie('manufacturer')) {
        $('#manufact').val($.cookie('manufacturer'));

        $.ajax({
            type: 'GET',
            url: 'get_model.php',
            data: 'manufact=' + $('#manufact').val(),
            success: function(result){
                $('#model').children().remove();
                $('#model').append('- Select -')
                           .append(result)
                           .removeAttr('disabled');

                if($.cookie('model')) {
                    $('#model').val($.cookie('model'));

                    $.ajax({
                        type: 'GET',
                        url: 'get_version.php',
                        data: 'manufact=' + $('#manufact').val() + '&amp;model=' + $('#model').val(),
                        success: function(result){
                            $('#version').children().remove();
                            $('#version').append('- Select -')
                                         .append(result)
                                         .removeAttr('disabled');

                            if($.cookie('version')) {
                                $('#version').val($.cookie('version'));
                            }
                        }
                    });
                }
            }
        });
    }

    // Vehicle selection ajax
    $('#manufact').change(
        function() {
            $.ajax({
                type: 'GET',
                url: 'get_model.php',
                data: 'manufact=' + $(this).val(),
                success: function(result){
                    $('#model').children().remove();
                    $('#model').append('- Select -')
                               .append(result)
                               .removeAttr('disabled');
                    $('#version').children().remove();
                    $('#version').append('- Select -')
                                 .attr('disabled', 'disabled');
                }
            });
        });

    $('#model').change(
        function() {
            $.ajax({
                type: 'GET',
                url: 'get_version.php',
                data: 'manufact=' + $('#manufact').val() + '&amp;model=' + $(this).val(),
                success: function(result){
                    $('#version').children().remove();
                    $('#version').append('- Select -')
                                 .append(result)
                                 .removeAttr('disabled');
                }
            });
        });

    // Check my trip button
    $('#check_btn').click(
        function() {
            return executeForm();
        });

    // Fuel unit of measure Cookie
    $('#fuel_uom').change(
        function() {
            $.cookie('fuel_uom',$('#fuel_uom').val(), { expires: 180 });
        });

    // Language Cookie
    $('#language').change(
        function() {
            $.cookie('language',$('#language').val(), { expires: 180 });
        });
});
</pre>
<p>Primeiro, o código faz o seguinte:</p>
<ul>
<li>Esconder as barras de scroll;</li>
<li>Inicializa o tamanho do mapa;</li>
<li>Define a tela de diálogo de configurações;</li>
<li>Inicializa tudo de acordo com os cookies.</li>
</ul>
<p>Os cookies manufacturer, model e version são inicializados um após o outro, porque eles dependem um do outro. Então primeiro buscamos o fabricante (manufacturer). Depois verificamos o banco de dados e o cookie para buscar o modelo (model). Concluímos verificando o banco novamente e o cookies para buscar a versão (version).<br />
A seguir, nós temos as chamadas AJAX para a seleção do veículo. Quando mudamos uma das dropdowns, nós verificamos o banco dedados para preencher as opções das outras dropdowns.<br />
No final temos os eventos para o clique no botão &#8220;Check my Trip&#8221; e a tela de configurações, com a unidade de medida e a linguagem. Agora vamos para o diretório raiz e falar sobre o código PHP.</p>
<h2>Diretório Raiz</h2>
<p>O diretório raiz contém arquivos simples como o about.php (informações básicas sobre o site), contact.php e contact_sent.php (o formulário de contato e a resposta), favicon.ico (icone do site), help.php (informação sobre como usar o site), mytripemission.sql (script de criação do banco de dados), robots.txt (define onde os mecanismos de busca podem ir) e o sitemap.xml. Eu vou explicar apenas os outros arquivos, que são mais interessantes.</p>
<h3>index.php</h3>
<p>O arquivo index é o onde está o HTML da página principal. Além do formulário, que controla a busca, ele também define os DIVs utilizados pelo JavaScript. Nesse arquivo eu também utilizei a constante BASE_URL que é definida no arquivo config.php. Você precisa lembrar de atualizar isso para que o aplicativo funcione.</p>
<h3>get_model.php e get_version.php</h3>
<p>Ambos arquivos são chamados via AJAX e são simples buscas ao banco de dados, buscando informações para preencher as dropdowns do arquivo index.php.<br />
 <strong>get_model.php</strong></p>
<pre class="brush: php; title: ; notranslate">
require_once 'include/config.php';

$_GET = sanitize($_GET);

$sql = 'SELECT id, name FROM model WHERE manufacturer='.$_GET['manufact'];
$res = mysql_query($sql);
while($row = mysql_fetch_array($res)) {
    echo ''.$row['name'].'';
}
</pre>
<p><strong>get_version.php</strong></p>
<pre class="brush: php; title: ; notranslate">
require_once 'include/config.php';

$_GET = sanitize($_GET);

$sql = 'SELECT id, name, trans_type FROM version
        WHERE manufacturer='.$_GET['manufact'].'
          AND model='.$_GET['model'];
$res = mysql_query($sql);
while($row = mysql_fetch_array($res)) {
    if($row['trans_type'] == 'M') {
        $transmission_type = 'Manual';
    } elseif($row['trans_type'] == 'A') {
        $transmission_type = 'Automatic';
    } else {
        $transmission_type = '';
    }

    echo ''.$row['name'].' '. $transmission_type.'';
}
</pre>
<h3>get_emission.php</h3>
<p>Esse é o arquivo onde o cálculo acontece. Vou explicar ele passo a passo.</p>
<pre class="brush: php; title: ; notranslate">
require_once 'include/config.php';

// Get emisison logic
$_GET = sanitize($_GET);

$fuel_uom = $_GET['fuel_uom'];
$distance = $_GET['meters'];

$vehicle = explode('-', $_GET['version']);
$version = $vehicle[0];
$trans_type = $vehicle[1];
</pre>
<p>Primeiro, nós solicitamos o arquivo config, que faz a conexão com o banco de dados e define a função sanitize(). Então começamos a lógica limpando a variável $_GET e atribuindo a unidade de medida, a distância e o veículo, que incluí a versão e o tipo de transmissão.</p>
<pre class="brush: php; title: ; notranslate">
// Get values for calulating vehicle green stars
$sql_stars = 'SELECT MAX( emission_co2 ) AS worse, MIN( emission_co2 ) AS best FROM version';
$res_stars = mysql_query($sql_stars) or die('Database error!');
$row_stars = mysql_fetch_array($res_stars);
$worse = $row_stars['worse'];
$best = $row_stars['best'];
$star_rate = ($worse - $best)/5; // Rate for each star
</pre>
<p>O código continua com a definição do que será uma emissão 5 estrelas. Para isso nós buscamos as emissões máxima e mínima do banco de dados e definimos um valor $star_rate baseados nesses valores.</p>
<pre class="brush: php; title: ; notranslate">
$sql = 'SELECT kml_urban, kml_extra, kml_combined, emission_co2
        FROM version
        WHERE manufacturer='.$_GET['manufact'].'
          AND model='.$_GET['model'].'
          AND id='.$version.'
          AND trans_type=\''.$trans_type.'\'';

$res = mysql_query($sql) or die($version.'-'.$trans_type);

$change_link = '
';

if ($row = mysql_fetch_array($res)) {
// Esse código está no próximo bloco
}
</pre>
<p>Depois, nós buscamos a informação do veículo selecionado. Como vamos retornar um código HTML, criamos o código $change_link, responsável pela alteração da unidade de medida. O próximo pedaço de código é o que vai dentro do último IF.</p>
<pre class="brush: php; title: ; notranslate">
    $litres = round(($distance/1000) / $row['kml_combined'], 2);
    $co2 = round((($distance/1000) * $row['emission_co2'])/1000, 2);
    $stars_num = round(($worse-$row['emission_co2'])/$star_rate, 0);
    if ($stars_num == 1) {
        $stars_txt = ' Star';
    } else {
        $stars_txt = ' Stars';
    }

    // Change unit of measure

    if ($fuel_uom == 'km/l') {
        echo '&lt;/pre&gt;
&lt;h1&gt;Consumption&lt;/h1&gt;
&lt;pre&gt; '.$litres.' litres ('.$row['kml_combined'].' km/l)';
        echo $change_link;
        echo '&lt;/pre&gt;
&lt;h1&gt;CO2 Emission&lt;/h1&gt;
&lt;pre&gt; '.$co2.' kg ('.$row['emission_co2'].' g/km)';
    } else if ($fuel_uom == 'mpg_US') {
        $gallons = round($litres * 0.264, 2);
        $mpg = round($row['kml_extra'] / 0.425, 2);
        echo '&lt;/pre&gt;
&lt;h1&gt;Consumption&lt;/h1&gt;
&lt;pre&gt; '.$gallons.' gallons ('.$mpg.' MPG (US))';
        echo $change_link;
        echo '&lt;/pre&gt;
&lt;h1&gt;CO2 Emission&lt;/h1&gt;
&lt;pre&gt; '.$co2.' kg ('.$row['emission_co2'].' g/km)';
    } else if ($fuel_uom == 'mpg_UK') {
        $gallons = round($litres * 0.220, 2);
        $mpg = round($row['kml_extra'] / 0.354, 2);
        echo '&lt;/pre&gt;
&lt;h1&gt;Consumption&lt;/h1&gt;
&lt;pre&gt; '.$gallons.' gallons ('.$mpg.' MPG (Imp))';
        echo $change_link;
        echo '&lt;/pre&gt;
&lt;h1&gt;CO2 Emission&lt;/h1&gt;
&lt;pre&gt; '.$co2.' kg ('.$row['emission_co2'].' g/km)';
    }

    echo '&lt;span class=&quot;fltrt&quot;&gt;';
 for ($i = 5; $i &gt;= 1; $i--) {
 if ($i echo '&lt;img title=&quot;'.$stars_num.$stars_txt.'&quot; src=&quot;'.BASE_URL.'images/star.png&quot; alt=&quot;'.$stars_num.$stars_txt.'&quot; /&gt;';
 } else {
 echo '&lt;img title=&quot;'.$stars_num.$stars_txt.'&quot; src=&quot;'.BASE_URL.'images/star_black.png&quot; alt=&quot;'.$stars_num.$stars_txt.'&quot; /&gt;';
 }

 }
 echo '&lt;/span&gt;';
</pre>
<p>Para finalizar, nesta parte nós começamos com o cálculo do consumo ($litres) e da emissão ($co2). Perceba que a distância foi dividida por 1000, para obtermos os km. Nós também calculamos o número de estrelas para a emissão atual, deste modo podemos fornecer uma pontuação para a emissão do veículo.<br />
Continuando, depois do comentário &#8220;Change unit of measure&#8221;, nós verificamos qual unidade de medida foi selecionada e criamos o HTML de acordo. Para concluir o HTML, nós também colocamos uma tag SPAN, que contém a pontuação.</p>
<h1>Conclusão</h1>
<p>Era isso que eu queria mostrar nessa reativação do blog. Esse pequeno projeto estava online até o ano passado, e achei que seria uma boa disponibilizar, caso alguém tenha interesse. Quando eu fiz eu tinha a intenção de adicionar mais dados e fazer com que o aplicativo fosse realmente &#8220;utilizável&#8221;, mas eu acabei mudando minhas prioridades&#8230; Enfim, ele está disponível de forma gratuita e aberta, mas se você utilizar, não esqueça de referenciar este post.<br />
Na próxima semana vou (tentar) escrever sobre um aplicativo de controle de tarefas que desenvolvi utilizando CodeIgniter. Ele já está <a title="Simple Task Board" href="https://github.com/oscardias/Simple-Task-Board">disponível no GitHub</a>, caso você esteja interessado.</p>
<p class="downloadnote">Você pode baixar o projeto completo <a title="Arquivos do MyTripEmission" href="http://oscardias.com/wp-content/uploads/2012/04/mytripemission.zip">aqui</a>.</p>
<div class="simplenote"><strong>Referências:</strong></p>
<p><a title="Google Maps API" href="https://developers.google.com/maps/">Google Maps API</a></p>
<p>VCACarfueldata &#8211; agora <a title="VCS Offices" href="http://www.dft.gov.uk/vca/fcb/carfueldata-tools-redirect-page.asp">aqui</a></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=AwZ1JjS7saw:3FDBTx1tIZc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=AwZ1JjS7saw:3FDBTx1tIZc:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=AwZ1JjS7saw:3FDBTx1tIZc:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=AwZ1JjS7saw:3FDBTx1tIZc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/projeto-em-php-my-trip-emission/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como Integrar o WordPress e o CodeIgniter</title>
		<link>http://oscardias.com/br/desenvolvimento/php/codeigniter/como-integrar-o-wordpress-e-o-codeigniter/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/codeigniter/como-integrar-o-wordpress-e-o-codeigniter/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 14:23:30 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[users]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=213</guid>
		<description><![CDATA[Depois de muito tempo sem escrever, estou recomeçando. Meu objetivo nos próximos artigos é escrever sobre o CodeIgniter. E a primeira coisa que quero mostrar é como integrar o CodeIgniter com o WordPress. Mais especificamente, vou mostrar como utilizar os usuários do WordPress dentro de uma aplicação CodeIgniter. A motivação para tal solução é o [...]]]></description>
			<content:encoded><![CDATA[<p><em>Depois de muito tempo sem escrever, estou recomeçando. Meu objetivo nos próximos artigos é escrever sobre o CodeIgniter. E a primeira coisa que quero mostrar é como integrar o CodeIgniter com o WordPress. Mais especificamente, vou mostrar como utilizar os usuários do WordPress dentro de uma aplicação CodeIgniter. A motivação para tal solução é o fato de você não precisar recriar o controle de usuários dentro da sua aplicação.</em></p>
<p><span id="more-213"></span></p>
<h1>Introdução</h1>
<p><a href="http://www.codeigniter.com">CodeIgniter</a> é um framework PHP &#8220;enxuto&#8221; desenvolvido para auxiliar no desenvolvimento de aplicativos web customizados. É um framework MVC que fornece a estrutura principal na qual podemos criar nossa aplicação. Mas caso você já tenha um website em WordPress e você queira criar um sistema usando CodeIgniter, seria muito bom poder reutilizar algumas funcionalidades do WordPress. Dessa maneira não seria necessário &#8220;reinventar a roda&#8221;. Um funcionalidade interessante de ser reutilizada é a gestão de usuários. No WordPress temos os detalhes do usuário, autenticação, níveis, etc. Então neste artigo vou mostrar como fazer isso.</p>
<p class="simplenote">Para este artigo estarei usando CodeIgniter 2.0.2 e WordPress 3.2.</p>
<h1>Preparando nossa Aplicação CodeIgniter</h1>
<p>Se você ainda não fez o download do CodeIgniter, por favor vá para esse <a href="http://codeigniter.com/downloads/">link</a>. Extraia o conteúdo do arquivo na raiz do WordPress e renomeie a pasta <em>CodeIgniter_2.0.2</em> para o nome que você quiser. Como o diretório vai estar dentro do WordPress, você acessará a aplicação em <em>www.youdomain.com/wordpress/codeigniter</em>. Você precisa tomar cuidado com o nome do diretório pois ele pode colidir com o nome das categorias do WordPress. Pode ser necessário customizar o arquivo <em>.htaccess</em> para poder acessar a aplicação.</p>
<p>Você poderia criar a aplicação CodeIgniter fora do diretório do WordPress. Mas seria necessário modificar o cookie path que o WordPress usa para autenticar os usuários.</p>
<p>Agora vamos para o código.</p>
<h1>Biblioteca WP Integration</h1>
<p>Existem diferentes maneiras de fazer a integração. Uma delas seria criar um Helper e definir as funções dentro dele. A outra opção é fazer orientado a objetos e criar uma biblioteca com a definição de uma classe. Essa foi a opção que eu escolhi e vou mostrar aqui. Vamos ver como a classe funciona passo a passo.</p>
<h3>1° Passo &#8211; Arquivo e Declaração da Classe</h3>
<p>Primeiro vamos criar um novo arquivo chamado <em>Wpintegration.php</em> dentro do diretório <em>application/libraries</em>. Depois precisamos definir nossa classe dentro desse arquivo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;!--?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');&lt;br /--&gt;
/**
* Classe de Integração com o WordPress
*
* Essa classe possibilita o uso de funções do WordPress
*
* @author		Oscar Dias
* @link		http://oscardias.com/codeigniter/integrating-wordpress-with-codeigniter
*/
class Wpintegration {

    //
    // Nosso código vai aqui!!!
    //

}
/* Fim do arquivo Wpintegration.php */
</pre>
<h3>2° Passo &#8211; Construtor da Classe</h3>
<p>Vamos definir um método construtor para nossa classe. Esse construtor vai definir algumas variáveis globais (usadas pelas funções do WordPress) e incluir o arquivo <em>wp-load.php</em>. Esse arquivo faz a inicialização de todo o WordPress. Eu deixei algumas variáveis adicionais que encontrei durante meus testes comentadas dentro do método. Eu não tenho certeza, mas acho que dependendo das funções que forem utilizadas, outras variáveis possam ser necessárias.</p>
<pre class="brush: php; title: ; notranslate">
    public function __construct() {
        global $table_prefix, $wp_embed, $wp_widget_factory, $_wp_deprecated_widgets_callbacks, $wp_locale, $wp_rewrite;
        // Variáveis adicionais do WordPress
        //$wpdb, $current_user, $auth_secure_cookie, $wp_roles, $wp_the_query, $wp_query, $wp, $_updated_user_settings,
        //$wp_taxonomies, $wp_filter, $wp_actions, $merged_filters, $wp_current_filter, $wp_registered_sidebars,
        //$wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates, $_wp_deprecated_widgets_callbacks,
        //$posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_version, $id, $comment, $user_ID;

        require_once '../wp-load.php';
    }
</pre>
<h3>3° Passo &#8211; Métodos para Gerenciamento de Usuários</h3>
<p>Para finalizar nossa classe, nós vamos definir alguns métodos que vão retornar informações sobre o usuário. Algumas coisas que queremos do WordPress são saber se o usuário está logado, se ele é super admin e alguns links do blog: login, logout, blog e área de administração do WordPress.</p>
<ul>
<li>O primeiro método que vamos criar é <em>isLoggedIn()</em>. É um método bem simples que vai retornar o resultado da função do WordPress <em>is_user_logged_in()</em>. Como você pode imaginar, será true ou false.
<pre class="brush: php; title: ; notranslate">
    public function isLoggedIn()
    {
        return is_user_logged_in();
    }
</pre>
</li>
<li>O próximo método que vamos criar é para saber quando o usuário é super admin. Vamos usar a função <em>wp_ge_current_user()</em> e retornar true quanto o nível do usuário for maior que 10. Você pode simplesmente retornar o nível do usuário e controlar esses níveis na sua aplicação CodeIgniter. No meu caso eu só estou interessado em saber se o usuário é super admin.
<pre class="brush: php; title: ; notranslate">
    public function isSuperAdmin()
    {
        if(wp_get_current_user()-&gt;user_level &gt;= 10)
            return true;
        else
            return false;
    }
</pre>
</li>
<li>Os métodos <em>loginLink()</em> e <em>logoutLink()</em> vão retornar os links para login e logout. Esses links vão levar para as páginas de login e logout do WordPress, mas eles vão utilizar o parâmetro redirect_to, que vai possuir o link para a nossa aplicação. Então, após efetuar o login (ou logou), você será redirecionado para o aplicativo CodeIgniter. Nesses dois métodos nós utilizamos a instância do CodeIgniter para carregar um helper. Esse helper é o <em>&#8216;ci_url&#8217;</em>, que é uma cópia do helper URL do CodeIgniter com algumas modificações que vou explicar depois. A função <em>current_url()</em> está definida dentro deste helper.
<pre class="brush: php; title: ; notranslate">
    public function loginLink()
    {
        $CI = &amp; get_instance();
        $CI-&gt;load-&gt;helper('ci_url');
        $redirect = current_url();

        return wp_login_url().&quot;?redirect_to=$redirect&quot;;
    }

    public function logoutLink()
    {
        $CI = &amp; get_instance();
        $CI-&gt;load-&gt;helper('ci_url');
        $redirect = current_url();

        return wp_logout_url().&quot;&amp;redirect_to=$redirect&quot;;
    }
</pre>
</li>
<li>Os próximos métodos são praticamente os mesmos. Eles retornam os links para o blog e para a área de administração. Isso é útil para poder adicionar o link para o blog diretamente do nosso aplicativo.
<pre class="brush: php; title: ; notranslate">
    public function blogLink()
    {
        return get_option('siteurl');
    }

    public function adminLink()
    {
        return get_option('siteurl') . &quot;/wp-admin&quot;;
    }
</pre>
</li>
</ul>
<h1>Mudanças no CodeIgniter</h1>
<p>No momento que incluímos o arquivo <em>wp-load.php</em>, diversas funções foram incluídas. Então precisamos tomar cuidado com os possíveis conflitos causados por redefinição de funções. Para mostrar um exemplo, estou utilizando o helper URL do CodeIgniter. Esse helper possui as funções <em>site_url()</em> e <em>base_url()</em>, que também existem dentro do WordPress. Então eu apenas copiei todo esse helper para o diretório de helpers dentro da nossa aplicação. Depois eu modifiquei as funções que estavam causando conflito, renomeando elas para <em>ci_site_url()</em> e <em>ci_base_url()</em>. Também foi necessário alterar onde ssas funções são chamadas, dentro da função <em>anchor()</em>, <em>anchor_popup()</em> e <em>redirect()</em>. Eu utilizei o helper URL como um exemplo. Mas dependendo do que você utilizar, pode ser necessário modificar outras funções.</p>
<h1>Conclusão</h1>
<p>Essa integração não é a mais &#8220;limpa&#8221; de todas, já que o WordPress e o CodeIgniter não foram criados para funcionar juntos. Mas é bem interessante poder criar uma aplicação web podendo utilizar componentes já desenvolvidos no WordPress. Espero que possa ser útil. Se você tiver idéias ou comentários, deixe sua mensagem.</p>
<p class="simplenote">Quando escrevi esse artigo em inglês, a versão do 3.2 do WordPress não estava disponível, por isso foi necessário fazer algumas alterações no WordPress. Mas com a versão 3.2 ficou mais fácil fazer a integração.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=XHSrDuNSrRM:QQHNnZftORY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=XHSrDuNSrRM:QQHNnZftORY:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=XHSrDuNSrRM:QQHNnZftORY:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=XHSrDuNSrRM:QQHNnZftORY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/codeigniter/como-integrar-o-wordpress-e-o-codeigniter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como Adicionar um Campo Extra nos Comentários do WordPress</title>
		<link>http://oscardias.com/br/desenvolvimento/php/wordpress/como-adicionar-um-campo-extra-nos-comentarios-do-wordpress/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/wordpress/como-adicionar-um-campo-extra-nos-comentarios-do-wordpress/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 02:20:14 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[comentário]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[discussão]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[nota]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=201</guid>
		<description><![CDATA[Nesse artigo vou mostrar como adicionar um campo de avaliação do post nos comentários do WordPress. Nós vamos trabalhar com PHP para habilitar o novo campo e exibir ele no modelo dos comentários. Também vamos criar alguns estilos para o nosso sistema de avaliação. Para terminar, vamos criar um JavaScript usando jQuery para ativar o sistema.]]></description>
			<content:encoded><![CDATA[<p><em>Nesse artigo vou mostrar como adicionar um campo de avaliação do post nos comentários do WordPress. Nós vamos trabalhar com PHP para habilitar o novo campo e exibir ele no modelo dos comentários. Também vamos criar alguns estilos para o nosso sistema de avaliação. Para terminar, vamos criar um JavaScript usando jQuery para ativar o sistema.</em></p>
<p><span id="more-201"></span></p>
<h1>Introdução</h1>
<p>Nesse artigo vamos criar um sistema de avaliação em quatro passos:</p>
<ul>
<li>Adicionar meta dados no comentário</li>
<li>Atualizar modelo dos comentários</li>
<li>Adicionar novos estilos CSS</li>
<li>Adicionar novo JavaScript</li>
<li>Como Exibir a Média das Avaliações (atualização)</li>
</ul>
<p>Então vamos ao que interessa.</p>
<h2>Meta Dados</h2>
<p>A primeira coisa que precisamos fazer é abrir o arquivo <em>functions.php</em> do seu tema e adicionar o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
add_action('comment_post','comment_ratings');

function comment_ratings($comment_id) {
    add_comment_meta($comment_id, 'rate', $_POST['rate']);
}
</pre>
<p>Como você pode ver é bem simples. Nós estamos adicionando a ação que será executada quando o comentário for postado. Dentro da função <em>comment_ratings</em>, nós estamos adicionando a nova informação aos meta dados do comentários. Nesse caso eu adicionei o campo <em>rate</em> com o valor que foi postado no campo com o mesmo nome.</p>
<p>Agora precisamos adicionar o campo <em>rate</em> no modelo dos comentários.</p>
<h2>Modelo dos Comentários</h2>
<p>Nós precisamos adicionar o campo em dois lugares: onde exibimos os comentários e onde o visitante digita seu comentário. Como já estamos no arquivo <em>functions.php</em>, vamos adicionar a seguinte função (é a mesma encontrada no WordPress Codex, mais o campo de avaliação):</p>
<pre class="brush: php; title: ; notranslate">
function comment_template($comment, $args, $depth) {
    $GLOBALS['comment'] = $comment; ?&gt;
    &lt;li &lt;?php comment_class(); ?&gt; id=&quot;li-comment-&lt;?php comment_ID() ?&gt;&quot;&gt;
        &lt;div id=&quot;comment-&lt;?php comment_ID(); ?&gt;&quot;&gt;
            &lt;div class=&quot;comment-author vcard&quot;&gt;
                &lt;?php echo get_avatar($comment,$size='48'); ?&gt;

                &lt;?php printf(__('&lt;cite class=&quot;fn&quot;&gt;%s&lt;/cite&gt; &lt;span class=&quot;says&quot;&gt;says:&lt;/span&gt;'), get_comment_author_link()) ?&gt;
            &lt;/div&gt;

            &lt;?php if ($comment-&gt;comment_approved == '0') : ?&gt;
            &lt;em&gt;&lt;?php _e('Your comment is awaiting moderation.') ?&gt;&lt;/em&gt;
            &lt;br /&gt;
            &lt;?php endif; ?&gt;

            &lt;div class=&quot;comment-meta commentmetadata&quot;&gt;&lt;a href=&quot;&lt;?php echo htmlspecialchars( get_comment_link( $comment-&gt;comment_ID ) ) ?&gt;&quot;&gt;&lt;?php printf(__('%1$s at %2$s'), get_comment_date(),  get_comment_time()) ?&gt;&lt;/a&gt;&lt;?php edit_comment_link(__('(Edit)'),'  ','') ?&gt;&lt;/div&gt;

            &lt;?php
            $rate = get_comment_meta($comment-&gt;comment_ID, 'rate');
            if ($rate[0] &lt;&gt; '') {
                _e('Grade: ');
                echo movie_grade($rate[0]);
            }
            ?&gt;

            &lt;?php comment_text() ?&gt;

            &lt;div class=&quot;reply&quot;&gt;
                &lt;?php comment_reply_link(array_merge( $args, array('depth' =&gt; $depth, 'max_depth' =&gt; $args['max_depth']))) ?&gt;
            &lt;/div&gt;
        &lt;/div&gt;
&lt;?php
}
</pre>
<p>Essa função será usada para exibir a lista de comentários. Nós adicionamos a chamada para a função <em>get_comment_meta</em> que vai retornar um array com a informação. Se estiver vazia, não vamos mostrar nada. Caso contrário vamos usar a seguinte função para exibir a avaliação do visitante:</p>
<pre class="brush: php; title: ; notranslate">
function movie_grade($grade) {
    switch ($grade) {
        case '0':
            $alt = 'Péssimo - 0 estrelas';
            break;
        case '1':
            $alt = 'Muito ruim - 1 estrela';
            break;
        case '2':
            $alt = 'Ruim - 2 estrelas';
            break;
        case '3':
            $alt = 'Bom - 3 estrelas';
            break;
        case '4':
            $alt = 'Muito bom - 4 estrelas';
            break;
        case '5':
            $alt = 'Excelente - 5 estrelas';
            break;
        default:
            $alt = 'Sem nota';
            break;
    }

    if (!isset($grade) || $grade == '')
        echo $alt;
    else {
        for ($i = 0; $i &lt; 5; $i++) {
            if ($grade &gt; $i)
                echo '&lt;img src=&quot;'.get_stylesheet_directory_uri().'/images/star_on.png&quot; alt=&quot;'.$alt.'&quot; title=&quot;'.$alt.'&quot; /&gt;';
            else
                echo '&lt;img src=&quot;'.get_stylesheet_directory_uri().'/images/star_off.png&quot; alt=&quot;'.$alt.'&quot; title=&quot;'.$alt.'&quot; /&gt;';
        }
    }
}
</pre>
<p>Nessa função estamos exibindo imagens de acordo com a avaliação. A última coisa que precisamos fazer para exibir a avaliação é utilizar nossa função na hora de exibir a lista de comentários no arquivo <em>comments.php</em>. Encontre a chamada para <em>wp_list_comments</em> e adicione o parâmetro &#8216;type=comment&amp;callback=comment_template&#8217;. Deve ficar assim:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php wp_list_comments('type=comment&amp;callback=comment_template'); ?&gt;
</pre>
<p>Isso vai fazer com que a lista de comentários seja exibida usando a função <em>comment_template</em> que criamos anteriormente. Para completar com o modelo dos comentários precisamos atualizar a entrada dos comentários. Precisamos adicionar o campo para avaliação na entrada dos dados. Vamos adicionar alguns links e fazer um efeito usando CSS depois para deixar mais funcional.</p>
<pre class="brush: php; title: ; notranslate">
&lt;div&gt;
    &lt;div class=&quot;comment-rating&quot;&gt;
        &lt;ul class=&quot;star-rating&quot;&gt;
            &lt;li&gt;&lt;a href=&quot;#&quot; title=&quot;Péssimo - 0 estrelas&quot; class=&quot;zero-star&quot; onclick=&quot;rateClick(0); return false;&quot;&gt;0&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;#&quot; title=&quot;Muito ruim - 1 estrela&quot; class=&quot;one-star&quot; onclick=&quot;rateClick(1); return false;&quot;&gt;1&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;#&quot; title=&quot;Ruim - 2 estrelas&quot; class=&quot;two-stars&quot; onclick=&quot;rateClick(2); return false;&quot;&gt;2&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;#&quot; title=&quot;Bom - 3 estrelas&quot; class=&quot;three-stars&quot; onclick=&quot;rateClick(3); return false;&quot;&gt;3&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;#&quot; title=&quot;Muito bom - 4 estrelas&quot; class=&quot;four-stars&quot; onclick=&quot;rateClick(4); return false;&quot;&gt;4&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;#&quot; title=&quot;Excelente - 5 estrelas&quot; class=&quot;five-stars&quot; onclick=&quot;rateClick(5); return false;&quot;&gt;5&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/div&gt;
    Sua avaliação
    &lt;input type=&quot;hidden&quot; name=&quot;rate&quot; id=&quot;rate&quot; value=&quot;&lt;?php echo esc_attr($comment_author_rate); ?&gt;&quot; /&gt;
&lt;/div&gt;
</pre>
<p>Agora vamos adicionar os estilos e o JavaScript para atualizar o input que criamos.</p>
<h2>Novos Estilos CSS</h2>
<p>Agora vamos criar os estilos usados no HTML. Esses estilos vão substituir os links por imagens e usar um efeito quando o mouse estiver sobre o link. Eu copie praticamente tudo do artigo <a href="http://www.komodomedia.com/blog/2005/08/creating-a-star-rater-using-css/">Create a Star Rater using CSS</a>. O CSS necessário é:</p>
<pre class="brush: css; title: ; notranslate">
.comment-rating {float:left; width:180px;}
.star-rating,
.star-rating a:hover,
.star-rating a:active,
.star-rating a:focus,
.star-rating .current-rating{background: url(images/star.png) left -1000px repeat-x;}
.star-rating{position:relative;width:108px;height:25px;overflow:hidden;list-style:none;margin:0;padding:0;
             background-position: left top;}
.star-rating li{display: inline;}
.star-rating a,
.star-rating .current-rating{position:absolute;top:0;left:0;text-indent:-1000em;height:25px;line-height:25px;
                             outline:none;overflow:hidden;border: none;}
.star-rating a:hover,
.star-rating a:active,
.star-rating a:focus{background-position: left bottom;}
.star-rating a.one-star{width:34%;z-index:6;}
.star-rating a.two-stars{width:51%;z-index:5;}
.star-rating a.three-stars{width:68%;z-index:4;}
.star-rating a.four-stars{width:85%;z-index:3;}
.star-rating a.five-stars{width:100%;z-index:2;}
.star-rating .current-rating{z-index:1;background-position: left center;}
.star-rating a.zero-star {width:17%;z-index:8;background: url(images/no_star.png) left top no-repeat;}
.star-rating a.zero-star:hover,
.star-rating a.zero-star:active,
.star-rating a.zero-star:focus {background-position: left center;}
.star-rating a.zero-selected {background-position: left center;}
</pre>
<p>Eu defini um tamanho de 180px para todo o DIV. É uma rápida tentativa de alinhar tudo. No Crhome fica OK, mas não no Firefos. Você pode utilizar alguma outra técnica para alinhar. De qualquer maneira, você precisar das seguintes imagens:</p>
<ul>
<li><a href="http://oscardias.com/wp-content/uploads/2010/09/star.png">star.png</a></li>
<li><a href="http://oscardias.com/wp-content/uploads/2010/09/no_star.png">no_star.png</a></li>
<li><a href="http://oscardias.com/wp-content/uploads/2010/09/star_on.png">star_on.png</a></li>
<li><a href="http://oscardias.com/wp-content/uploads/2010/09/star_off.png">star_off.png</a></li>
</ul>
<p>Era possível utilizar menos imagens, mas eu fiquei com preguiça para atualizar tudo&#8230; Então, depois de criarmos as funções, atualizar o modelo e criar o CSS, só nos resta criar o JavaScript.</p>
<h2>Novo JavaScript</h2>
<p>Nós vamos usar jQuery aqui, então você precisa verificar se já está utilizando ele ou se precisa adicionar a referência no seu blog. No nosso arquivo js temos duas funções. Talvez não esteja muito otimizadas, mas funcionam <img src='http://oscardias.com/br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<pre class="brush: jscript; title: ; notranslate">
function clearSelected() {
    $('.star-rating a.zero-star').removeClass('zero-selected');
    $('.star-rating a.one-star').removeClass('current-rating');
    $('.star-rating a.two-stars').removeClass('current-rating');
    $('.star-rating a.three-stars').removeClass('current-rating');
    $('.star-rating a.four-stars').removeClass('current-rating');
    $('.star-rating a.five-stars').removeClass('current-rating');
}

function rateClick(num) {
    switch (num) {
        case 0:
            clearSelected();
            $('.star-rating a.zero-star').addClass('zero-selected');
            $('#rate').val('0');
            break;
        case 1:
            clearSelected();
            $('.star-rating a.one-star').addClass('current-rating');
            $('#rate').val('1');
            break;
        case 2:
            clearSelected();
            $('.star-rating a.two-stars').addClass('current-rating');
            $('#rate').val('2');
            break;
        case 3:
            clearSelected();
            $('.star-rating a.three-stars').addClass('current-rating');
            $('#rate').val('3');
            break;
        case 4:
            clearSelected();
            $('.star-rating a.four-stars').addClass('current-rating');
            $('#rate').val('4');
            break;
        case 5:
            clearSelected();
            $('.star-rating a.five-stars').addClass('current-rating');
            $('#rate').val('5');
            break;
    }
}
</pre>
<p>Na primeira função nós limpamos as classes que indicam a seleção dos links. Na segunda nós adicionamos a classe indicando a seleção a atualizamos o input com o valor correto.</p>
<h2>Como Exibir a Média das Avaliações</h2>
<p class="updatenote">Esta seção é uma atualização nesse artigo. Atualizado em 27 de Julho de 2011.</p>
<p>Algumas pessoas já haviam me perguntado sobre como fazer isso, então resolvi atualizar o artigo. Na realidade é bem simples calcular a média das avaliações dos comentários. Primeiro, precisamos adicionar a seguinte função no nosso arquivo <em>functions.php</em>:</p>
<pre class="brush: php; title: ; notranslate">
function get_average_ratings($id) {
    $comment_array = get_approved_comments($id);
    $count = 1;

    if ($comment_array) {
        $i = 0;
        $total = 0;
        foreach($comment_array as $comment){
            $rate = get_comment_meta($comment-&gt;comment_ID, 'rate');
            if(isset($rate[0]) &amp;&amp; $rate[0] !== '') {
                $i++;
                $total += $rate[0];
            }
        }

        if($i == 0)
            return false;
        else
            return round($total/$i);
    } else {
        return false;
    }
}
</pre>
<p>Essa função vai buscar todos os comentários aprovados de acordo com o ID do post passado como parâmetro, percorrendo esses comentários e fazendo a soma total das avaliações. Serão somados apenas quando um valor for definido para a avaliação. Ou seja, caso um usuário não dê sua nota, o valor não será calculado. A função vai retornar a média das avaliações ou false, caso não existam comentários aprovados.</p>
<p>Posteriormente você pode chamar essa função no arquivo <em>single.php</em>. Você pode usar a função para verificar se existem avaliações. Se existirem, você pode usar a função <em>movie_grade()</em> para exibir as imagens corretamente. O código poderia ser algo assim:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php (get_average_ratings($post-&gt;ID))?movie_grade(get_average_ratings($post-&gt;ID)):'Não disponível'; ?&gt;
</pre>
<h1>Conclusão</h1>
<p>Isso completa esse artigo. É possível utilizar o que mostrei aqui para criar qualquer tipo de entrada nos comentários. Dessa maneira você pode tornar não apenas seu blog único, mas também a discussão que ocorre nele. Aqui está uma tela do resultado (mais ou menos):</p>
<div id="attachment_170" class="wp-caption alignnone" style="width: 310px"><a href="http://oscardias.com/wp-content/uploads/2010/09/Preview.jpg"><img class="size-medium wp-image-170" title="Sistema de avaliação" src="http://oscardias.com/wp-content/uploads/2010/09/Preview-300x244.jpg" alt="Sistema de avaliação" width="300" height="244" /></a><p class="wp-caption-text">Sistema de avaliação</p></div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=PtGBN3pXbYU:1SSyP_GOUso:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=PtGBN3pXbYU:1SSyP_GOUso:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=PtGBN3pXbYU:1SSyP_GOUso:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=PtGBN3pXbYU:1SSyP_GOUso:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/wordpress/como-adicionar-um-campo-extra-nos-comentarios-do-wordpress/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Como Adicionar Informação Extra nos Posts do WordPress</title>
		<link>http://oscardias.com/br/desenvolvimento/php/wordpress/como-adicionar-informacao-extra-nos-posts-do-wordpress/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/wordpress/como-adicionar-informacao-extra-nos-posts-do-wordpress/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 23:31:25 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[campos personalizados]]></category>
		<category><![CDATA[custom fields]]></category>
		<category><![CDATA[custom taxonomies]]></category>
		<category><![CDATA[taxonomias]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=194</guid>
		<description><![CDATA[Neste artigo vou mostrar como adicionar outras informações aos seus posts no WordPress. Vamos começar vendo os campos personalizados, muito úteis quando você é o desenvolvedor e único blogger. Depois vou mostrar como criar os campos personalizados predefinidos. Funciona da mesma maneira que os campos personalizados padrões, mas você pode determinar o nome e adicionar uma descrição para cada um, dessa maneira os usuários vão saber o que escrever em cada um. A última coisa que vou mostrar são as "custom taxonomies", disponíveis a partir do WordPress 3.0.]]></description>
			<content:encoded><![CDATA[<p><em>Neste artigo vou mostrar como adicionar outras informações aos seus posts no WordPress. Vamos começar vendo os campos personalizados, muito úteis quando você é o desenvolvedor e único blogger. Depois vou mostrar como criar os campos personalizados pré-definidos. Funciona da mesma maneira que os campos personalizados padrões, mas você pode determinar o nome e adicionar uma descrição para cada um, dessa maneira os usuários vão saber o que escrever em cada um. A última coisa que vou mostrar são as &#8220;custom taxonomies&#8221;, disponíveis a partir do WordPress 3.0.</em></p>
<p><span id="more-194"></span></p>
<h1>Campos Personalizados</h1>
<p>Os campos personalizados do WordPress permitem adicionar informações diferentes ao seu post. Quando se usa os campos personalizados, você pode exibir esses valores diretamente no seu tema de uma maneira que seus posts sempre tenham um layout parecido mesmo com diferente bloggers. Era muito comum o uso dos campos personalizados para adicionar miniaturas aos posts, mas hoje em dia temos a Imagem destacada para isso. Mas ainda podemos usar os campos personalizados para informações diferentes como, por exemplo, o nível de dificuldade de um tutorial.</p>
<p>Existem duas maneiras de se fazer isso: a maneira padrão e a personalizada.</p>
<h2>Campos Personalizados Padrão</h2>
<p>A maneira padrão para se utilizar os campos personalizados é bastante simples. Quando você cria um novo post, você pode ver depois do Resumo e dos trackbacks uma área chamada Campos personalizados. É uma tela como essa:</p>
<div id="attachment_151" class="wp-caption alignnone" style="width: 310px"><a href="http://oscardias.com/wp-content/uploads/2010/09/custom_fields.jpg"><img class="size-medium wp-image-151" title="Campos Personalizados Padrão" src="http://oscardias.com/wp-content/uploads/2010/09/custom_fields-300x82.jpg" alt="Campos Personalizados Padrão" width="300" height="82" /></a><p class="wp-caption-text">Campos Personalizados Padrão</p></div>
<p>Como você pode ver, é possível adicionar quantos campos você desejar. Você deve definir o nome do campo e o valor do mesmo. Depois é só adicionar esse campo no modelo do seu tema usando a função <em><a title="Referência WordPress Codex" href="http://codex.wordpress.org/Function_Reference/get_post_meta">get_post_meta($post_id, $key, $single)</a></em>. Aqui está um pequeno exemplo no caso do nível de dificuldade do tutorial:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php if ( get_post_meta($post-&gt;ID, 'dificuldade', true) ) : ?&gt;
        Dificuldade: &lt;?php echo get_post_meta($post-&gt;ID, 'dificuldade', true); ?&gt;
&lt;?php endif; ?&gt;
</pre>
<p>Mas você pode simplificar esse processo.</p>
<h2>Campos Personalizados Pré-definidos</h2>
<p>No arquivo <em>functions.php</em> do seu tema, você pode pré-definir quais campos você quer para o seu tema. É claro que você pode implementar isso de diferentes maneiras, eu vou mostrar uma delas. Então abra o arquivo <em>functions.php</em> e siga os próximos passos.</p>
<h3>Passo 1 &#8211; Definição dos Campos</h3>
<p>Vamos começar definindo os campos que desejamos. Vamos fazer isso criando um array com as informações de cada campo. Nesse exemplo vou criar dois campos, o nível de dificuldade e um video tutorial (usando o ID do video no YouTube). Os exemplos estão em inglês.</p>
<pre class="brush: php; title: ; notranslate">
    $theme_metaboxes = array(
       &quot;difficulty&quot; =&gt; array (
            &quot;name&quot;      =&gt; &quot;difficulty&quot;,
            &quot;default&quot;   =&gt; &quot;3&quot;,
            &quot;label&quot;     =&gt; __('Tutorial Difficulty Level', 'mytheme'),
            &quot;type&quot;      =&gt; &quot;text&quot;,
            &quot;desc&quot;      =&gt; __('Enter the difficulty level here. Use only integer numbers from 0 (zero) to 5 (five).', 'mytheme')
        ),
       &quot;screencast&quot; =&gt; array (
            &quot;name&quot;      =&gt; &quot;screencast&quot;,
            &quot;default&quot;   =&gt; &quot;&quot;,
            &quot;label&quot;     =&gt; __('YouTube Screencast', 'mytheme'),
            &quot;type&quot;      =&gt; &quot;text&quot;,
            &quot;desc&quot;      =&gt; __('Enter the YouTube ID here. For example: http://www.youtube.com/watch?v=SuNprTu5Y5c, use only the &quot;SuNprTu5Y5c&quot; value. Use the original studio trailer if possible.', 'mytheme')
        )
    );
</pre>
<p>Como você pode ver definimos as seguintes informações:</p>
<ul>
<li>name: nome do campo;</li>
<li>default: valor padrão para o campo;</li>
<li>label: texto exibido para o usuário;</li>
<li>type: tipo da tag HTML input;</li>
<li>desc: descrição exibida após o campo.</li>
</ul>
<h3>Passo 2 &#8211; Adicionar os Campos na Inserção de Posts</h3>
<p>Agora precisamos adicionar o código HTML na página do WordPress de inserção. Vamos criar duas funções e adicionar uma ação. Aqui está o código:</p>
<pre class="brush: php; title: ; notranslate">
    function custom_fields_box_content() {
            global $post, $theme_metaboxes;
            foreach ($theme_metaboxes as $theme_metabox) {
                    $theme_metaboxvalue = get_post_meta($post-&gt;ID,$theme_metabox[&quot;name&quot;],true);
                    if ($theme_metaboxvalue == &quot;&quot; || !isset($theme_metaboxvalue)) {
                            $theme_metaboxvalue = $theme_metabox['default'];
                    }
                    echo &quot;\t&quot;.'&lt;p&gt;';
                    echo &quot;\t\t&quot;.'&lt;label for=&quot;'.$theme_metabox['name'].'&quot; style=&quot;font-weight:bold; &quot;&gt;'.$theme_metabox['label'].':&lt;/label&gt;'.&quot;\n&quot;;
                    echo &quot;\t\t&quot;.'&lt;input type=&quot;'.$theme_metabox['type'].'&quot; value=&quot;'.$theme_metaboxvalue.'&quot; name=&quot;'.$theme_metabox[&quot;name&quot;].'&quot; id=&quot;'.$theme_metabox['name'].'&quot;/&gt;&lt;br/&gt;'.&quot;\n&quot;;
                    echo &quot;\t\t&quot;.$theme_metabox['desc'].'&lt;/p&gt;'.&quot;\n&quot;;
            }
    }

    function custom_fields_box() {
            if ( function_exists('add_meta_box') ) {
                    add_meta_box('theme-settings',__('Custom Settings', 'mytheme'),'custom_fields_box_content','post','normal','high');
            }
    }

    add_action('admin_menu', 'custom_fields_box');
</pre>
<p>Nesse código nós usamos o array criado anteriormente para criar o código HTML na área administrativa, quando criarmo um novo post. O resultado é esse:</p>
<div id="attachment_154" class="wp-caption alignnone" style="width: 310px"><a href="http://oscardias.com/wp-content/uploads/2010/09/custom_settings.jpg"><img class="size-medium wp-image-154" title="Campos Personalizados Aprimorados" src="http://oscardias.com/wp-content/uploads/2010/09/custom_settings-300x57.jpg" alt="Campos Personalizados Aprimorados" width="300" height="57" /></a><p class="wp-caption-text">Campos Personalizados Aprimorados</p></div>
<p>Muito mais amigável, você não acha?</p>
<h3>Passo 3 &#8211; Usando os Valores</h3>
<p>A última parte é a manipulação dos valores. Nós precisamos de outra ação para adicionar/atualizar/apagar os valores. Então vamos criar mais uma função para isso:</p>
<pre class="brush: php; title: ; notranslate">
    function custom_fields_insert($pID) {
        global $theme_metaboxes;
        foreach ($theme_metaboxes as $theme_metabox) {
            $var = $theme_metabox[&quot;name&quot;];
            if (isset($_POST[$var])) {
                if( get_post_meta( $pID, $theme_metabox[&quot;name&quot;] ) == &quot;&quot; )
                    add_post_meta($pID, $theme_metabox[&quot;name&quot;], $_POST[$var], true );
                elseif($_POST[$var] != get_post_meta($pID, $theme_metabox[&quot;name&quot;], true))
                    update_post_meta($pID, $theme_metabox[&quot;name&quot;], $_POST[$var]);
                elseif($_POST[$var] == &quot;&quot;)
                    delete_post_meta($pID, $theme_metabox[&quot;name&quot;], get_post_meta($pID, $theme_metabox[&quot;name&quot;], true));
            }
        }
    }

    add_action('wp_insert_post', 'custom_fields_insert');
</pre>
<p>Nesse código utilizamos funções do WordPress para adicionar, atualizar e apagar os valores de acordo com os campos que definimos.</p>
<p>Para ser possível utilizar esses campos, você pode fazer o mesmo que fizemos nos campos personalizados do WordPress. Você pode também criar uma nova função para isso. Por exemplo, no caso do video nós poderíamos criar uma função que exibisse o video somente se o valor do campo fosse preenchido:</p>
<pre class="brush: php; title: ; notranslate">
function screen_cast($id) {
    if ($id) {
        echo '&lt;div class=&quot;youtube&quot;&gt;'.
             '&lt;object width=&quot;560&quot; height=&quot;340&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/'.$id.
             '?fs=1&amp;amp;hl=pt_BR&quot;&gt;&lt;/param&gt;'.
             '&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;'.
             '&lt;embed src=&quot;http://www.youtube.com/v/'.$id.'?fs=1&amp;amp;hl=pt_BR&quot; type=&quot;application/x-shockwave-flash&quot; '.
             'allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;560&quot; height=&quot;340&quot;&gt;&lt;/embed&gt;&lt;/object&gt;'.
             '&lt;/div&gt;';
    }
}
</pre>
<p>Com essa função, precisaríamos apenas adicionar uma simples chamada no nosso arquivo <em>single.php</em>:</p>
<pre class="brush: php; title: ; notranslate">
        &lt;?php screen_cast(get_post_meta($post-&gt;ID, 'screencast', true)); ?&gt;
</pre>
<p>Isso é tudo sobre os campos personalizados!</p>
<h1>Taxonomias Personalizadas &#8211; Custom Taxonomies</h1>
<p>A última coisa que quero mostrar são as taxonomias personalizadas. Elas permitem adicionar diversas informações de um mesmo tipo. Elas funcionam de uma maneira semelhante às tags do post. Tudo que você precisa é mais uma função e uma ação no seu arquivo <em>functions.php</em>. Nesse exemplo vou adicionar uma taxonomia para uma lista de atores. O código necessário é:</p>
<pre class="brush: php; title: ; notranslate">
    function create_custom_taxonomies() {
        register_taxonomy('actor', 'post', array(
            'hierarchical' =&gt; false, 'label' =&gt; __('Actor(s)', 'mytheme'),
            'query_var' =&gt; true, 'rewrite' =&gt; true));
    }
    add_action('init', 'create_custom_taxonomies', 0);
</pre>
<p>É só isso. Bem simples. O resultado é esse:</p>
<div id="attachment_156" class="wp-caption alignnone" style="width: 292px"><a href="http://oscardias.com/wp-content/uploads/2010/09/custom_taxonomy.jpg"><img class="size-full wp-image-156" title="Taxonomias Personalizadas" src="http://oscardias.com/wp-content/uploads/2010/09/custom_taxonomy.jpg" alt="Taxonomias Personalizadas" width="282" height="115" /></a><p class="wp-caption-text">Taxonomias Personalizadas</p></div>
<p>Para mostrar os valores no arquivo <em>single.php</em>, você pode usar o seguinte código:</p>
<pre class="brush: php; title: ; notranslate">
                &lt;?php echo get_the_term_list($post-&gt;ID, 'actor', __('&lt;p&gt;Actor(s): ', 'mytheme'), ', ', '&lt;/p&gt;'); ?&gt;
</pre>
<h1>Conclusão</h1>
<p>Nesse artigo mostrei como utilizar taxonomias e campos personalizados. Essas duas características do WordPress permitem que você transforme seus posts deixando-os únicos. Além disso, essas características permitem que você melhore a usabilidade do WordPress separando as informações em diferentes campos.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=_K9ijLBVT2I:37vuyRUmIsA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=_K9ijLBVT2I:37vuyRUmIsA:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=_K9ijLBVT2I:37vuyRUmIsA:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=_K9ijLBVT2I:37vuyRUmIsA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/wordpress/como-adicionar-informacao-extra-nos-posts-do-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Classe PHP: Visão em Primeira Pessoa</title>
		<link>http://oscardias.com/br/desenvolvimento/php/classe-php-visao-em-primeira-pessoa/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/classe-php-visao-em-primeira-pessoa/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 17:40:20 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[classe]]></category>
		<category><![CDATA[primeira pessoa]]></category>
		<category><![CDATA[street view]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=191</guid>
		<description><![CDATA[Esse artigo é sobre uma classe PHP que escrevi duas semanas atrás. A idéia era criar um site que tivesse uma funcionalidade de tour virtual ou street view. Dessa maneira surgiu a classe "First Person View" (Visão em Primeira Pessoa) que permite ao usuário movimentar-se em 4 direções e quatro ângulos diferentes através de um mapa de coordenadas (uma matriz) carregado com imagens.]]></description>
			<content:encoded><![CDATA[<p><em>Esse artigo é sobre uma classe PHP que escrevi duas semanas atrás. A idéia era criar um site que tivesse uma funcionalidade de tour virtual ou street view. Dessa maneira surgiu a classe &#8220;First Person View&#8221; (Visão em Primeira Pessoa) que permite ao usuário movimentar-se em 4 direções e quatro ângulos diferentes através de um mapa de coordenadas (uma matriz) carregado com imagens.</em><br />
<span id="more-191"></span></p>
<p>Os métodos públicos disponibilizados por esta classe são:</p>
<ul>
<li>firstPersonView($map, $curX = 0, $curY = 0, $curAng = 0, $path = &#8220;&#8221;) - construtor, necessita pelo menos da matriz de coordenadas do mapa com as imagens (no fim do post tem um exemplo). Você deve também fornecer a posição X, Y e o ângulo (0, 90, 180,270). O último parâmetro é o caminho para as imagens.</li>
<li>checkForward() e moveForward() &#8211; métodos para verificar se é possível movimentar para a frente e movimentar para a coordenada desejada.</li>
<li>checkBack() e moveBack() &#8211; mesmo que as anteriores, mas movimentando para trás.</li>
<li>checkRight() e moveRight() &#8211; mesmo que as anteriores, mas movimentando para a direita.</li>
<li>checkLeft() e moveLeft() &#8211; mesmo que as anteriores, mas movimentando para a esquerda.</li>
<li>checkTurnRight() e turnRight() &#8211; mesmo que as anteriores, mas virando para a direita &#8211; muda o ângulo.</li>
<li>checkTurnLeft() e turnLeft() &#8211; mesmo que as anteriores, mas virando para a esquerad &#8211; muda o ângulo.</li>
</ul>
<p class="downloadnote">Faça o download da classe com o exemplo: <a href="http://oscardias.com/wp-content/uploads/2010/08/fpv.zip">fpv.zip</a></p>
<h2>Exemplo</h2>
<p>Para criar a instância da classe você deve fornecer a matriz com as coordenadas e os ângulos, dessa maneira:</p>
<pre class="brush: php; title: ; notranslate">
$map[X][Y][Angle] = &quot;image&quot;;
</pre>
<p>Então, um exemplo com 4 posições seria assim:</p>
<pre class="brush: php; title: ; notranslate">
$map[0][1][0] = &quot;1-0.jpg&quot;;
$map[0][1][90] = &quot;1-90.jpg&quot;;
$map[0][1][180] = &quot;1-180.jpg&quot;;
$map[0][1][270] = &quot;1-270.jpg&quot;;
$map[1][1][0] = &quot;2-0.jpg&quot;;
$map[1][1][90] = &quot;2-90.jpg&quot;;
$map[1][1][180] = &quot;2-180.jpg&quot;;
$map[1][1][270] = &quot;2-270.jpg&quot;;
$map[1][0][0] = &quot;3-0.jpg&quot;;
$map[1][0][90] = &quot;3-90.jpg&quot;;
$map[1][0][180] = &quot;3-180.jpg&quot;;
$map[1][0][270] = &quot;3-270.jpg&quot;;
$map[1][2][0] = &quot;4-0.jpg&quot;;
$map[1][2][90] = &quot;4-90.jpg&quot;;
$map[1][2][180] = &quot;4-180.jpg&quot;;
$map[1][2][270] = &quot;4-270.jpg&quot;;
</pre>
<p>Podemos representar estas coordenadas através de uma tabela:</p>
<table border="1">
<tbody>
<tr>
<td>2</td>
<td>X</td>
<td>4-0.jpg<br />
4-90.jpg<br />
4-180.jpg<br />
4-270.jpg</td>
</tr>
<tr>
<td>1</td>
<td>1-0.jpg<br />
1-90.jpg<br />
1-180.jpg<br />
1-270.jpg</td>
<td>2-0.jpg<br />
2-90.jpg<br />
2-180.jpg<br />
2-270.jpg</td>
</tr>
<tr>
<td>0</td>
<td>X</td>
<td>3-0.jpg<br />
3-90.jpg<br />
3-180.jpg<br />
3-270.jpg</td>
</tr>
<tr>
<td></td>
<td>0</td>
<td>1</td>
</tr>
</tbody>
</table>
<p>Podemos perceber que temos apenas 4 posições possíveis com 16 imagens, representando cada ângulo de cada posição. Ainda é necessário criar uma página HTML com um Form ou links com &#8220;query strings&#8221; para executarmos os métodos da classe. Esse é o código exemplo:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

require_once('fpv.class.php');

// MAP MATRIX
$map[0][1][0] = &quot;1-0.jpg&quot;;
$map[0][1][90] = &quot;1-90.jpg&quot;;
$map[0][1][180] = &quot;1-180.jpg&quot;;
$map[0][1][270] = &quot;1-270.jpg&quot;;
$map[1][1][0] = &quot;2-0.jpg&quot;;
$map[1][1][90] = &quot;2-90.jpg&quot;;
$map[1][1][180] = &quot;2-180.jpg&quot;;
$map[1][1][270] = &quot;2-270.jpg&quot;;
$map[1][0][0] = &quot;3-0.jpg&quot;;
$map[1][0][90] = &quot;3-90.jpg&quot;;
$map[1][0][180] = &quot;3-180.jpg&quot;;
$map[1][0][270] = &quot;3-270.jpg&quot;;
$map[1][2][0] = &quot;4-0.jpg&quot;;
$map[1][2][90] = &quot;4-90.jpg&quot;;
$map[1][2][180] = &quot;4-180.jpg&quot;;
$map[1][2][270] = &quot;4-270.jpg&quot;;

if (isset($_POST[&quot;current_angle&quot;])) {
    $fpv = new firstPersonView($map, $_POST[&quot;current_x&quot;], $_POST[&quot;current_y&quot;], $_POST[&quot;current_angle&quot;], &quot;images&quot;);
} else {
    $fpv = new firstPersonView($map, 0, 1, 0, &quot;images&quot;);
}

if($_POST['go-forward']) {
    $fpv-&gt;goForward();
} else if($_POST['go-back']) {
    $fpv-&gt;goBack();
} else if($_POST['go-left']) {
    $fpv-&gt;goLeft();
} else if($_POST['go-right']) {
    $fpv-&gt;goRight();
} else if($_POST['turn-right']) {
    $fpv-&gt;turnRight();
} else if($_POST['turn-left']) {
    $fpv-&gt;turnLeft();
}

?&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;First Person View Class - Example&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;p&gt;Please go to
            &lt;a href=&quot;http://oscardias.com/php/php-class-first-person-view/&quot;&gt;http://oscardias.com/php/php-class-first-person-view/&lt;/a&gt;
            if ou need more info.
        &lt;/p&gt;
        &lt;form name=&quot;movements&quot; action=&quot;example.php&quot; method=&quot;post&quot;&gt;
            &lt;input type=&quot;submit&quot; name=&quot;turn-left&quot; value=&quot;Turn Left&quot; &lt;?php echo ($fpv-&gt;checkTurnLeft())?&quot;&quot;:&quot;disabled&quot;; ?&gt;/&gt;
            &lt;input type=&quot;submit&quot; name=&quot;go-left&quot; value=&quot;Move Left&quot; &lt;?php echo ($fpv-&gt;checkLeft())?&quot;&quot;:&quot;disabled&quot;; ?&gt;/&gt;
            &lt;input type=&quot;submit&quot; name=&quot;go-forward&quot; value=&quot;Move Forward&quot; &lt;?php echo ($fpv-&gt;checkForward())?&quot;&quot;:&quot;disabled&quot;; ?&gt;/&gt;
            &lt;input type=&quot;submit&quot; name=&quot;go-back&quot; value=&quot;Move Back&quot; &lt;?php echo ($fpv-&gt;checkBack())?&quot;&quot;:&quot;disabled&quot;; ?&gt;/&gt;
            &lt;input type=&quot;submit&quot; name=&quot;go-right&quot; value=&quot;Move Right&quot; &lt;?php echo ($fpv-&gt;checkRight())?&quot;&quot;:&quot;disabled&quot;; ?&gt;/&gt;
            &lt;input type=&quot;submit&quot; name=&quot;turn-right&quot; value=&quot;Turn Right&quot; &lt;?php echo ($fpv-&gt;checkTurnRight())?&quot;&quot;:&quot;disabled&quot;; ?&gt;/&gt;
            &lt;!-- BEGIN IMPORTANT HIDDEN INFO --&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;current_x&quot; value=&quot;&lt;?php echo $fpv-&gt;currentX; ?&gt;&quot; /&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;current_y&quot; value=&quot;&lt;?php echo $fpv-&gt;currentY; ?&gt;&quot; /&gt;
            &lt;input type=&quot;hidden&quot; name=&quot;current_angle&quot; value=&quot;&lt;?php echo $fpv-&gt;currentAngle; ?&gt;&quot; /&gt;
            &lt;!-- END IMPORTANT HIDDEN INFO --&gt;
        &lt;/form&gt;
        &lt;img id=&quot;view&quot; src=&quot;&lt;?php $fpv-&gt;currentView() ?&gt;&quot; /&gt;
    &lt;/body&gt;
&lt;/html&gt;
</pre>
<p class="updatenote">Coloquei o exemplo online. Você pode ver como ficou diretamente em: http://oscardias.com/other/fpv/example.php</p>
<h2>Notas</h2>
<p>Esta é a primeira versão da classe. Eu não tive muito tempo para escrever em detalhes, mas, se você ficou interessado, deixe um comentário. Nesse caso vou dedicar um pouco mais de tempo para a classe <img src='http://oscardias.com/br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .</p>
<p class="updatenote">Essa classe foi aprovada no site <a href="http://www.phpclasses.org/">PHPClasses.org</a> e recebeu uma &#8220;notificação notável&#8221;. O link para a classe no PHPClasses é <a href="http://www.phpclasses.org/package/6460.html">http://www.phpclasses.org/package/6460.html</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=5j0gBhL27JI:HV1-MbfT3Ko:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=5j0gBhL27JI:HV1-MbfT3Ko:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=5j0gBhL27JI:HV1-MbfT3Ko:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=5j0gBhL27JI:HV1-MbfT3Ko:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/classe-php-visao-em-primeira-pessoa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dica: Como Utilizar o Botão de Compartilhamento Oficial do Twitter</title>
		<link>http://oscardias.com/br/outros/dica-como-utilizar-o-botao-de-compartilhamento-oficial-do-twitter/</link>
		<comments>http://oscardias.com/br/outros/dica-como-utilizar-o-botao-de-compartilhamento-oficial-do-twitter/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 18:48:46 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[Outros]]></category>
		<category><![CDATA[compartilhar]]></category>
		<category><![CDATA[midia social]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=170</guid>
		<description><![CDATA[Recentemente mostrei como criar botões de compartilhamento para mídias sociais. Na ocasião daquele post, o Twitter não disponibilizava um código padrão do sistema para fazer isso. Mas essa semana o Twitter mudou isso ao liberar um Tweet Button oficial. Então vou mostrar aqui como utilizá-lo.]]></description>
			<content:encoded><![CDATA[<p><em>Recentemente mostrei como criar botões de compartilhamento para mídias sociais. Na ocasião daquele post, o Twitter não disponibilizava um código padrão do sistema para fazer isso. Mas essa semana o Twitter mudou isso ao liberar um Tweet Button oficial. Então vou mostrar aqui como utilizá-lo.</em><br />
<span id="more-170"></span></p>
<h1>Introdução</h1>
<p>Recentemente escrevi o post <a href="http://oscardias.com/br/outros/adicionando-botoes-para-twitter-facebook-buzz-e-outros/">Adicionando Botões para Twitter, Facebook, Buzz e Outros</a>, onde expliquei como criar botões de compartilhamento de algumas mídias sociais. Mas quando escrevi este post, não havia um código oficial do Twitter para esse botão de compartilhamento. Agora isso mudou, pois o Twitter liberou um código para isso. Portanto vamos ver isso nesse artigo.</p>
<h1>Código</h1>
<p>O código é bem simples e pode ser obtido a partir da página <a href="http://twitter.com/goodies/tweetbutton">Twitter / Tweet Button</a>. Mas, para simplificar, aqui está o código necessário:</p>
<pre class="brush: php; title: ; notranslate">
&amp;lt;a href=&amp;quot;http://twitter.com/share&amp;quot; class=&amp;quot;twitter-share-button&amp;quot; data-url=&amp;quot;http://yourdomain.com&amp;quot; data-text=&amp;quot;Texto&amp;quot; data-count=&amp;quot;vertical&amp;quot; data-via=&amp;quot;oscardias&amp;quot;&amp;gt;Tweet&amp;lt;/a&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://platform.twitter.com/widgets.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
</pre>
<p>Como você pode ver, podemos customizar as seguintes informações:</p>
<ul>
<li>data-url: link que será compartilhado. Se você apagar essa propriedade, o link atual será compartilhado por padrão. Além disso, o Twitter utilizará seu próprio encurtador para diminuir o link.</li>
<li>data-text: texto que será compartilhado. Se você apagar essa propriedade, o título da página atual será compartilhado por padrão.</li>
<li>data-count: estilo do botão. Pode conter os valores: vertical, horizontal ou none. O valor &#8220;vertical&#8221; mostrará um botão grande com o contador sobre o botão. O valor &#8220;horizontal&#8221; mostrará o botão pequeno com o contador ao lado. Já o valor &#8220;none&#8221; mostrará apenas o botão, sem o contador.</li>
<li>data-via: nome do usuário do Twitter que será enviado como &#8220;RT @&#8221;.</li>
</ul>
<p>Além disso também é possível alterar o texto dentro do link. Esse será o texto que vai aparecer dentro do botão.</p>
<h1>Conclusão</h1>
<p>E isso é tudo que precisamos para adicionar o botão oficial do Twitter. Muitos sites já estão atualizando o botão do Tweetmeme pelo botão do Twitter, mas a decisão sobre qual utilizar depende de cada um. Obrigado pela visita.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=zoa8spsFrBI:KYp_6T4SGsw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=zoa8spsFrBI:KYp_6T4SGsw:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=zoa8spsFrBI:KYp_6T4SGsw:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=zoa8spsFrBI:KYp_6T4SGsw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/outros/dica-como-utilizar-o-botao-de-compartilhamento-oficial-do-twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando um Tema para WordPress (Parte 6): Rodapé</title>
		<link>http://oscardias.com/br/desenvolvimento/php/wordpress/criando-um-tema-para-wordpress-parte-6-rodape/</link>
		<comments>http://oscardias.com/br/desenvolvimento/php/wordpress/criando-um-tema-para-wordpress-parte-6-rodape/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 18:39:56 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[tema]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=163</guid>
		<description><![CDATA[Esse é o último artigo dessa série. Nós já vimos a criação do design, uma introdução ao WordPress e a codificação de todo nosso tema com exceção do rodapé. Então é isso que vou mostrar hoje, além de também vermos alguns plugins. O rodapé é bem simples, por isso também vamos ver alguns estilos adicionais para finalizar nosso tema.]]></description>
			<content:encoded><![CDATA[<p><em>Esse é o último artigo dessa série. Nós já vimos a criação do design, uma introdução ao WordPress e a codificação de todo nosso tema com exceção do rodapé. Então é isso que vou mostrar hoje, além de também vermos alguns plugins. O rodapé é bem simples, por isso também vamos ver alguns estilos adicionais para finalizar nosso tema.</em></p>
<p><em>Se você quiser, pode baixar nosso tema <a href="http://oscardias.com/br/wp-content/uploads/2010/06/mytheme1.zip">aqui</a>.</em></p>
<p><span id="more-163"></span></p>
<h1>Introdução</h1>
<p>Este é o sexto e último artigo dessa série sobre criação de temas para o WordPress. Aqui está uma lista de todos os artigos:</p>
<p class="previousnote"><a href="http://oscardias.com/br/photoshop/criando-um-tema-para-wordpress-parte-1-photoshop/">Criando um Tema para WordPress (Parte 1): Photoshop</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-2-introducao/">Criando um Tema para WordPress (Parte 2): Introdução</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-3-cabecalho/">Criando um Tema para WordPress (Parte 3): Cabeçalho</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-4-pagina-principal/">Criando um Tema para WordPress (Parte 4): Página Principal</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-5-paginas-e-artigos/">Criando um Tema para WordPress (Parte 5): Páginas e Artigos</a></p>
<p>Hoje eu vou apenas finalizar o nosso rodapé e adicionar alguns estilos. Para completar, também vou listar os plugins que tenho usado.</p>
<h1>Rodapé</h1>
<p>Atualmente é assim que nosso rodapé está:</p>
<div id="attachment_106" class="wp-caption alignnone" style="width: 310px"><a href="http://oscardias.com/wp-content/uploads/2010/07/old_footer.jpg"><img class="size-medium wp-image-106" title="Nosso rodapé antes das alterações" src="http://oscardias.com/wp-content/uploads/2010/07/old_footer-300x26.jpg" alt="Nosso rodapé antes das alterações" width="300" height="26" /></a><p class="wp-caption-text">Nosso rodapé antes das alterações</p></div>
<p>Para corrigirmos isso, abra o arquivo <em>footer.php</em>.</p>
<ol>
<li>Atualize a informação do pacote: estamos utilizando @subpackage MyTheme_Theme.</li>
<li>Substitua as ocorrências de &#8216;kubrick&#8217; por &#8216;mytheme&#8217;.</li>
<li>Remova a tag &lt;hr&gt; que tem no início do arquivo.</li>
<li>Adicione um &lt;div class=&#8221;container_12&#8243;&gt; depois do &lt;div id=&#8221;footer&#8221;&gt;.</li>
<li>Dentro do DIV que criamos no passo anterior, adicione duas DIV&#8217;s. Primeiro vamos adicionar os links do nosso blog no lado esquerdo. Adicione o seguinte código:
<pre class="brush: php; title: ; notranslate">
        &lt;div class=&quot;floatleft&quot;&gt;
            &lt;ul&gt;
                &lt;li class=&quot;page_item first_page_item &lt;?php if ( is_home() ) { ?&gt;current_page_item&lt;?php } ?&gt;&quot;&gt;&lt;a href=&quot;&lt;?php echo get_settings('home'); ?&gt;/&quot; title=&quot;&lt;?php _e('Home', 'oscardias'); ?&gt;&quot;&gt;&lt;?php _e('Home', 'oscardias'); ?&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;?php wp_list_pages('sort_column=post_title&amp;title_li=');?&gt;

            &lt;/ul&gt;
        &lt;/div&gt;
</pre>
</li>
<li>Depois vamos adicionar as informações relativas ao nosso blog e tema alinhadas a direita. Adicione o seguinte código:
<pre class="brush: php; title: ; notranslate">
        &lt;div class=&quot;floatright alignright&quot;&gt;
            &amp;copy; 2010 &lt;a href=&quot;&lt;?php echo get_option('home'); ?&gt;/&quot;&gt;Oscar Dias&lt;/a&gt;
            &lt;br /&gt;&lt;?php printf(__('%1$s is powered by %2$s', 'oscardias'), get_bloginfo('name'),'&lt;a href=&quot;http://wordpress.org/&quot;&gt;WordPress&lt;/a&gt;'); ?&gt;

            &lt;br /&gt;&lt;?php printf(__('%1$s and %2$s', 'oscardias'), '&lt;a href=&quot;' . get_bloginfo('rss2_url') . '&quot;&gt;' . __('Entries (RSS)', 'oscardias') . '&lt;/a&gt;', '&lt;a href=&quot;' . get_bloginfo('comments_rss2_url') . '&quot;&gt;' . __('Comments (RSS)', 'oscardias') . '&lt;/a&gt;'); ?&gt;

        &lt;/div&gt;
</pre>
</li>
<li>Termine as alterações adicionando um &lt;div class=&#8221;clear&#8221;&gt;&lt;/div&gt; Depois que você fechar o &lt;div class=&#8221;container_12&#8243;&gt;.</li>
</ol>
<p>Bem simples. Aqui está o código final:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
/**
 * @package WordPress
 * @subpackage MyTheme_Theme
 */
?&gt;

&lt;div id=&quot;footer&quot; role=&quot;contentinfo&quot;&gt;
    &lt;div class=&quot;container_12&quot;&gt;
        &lt;div class=&quot;floatleft&quot;&gt;
            &lt;ul&gt;
                &lt;li class=&quot;page_item first_page_item &lt;?php if ( is_home() ) { ?&gt;current_page_item&lt;?php } ?&gt;&quot;&gt;&lt;a href=&quot;&lt;?php echo get_settings('home'); ?&gt;/&quot; title=&quot;&lt;?php _e('Home', 'oscardias'); ?&gt;&quot;&gt;&lt;?php _e('Home', 'oscardias'); ?&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;?php wp_list_pages('sort_column=post_title&amp;title_li=');?&gt;

            &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;floatright alignright&quot;&gt;
            &amp;copy; 2010 &lt;a href=&quot;&lt;?php echo get_option('home'); ?&gt;/&quot;&gt;Oscar Dias&lt;/a&gt;
            &lt;br /&gt;&lt;?php printf(__('%1$s is powered by %2$s', 'oscardias'), get_bloginfo('name'),'&lt;a href=&quot;http://wordpress.org/&quot;&gt;WordPress&lt;/a&gt;'); ?&gt;

            &lt;br /&gt;&lt;?php printf(__('%1$s and %2$s', 'oscardias'), '&lt;a href=&quot;' . get_bloginfo('rss2_url') . '&quot;&gt;' . __('Entries (RSS)', 'oscardias') . '&lt;/a&gt;', '&lt;a href=&quot;' . get_bloginfo('comments_rss2_url') . '&quot;&gt;' . __('Comments (RSS)', 'oscardias') . '&lt;/a&gt;'); ?&gt;

        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
		&lt;?php wp_footer(); ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>E o resultado antes de adicionarmos os estilos:</p>
<div id="attachment_107" class="wp-caption alignnone" style="width: 310px"><a href="http://oscardias.com/wp-content/uploads/2010/07/footer_nostyles.jpg"><img class="size-medium wp-image-107" title="Footer without the necessary styles" src="http://oscardias.com/wp-content/uploads/2010/07/footer_nostyles-300x28.jpg" alt="Footer without the necessary styles" width="300" height="28" /></a><p class="wp-caption-text">Footer without the necessary styles</p></div>
<p>Então agora vamos aos estilos.</p>
<h1>Estilos</h1>
<p>Para criarmos os novos estilos, vamos abrir o arquivo <em>styles.css</em>.</p>
<ol>
<li>Primeiro faça o <a title="Imagem de fundo" href="http://oscardias.com/wp-content/uploads/2010/07/footer.jpg">download dessa imagem</a> e salve a mesma no diretório <em>images</em>. Vamos usar essa imagem no fundo do nosso DIV.</li>
<li>Agora vamos criar o estilo para o DIV principal.
<pre class="brush: css; title: ; notranslate">
#footer {
    background: #fff url('images/footer.jpg') repeat-x top;
    margin: 0 auto;
    padding-top:100px;
    padding-bottom:20px;
}
</pre>
</li>
<li>Continuando, adicione os estilos para as listas (UL e LI).
<pre class="brush: css; title: ; notranslate">
#footer ul {
    list-style: none;
    margin:0;
    padding:0;
}
#footer ul li {
    float:left;
    margin:5px 0 5px 5px;
    padding-right:5px;
    border-right: 1px solid #000;
}
</pre>
</li>
<li>Agora vamos criar os estilos para os diferentes alinhamentos.
<pre class="brush: css; title: ; notranslate">
.floatleft {
    float:left;
    margin-left: 10px;
}
.floatright {
    float:right;
    margin-right: 10px;
}
.alignleft {
    text-align: left;
}
.alignright {
    text-align: right;
}
.center {
    text-align: center;
}
</pre>
</li>
<li>Para finalizar, vamos criar algumas classes adicionais para as sombras (CSS3) e as imagens.
<pre class="brush: css; title: ; notranslate">
.box-shadow {
    box-shadow: 3px 3px 3px #000;
    -moz-box-shadow: 3px 3px 3px #000; /* for Firefox 3.5+ */
    -webkit-box-shadow: 3px 3px 3px #000; /* for Safari and Chrome */
}
.text-shadow {
    text-shadow: #000 2px 2px 2px;
}
img.aligncenter, img.center {
    display: block;
    margin-left: auto;
    margin-right: auto;
}
.frame {
    padding:5px;
    background: #d2d2d2;
    border: 2px solid #808080;
}</pre>
</li>
</ol>
<p>Isso é tudo. Com isso finalizamos o desenvolvimento do nosso tema. Eu não mostrei todos os arquivos aqui, mas os arquivos que faltaram devem ser desenvolvidos seguindo as mesmas idéias que usamos durante essas 6 partes da série.</p>
<p>Para complementar, quero mostrar alguns plugins que eu uso.</p>
<h1>Plugins</h1>
<p>Aqui está uma rápida lista de plugins com uma explicação sobre cada um.</p>
<h2>AddToAny: Share/Bookmark/Email Button</h2>
<p>Plugin para compartilhamento. Bem prático e completo. Com apenas um botão esse plugin permite que seus usuários compartilhem em várias redes sociais.</p>
<h2>Akismet</h2>
<p>Esse plugin vem com a instalação padrão do WordPress. Ele filtra os comentários feitos em seu website e verifica se são spam automaticamente. Assim você não precisa verificar todos os comentários feitos no seu blog.</p>
<h2>All in One SEO Pack</h2>
<p>Outro plugin extremamente importante. Utilizado para melhorar o SEO do seu blog.</p>
<h2>FD Feedburner Plugin</h2>
<p>Se você usa o Feedburner, esse é um plugin obrigatório. Ele redireciona todos os feeds do seu blog para o feed do Feedburner.</p>
<h2>Google Analytics for WordPress</h2>
<p>Se você também usa o Google Analytics, esse plugin insere o código necessário automaticamente para você.</p>
<h2>Google XML Sitemaps</h2>
<p>Esse plugin serve para criar o sitemap do seu site automaticamente. O sitemap é usado pelos mecanismos de busca para indexar seu site, ou seja, é muito importante.</p>
<h2>RatenTweet</h2>
<p>Esse plugin serve para compartilhamento também. Mas ele utiliza um estilo de ranking para compartilhar as informações.</p>
<h2>SyntaxHighlighter Evolved</h2>
<p>Plugin responsável pela marcação da sintaxe. Ele adiciona um estilo especial para as entradas de código no seus artigos.</p>
<h2>TweetMeme Retweet Button</h2>
<p>Mais um serviço de compartilhamento. Usado por muitos websites.</p>
<h1>Conclusão</h1>
<p>Então chegamos ao fim dessa série de artigos. Eu vou escrever sobre o WordPress novamente, mas não dentro dessa série. Se você tiver comentários ou quer ver algo específico aqui, deixe sua mensagem e eu vou responder assim que possível <img src='http://oscardias.com/br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p class="downloadnote">Baixe a última versão do nosso tema <a title="MyTheme" href="http://oscardias.com/wp-content/uploads/2010/07/mytheme.zip">aqui</a> (82 Kb).</p>
<p class="previousnote"><strong>Outros Artigos dessa Série</strong><br />
<a href="http://oscardias.com/br/photoshop/criando-um-tema-para-wordpress-parte-1-photoshop/">Criando um Tema para WordPress (Parte 1): Photoshop</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-2-introducao/">Criando um Tema para WordPress (Parte 2): Introdução</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-3-cabecalho/">Criando um Tema para WordPress (Parte 3): Cabeçalho</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-4-pagina-principal/">Criando um Tema para WordPress (Parte 4): Página Principal</a><br />
<a href="http://oscardias.com/br/wordpress/criando-um-tema-para-wordpress-parte-5-paginas-e-artigos/">Criando um Tema para WordPress (Parte 5): Páginas e Artigos</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=nzSMb8FveLY:hIw1CKv4uPM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=nzSMb8FveLY:hIw1CKv4uPM:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=nzSMb8FveLY:hIw1CKv4uPM:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=nzSMb8FveLY:hIw1CKv4uPM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/desenvolvimento/php/wordpress/criando-um-tema-para-wordpress-parte-6-rodape/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adicionando Botões para Twitter, Facebook, Buzz e Outros</title>
		<link>http://oscardias.com/br/outros/adicionando-botoes-para-twitter-facebook-buzz-e-outros/</link>
		<comments>http://oscardias.com/br/outros/adicionando-botoes-para-twitter-facebook-buzz-e-outros/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 22:15:06 +0000</pubDate>
		<dc:creator>Oscar Dias</dc:creator>
				<category><![CDATA[Outros]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[compartilhar]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[midia social]]></category>
		<category><![CDATA[reddit]]></category>
		<category><![CDATA[stumbleupon]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://oscardias.com/br/?p=158</guid>
		<description><![CDATA[Ontem eu estava trabalhando em um projeto em que foi necessário buscar por algumas funcionalidades de compartilhamento. Eu queria os códigos originais dos sites de mídias sociais ao invés desses hacks encontrados por aí. O resultado foi que encontrei códigos para Twitter, Facebook, Google Buzz, StumbleUpon, Reddit e Digg. O único que não é do site original é o Twitter, onde usei o Tweetmeme.]]></description>
			<content:encoded><![CDATA[<p><em>Ontem eu estava trabalhando em um projeto em que foi necessário buscar por algumas funcionalidades de compartilhamento. Eu queria os códigos originais dos sites de mídias sociais ao invés desses hacks encontrados por aí. O resultado foi que encontrei códigos para <a href="http://twitter.com/">Twitter</a>, <a href="http://www.facebook.com/">Facebook</a>, <a href="http://www.google.com/buzz/">Google Buzz</a>, <a href="http://www.stumbleupon.com/">StumbleUpon</a>, <a href="http://www.reddit.com/">Reddit</a> e <a href="http://digg.com/">Digg</a>. O único que não é do site original é o Twitter, onde usei o <a href="http://tweetmeme.com/">Tweetmeme</a>.</em><br />
<span id="more-158"></span></p>
<h1>Introdução</h1>
<p>Certamente você já viu algum dos ícones exibidos nesse post. E provavelmente você usa algum, ou vários, desses serviços. Mas você sabe como adicionar botões para permitir que seus leitores compartilhem suas informações? Isso que pretendo mostrar aqui. Eu busquei as referências oficias para mostrar os exemplos aqui.</p>
<h2>Twitter</h2>
<p>Twitter é um dos sites de mídias sociais mais famoso atualmente. Infelizmente não tem um botão para tweetar oficial. Mas, nesse caso, existe o Tweetmeme, que é usado por muitos sites.</p>
<p><strong>Referência:</strong> <a href="http://help.tweetmeme.com/2009/04/06/tweetmeme-button/">http://help.tweetmeme.com/2009/04/06/tweetmeme-button/</a></p>
<p>Esse exemplo é do botão de tamanho grande. É possível modificar o usuário do retweet e a URL a ser compartilhada. Você pode definir um URL &#8220;encurtado&#8221; ou usar o parâmetro <em>tweetmeme_service</em> para isso. Outra opção é utilizar o botão compacto adicionando o código &#8220;<em>tweetmeme_style = &#8216;compact&#8217;;</em>&#8220;.</p>
<pre class="brush: xml; title: ; notranslate">
 &lt;script type=&quot;text/javascript&quot;&gt;
    tweetmeme_source = 'username';
    tweetmeme_url = 'http://yourdomain.com';
&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://tweetmeme.com/i/scripts/button.js&quot;&gt;&lt;/script&gt;
</pre>
<p>Também é possível alterar o texto que será &#8220;tweetado&#8221;. Por padrão será utilizado o título da página, porém é possível alterar esse texto com o seguinte código:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;meta name=&quot;tweetmeme-title&quot; content=&quot;Texto modificado&quot; /&gt;
</pre>
<h2>Facebook</h2>
<p>Facebook é outra mídia social muito utilizada. E possui ótimas ferramentas para desenvolvedores. E a criação de botões não poderia ser diferente. Você pode escolher como deseja o botão e o Facebook fornece o código para você no seguinte site:</p>
<p><strong>Referência:</strong> <a href="http://www.facebook.com/share/">http://www.facebook.com/share/</a></p>
<p>Aqui eu mostro um exemplo do botão grande. A URL e o texto serão buscados automaticamente. Como não temos o limite de 140 caracteres, como no Twitter, não precisamos nos preocupar muito em mudar esses valores.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a name=&quot;fb_share&quot; type=&quot;box_count&quot; href=&quot;http://www.facebook.com/sharer.php&quot;&gt;&lt;/a&gt;
&lt;script src=&quot;http://static.ak.fbcdn.net/connect.php/js/FB.Share&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>Se você preferir o botão menor, pode utilizar &#8216;<em>type=&#8221;button_count</em>&#8220;&#8216;. Você também pode especificar o text e a URL é claro, basta mudar o HREF para algo assim: <em>http://www.facebook.com/sharer.php?u=url&amp;t=texto</em></p>
<h2>Google Buzz</h2>
<p>Google Buzz é relativamente recente se comparado a outras mídias sociais. Foi criado como uma resposta a popularidade do Twitter. Como todos os produtos do Google, tem boas ferramentas.</p>
<p><strong>Referência:</strong> <a href="http://code.google.com/apis/buzz/buttons_and_gadgets.html">http://code.google.com/apis/buzz/buttons_and_gadgets.html</a></p>
<p>Entre as diferentes maneiras de exibir os botões, uma das mais personalizáveis utiliza JavaScript e HTML5. Aqui está um exemplo do botão com tamanho normal.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a href=&quot;http://www.google.com/buzz/post&quot;
    class=&quot;google-buzz-button&quot;
    title=&quot;Google Buzz&quot;
    data-message=&quot;Texto compartilhado&quot;
    data-url=&quot;http://yourdomain.com&quot;
    data-locale=&quot;en&quot;
    data-button-style=&quot;normal-count&quot;&gt;&lt;/a&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/buzz/api/button.js&quot;&gt;&lt;/script&gt;
</pre>
<p>Para o botão com tamanho menor, basta utilizar &#8216;<em>data-button-style=&#8221;small-count&#8221;</em>&#8216;.</p>
<h2>StumbleUpon</h2>
<p>StumbleUpon possui um dos melhores sites para criar os botões. Basta você entras nesse site:</p>
<p><strong>Referência:</strong> <a href="http://www.stumbleupon.com/buttons/">http://www.stumbleupon.com/buttons/</a></p>
<p>Lá você pode selecionar o estilo de botão e se você deseja adicionar em alguma plataforma existente ou no seu próprio site. O código gerado para o botão maior é esse:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script src=&quot;http://www.stumbleupon.com/hostedbadge.php?s=5&amp;r=http://yourdomain.com&quot;&gt;&lt;/script&gt;
</pre>
<p>Você pode remover o texto &#8216;<em>&amp;r=http://yourdomain.com</em>&#8216; se você quiser. Nesse caso o JavaScript vai utilizar a URL da página.</p>
<h2>Reddit</h2>
<p>Reddit tem várias opções de botões. Com tamanho pequeno, grande e até com um ET <img src='http://oscardias.com/br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>Referência:</strong> <a href="http://www.reddit.com/buttons/">http://www.reddit.com/buttons/</a></p>
<p>Nesse link você pode selecionar qual botão você deseja e verificar o código necessário. Também possuí ótimas formas de personalizar os dados, tudo feito por JavaScript. O código básico está aqui:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://reddit.com/static/button/button2.js&quot;&gt;&lt;/script&gt;
</pre>
<p>Se você mudar para button1.js, você terá o botão pequeno. Se você mudar para button3.js terá o logo com o desenho do ET. E para personalizar, você pode usar as seguintes opções:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;reddit_url='[URL]'&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;reddit_target='[COMMUNITY]'&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;reddit_title='[TITLE]'&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;reddit_newwindow='1'&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;reddit_bgcolor='[COLOR]'&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;reddit_bordercolor='[COLOR]'&lt;/script&gt;
</pre>
<h2>Digg</h2>
<p>Digg é outra mídia social muito interessante com boas opções de botões. Mas o código é um pouco diferente. Possui um código base e a personalização é feita diretamente na tag A.</p>
<p><strong>Referência:</strong> <a href="http://about.digg.com/button">http://about.digg.com/button</a></p>
<p>Esse é o código JavaScript básico:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
(function() {
var s = document.createElement('SCRIPT'), s1 = document.getElementsByTagName('SCRIPT')[0];
s.type = 'text/javascript';
s.async = true;
s.src = 'http://widgets.digg.com/buttons.js';
s1.parentNode.insertBefore(s, s1);
})();
&lt;/script&gt;
</pre>
<p>Para posicionar o botão, você precisa adicionar o seguinte código onde você quer que ele apareça:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a class=&quot;DiggThisButton DiggMedium&quot;&gt;&lt;/a&gt;
</pre>
<p>Todas as opções podem ser adicionadas nessa última tag.Por exemplo, para exibir o botão pequeno você deve alterar o atributo class da tag para &#8220;<em>DiggThisButton DiggCompact</em>&#8220;. Se você quiser modificar a URL que será compartilhada pode usar o seguinte código:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;a class=&quot;DiggThisButton DiggMedium&quot; href=&quot;http://yourdomain.com&quot;&gt;&lt;/a&gt;
</pre>
<h1>Conclusão</h1>
<p>Nesse rápido artigo eu relacionei alguns botões para mídias sociais. Eu escolhi os que tinham contador, pois eles nos fornecem uma rápida maneira de ver a popularidade do post ou página. Se você for utilizar os botões, é uma boa idéia visitar as referências que mencionei aqui.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/oscardias/br?a=-sdXFO2qLLU:_1u4H5p2lQI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=-sdXFO2qLLU:_1u4H5p2lQI:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/oscardias/br?i=-sdXFO2qLLU:_1u4H5p2lQI:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/oscardias/br?a=-sdXFO2qLLU:_1u4H5p2lQI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/oscardias/br?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://oscardias.com/br/outros/adicionando-botoes-para-twitter-facebook-buzz-e-outros/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

