Objota O mundo orientado a objetos

PHP – Problema com caracteres na conexão com o banco de dados utilizando PDO

Posted on setembro 13, 2012

Posted by Pedro

Olá galera, fica aqui uma dica bacana para quem está tendo problemas com caracteres na conexão com o banco de dados utilizando PDO.

Problemas com charset geralmente ocorrem quando você processa os dados no seu site em um formato X e no banco em um formato diferente. Ai começam os problemas. Um exemplo simples é o uso de ISO-8859-1 na codificação do seu site e um banco de dados configurado para trabalhar com charset UTF-8.

Nesse exemplo vou configurar parâmetros de conexão como o banco de dados MySQL já que é geralmente o mais utilizando com PHP, e trabalhar com  os dados no formato UTF-8.


//Exemplo da classe em PHP com extends na classe PDO. Aqui vamos atribuir todas as variáveis da nossa conexão pra trabalhar no formato UTF-8.

class MysqlConnection extends PDO {

public function Connection($dsn, $username = "", $password = "", $driverOptions = array()) {

parent::__construct ( $dsn, $username, $password, $driverOptions );

$this->exec("SET NAMES utf8");

$this->exec("SET character_set='utf8'");

$this->exec("SET collation_connection='utf8_general_ci'");

$this->exec("SET character_set_connection='utf8'");

$this->exec("SET character_set_client='utf8'");

$this->exec("SET character_set_results='utf8'");

}

}


//Aqui é a string de conexão / $dsn que vamos usar para conectar ao nosso banco

$dsn = "mysql:host=localhost;dbname=meu_banco_de_dados;charset=utf8";

Bom é isso. Muito simples, certo?

Qualquer dúvida pode postar um comentário que irei responder.

Até a próxima.

hashDoS a falha de segurança que afeta a maioria das linguagens WEB

Posted on janeiro 1, 2012

Posted by Eder Freire

Recentemente na Alemanha aconteceu a 23ª edição da Chaos Computer Club, uma conferência de segurança muito conhecida entre os hackers de todo mundo e, pra variar, as primeiras palestras foram assustadoras. Um pesquisador encontrou uma brecha que afeta milhões de celulares no mundo todo nas redes 2G GSM, mas o que realmente me chamou atenção foi uma dupla de pesquisadores avisou que milhões de sites estão vulneráveis a um novo tipo de ataque DoS (Denial of Service), chamado hashDoS, que pode deixá-los fora do ar se não tratado com rapidez.

Os pesquisadores Alexandre Klink e Julian Wälde gesticularam e demonstraram que o problema está na maneira que certas linguagens usadas em servidores web armazenam valores em uma tabela hash. A grande maioria utiliza do mesmo método e pessoas mal-intencionadas podem tirar vantagens disso, enviando valores pré-determinados que sabem sabem que não serão tratados da forma que deveriam ser tratados. Essas requisiões, no final das contas, acaba gerando uma função quadrática que sobrecarrega os servidores.

Para provar que o método funciona, durante a apresentação, eles enviaram requisições do tipo HTTP POST com 2 MB de tamanho para um servidor WEB rodando Apache Tomcat, isso foi o suficiente para que o processamento do servidor subisse para a marca de 100% de consumo e permanecesse neste nível durante toda a palestra.

Quais linguagens afetadas?

A lista não é nada pequena. Nela constam PHP, ASP.NET, Java, Python, Ruby, Apache Tomcat, Apache Geronimo, Jetty, Glassfish, e até a V8, engine de renderização de JavaScript do Google.

Note que aqui temos interpretadores e servidor de aplicação, nessa os servidores WEB e o protocolo HTTP escaparam, sempre alvos de ataques de hackers.

Quais linguagens ja iniciaram o processo de correção e em qual versão isso ja está corrigida?

JRuby >= 1.6.5.1
PHP >= 5.3.9 (ainda está em Release Candidate), 5.4.0 RC4
Ruby >= 1.8.7-p357, 1.9.x
Apache Tomcat >= 5.5.35, 6.0.35, 7.0.35
Rack >= 1.4.0, 1.3.6, 1.2.5, 1.1.3

A Microsoft ja anunciou que vai liberar uma atualização para o ASP.NET que soluciona esse problema.

Os mais afetados com certeza serão os sites com PHP, hoje 77% dos sites em PHP rodam sob o PHP 5.2, que não teve nenhum suporte a este buf-fix. O certo é migrar-mos nossos sites para o PHP 5.3.9 RC, a 5.3 ja é a versão estável do PHP, o que garante atualizações de segurança e novos recursos.

Há linguagens que não entraram na lista, pois isso não era novidade para seus criadores, uma que vale a pena destacar, a qual eu sou fã, é o Perl, eles trataram esse problema em meados de 2003, pois ja haviam identificado essa falha.

A explicação é extramamente complexa, vale a pena dar uma olhada no vídeo da apresentação no Youtube .

Você também pode conferir o anúncio oficial.

Animação com JavaScript e imagens Sprite

Posted on junho 14, 2011

Posted by Rodrigo Ireno

Olá a todos caros leitores do objota, antes de mais nada gostaria de dizer que tem sido difícil arrumar tempo para postar, devido a alguns projetos. Mas finalmente consegui arrumar um tempo para me dedicar a mais um artigo no objota.

Neste artigo vamos falar sobre animação utilizando imagens sprite e javascript. Recentemente o site de buscas google.com.br utilizou no lugar de seu logo uma animação muito legal para homenagear uma artista - que não me lembro qual. Mas enfim, fiquei realmente intrigado com aquela bela animação e fui atrás de saber como funcionava aquilo. A base da animação utiliza um conceito bem conhecido: imagens sprite, muito utilizadas em layouts de site para maximizar o carregamento das páginas web. Seguindo esta mesma linha de raciocínio criei o tutorial abaixo.

Primeiramente vamos definir o que é uma animação. Uma animação é uma sequencia de imagens mostradas a uma velocidade que dá a ilusão de existir algo animado, mesmo com desenhos e imagens estáticas.

Sabendo disso, para dar continuidade ao artigo precisamos de uma seqüência de imagens, e para que nós possamos utilizá-la ela precisa ser transformada em um sprite, ou seja, unir todas em uma única imagem. Abaixo segue a imagem que utilizei:

Como pode ver a imagem acima é um sprite de uma seqüência de imagens para animação. Sabendo disso fica claro que para animar esta imagem precisamos movimentar o seu background-position. E o javascript será a ferramenta que iremos utilizar para fazer esta animação.

Eu mesmo implementei um objeto que chamei de MovieClip, não querendo irritar os "flasheiros", hehe.

Dica: Caso ainda não saiba como implementar objetos em javascript veja este artigo.

movie-clip.js

window.MovieClip = function(posx){
 var that = this;
 this.count = 0;
 this.posx = posx || [];
 this.interval = 0;

 this.play = function(){
 that.interval = window.setInterval(function(){
 var s = document.getElementById('sprite');
 s.setAttribute('style','background-position: -'+that.posx[that.count]+'px 0px;');
 that.count++;
 if(that.count >= that.posx.length)that.count = 0;
 }, 300);
 };

 this.stop = function(){
 window.clearInterval(that.interval);
 that.count = 0;
 that.interval = 0;
 };

 this.isRun=function(){
 if(that.interval > 0)return true;
 return false;
 };
};

exemplo.html

<html>
<head>
<title>Sprite</title>
<script type="text/javascript" src="movie-clip.js"></script>
<style type="text/css">
#sprite{
 width: 59px;
 height: 37px;
 background-image: url(RushRun.gif);
 background-repeat: no-repeat;
 background-color: #fff;
}
</style>
</head>
<body>

<div id="sprite"></div>
<input type="button" value="play" id="control"/>

<script>
/*
Inicio o objeto passando um array de valores do eixo X da imagem
iniciando de zero
*/
var filme = new MovieClip([0,59, 117, 177, 235, 294]);
var bt = document.getElementById('control');

bt.onclick=function(){
 if(!filme.isRun()){
 filme.play();
 bt.setAttribute('value', 'stop');
 }
 else{
 filme.stop();
 bt.setAttribute('value', 'play');
 }
};
</script>
</body>
</html>

Veja que neste exemplo de implementação você deve fornecer um array contendo as coordenadas para a animação do sprite. Também deve configurar o número de frames por segundo.

Isso também nos leva a um outro assunto, a qualidade da animação, assim como dos vídeos, depende muito do número de frames por segundo que ele exibe. Quanto maior a quantidade de frames por segundo melhor será a qualidade do vídeo ou animação. Claro, sem apelar para qualidade da imagem e etc.

Bom, este foi meu artigo sobre animação com javascript utilizando sprite. Porém com CSS 3 e HTML 5 a capacidade de criação e os feitos com javascript serão ainda mais incríveis, realmente não vejo a hora destes novos formatos serem adotados e consolidados.

Comente! Qualquer dúvida ou sugestão a respeito deste artigo! Bons estudos.

arquivos para download: js-sprite

Como usar NameSpace no php

Posted on abril 12, 2011

Posted by Rodrigo Ireno

O exemplo mais fácil para referenciar name space é a linguagem JAVA. Que usa o conceito de package e que no final das contas é a mesma coisa. O objetivo de usar este recurso é entre outras coisas organizar suas classes em grupos especializados.

No java se faz o uso de name space ao chamar um objeto diretamente ou método ou ao importar uma classe ou pacote de classes. exemplo:

import javax.swing.JOptionPane.*;

Este exemplo importa tudo o que está dentro do pacote JOptionPane.

Porém essa realidade (import) não se aplica ao php, pois utilizamos o autoload.

Vejamos abaixo uma pequena estrutura montada para utilizar este recurso no php. Implementei um config.php e uma página index.php. A primeira mudança que devemos notar é o modo como a função autoload está sendo implementada

obs: A versão do php que estou usando é 5.3.x

Seguem os arquivos da estrutura:

classes/Usuario.class.php

<?php
namespace classes;

class Usuario{

 function getIdade() {
 return 8;
 }
}

?>

classes/util/Conexao.class.php

<?php
namespace classes\util;

class Conexao{

 function getConnection() {
 return 'is connected!';
 }

}
?>

classes/util/Timer.class.php

<?php
namespace classes\util;

class Timer{

 function getNow(){
 echo "<br />".date("h:m:s")."<br />";
 }
}
?>

config.php

<?php
define("HOME", getEnv("DOCUMENT_ROOT")."/teste/");

spl_autoload_register(function ($class) {

 $nome = str_replace("\\", "/" , $class . '.class.php');

 if( file_exists( HOME . $nome ) ){
 include_once( HOME . $nome );
 }

});
?>

index.php

<?php
include_once("config.php");

use classes\Usuario;
use classes\util\Conexao;
use classes\util\Timer;

$usuario = new Usuario();
$con = new Conexao();
$timer = new Timer();

echo $con->getConnection() . "<br />";
echo $usuario->getIdade() . "<br />";

$timer->getNow();

?>

Note que ao utilizar namespace é obrigatório respeitar a organização dos diretórios. Caso contrário a sua função de autoload não irá funcionar. Em java a organização também é feita desta forma, porém as ferramentas IDE's abstraem um pouco essa parte. Mas como disse no final das contas um package ou namespace é literalmente isso separar em diretórios diferentes o seus arquivos php que contém classes.

Dê uma fuçada na função autoload printando na tela a classe atualmente sendo chamada, e verá que o nome que é recuperado pelo seu parâmetro não traz somente o nome (mas também todo o caminho do namespace especificado no arquivo da classe).

Bom, finalizo este post aqui, e espero que tenha esclarecido algumas dúvidas. valew 😉

arquivos (descompacte no seu htdocs):  download dos arquivos

Utilizando spl_autoload_register

Posted on fevereiro 25, 2011

Posted by Rodrigo Ireno

Neste breve artigo quero mostrar como funciona a função spl_autoload_register que atua igualmente a  função __autoload. Neste caso o próprio nome já descreve em parte o que ela faz, pois esta função registra (ou empilha) mais conteúdo dentro de um escopo de autoload. Disse “escopo” e não função pois ela não pode ser utilizada junto com a função __autoload.

A grande vantagem de utilizar esta função é que você pode incluir módulos em seu sistema web sem se preocupar em incluir as classes deste módulo em seu class path. E utilizá-la é tão fácil quanto o autoload convencional.

Utilizando __autoload:

supondo que os arquivos Objota.class.php e Joao.class.php estão no mesmo diretório do arquivo index.php

Objota.class.php


<?php

class Objota{

 public function __construct(){
 echo "Incluiu Objota<br/>";
 }

}

?>

Joao.class.php


<?php

class Joao{

 public function __construct(){
 echo "Incluiu Joao<br/>";
 }

}

?>

index.php


<?php

function __autoload( $nomeDaClasse ){

 if(file_exists( $nomeDaClasse.".class.php"  )){
 include($nomeDaClasse.".class.php");
 }
 else{
 echo "Não foi possível carregar a classe";
 }

}

$obj = new Objota();

$o = new Joao();

?>

Utilizando a função spl_autoload_register:

Desta vez vamos supor que as classes Objota e Joao são de módulos completamente diferentes, por isso representei com nomes diferenciados., vejamos abaixo:

Objota.objota.class.php


<?php

class Objota{

 public function __construct(){
 echo "Incluiu Objota<br/>";
 }

}

?>

Joao.joao.class.php


<?php

class Joao{

 public function __construct(){
 echo "Incluiu Joao<br/>";
 }

}

?>

index.php


<?php

//funcao que carrega classes do modulo OBJOTA
function objota_carregar_classes( $nomeDaClasse ){

 if(file_exists( $nomeDaClasse.".objota.class.php"  )){
 include($nomeDaClasse.".objota.class.php");
 }

}
spl_autoload_register("objota_carregar_classes");

$obj = new Objota();

//funcao que carrega classes do modulo JOAO
function joao_carregar_classes( $nomeDaClasse ){

 if(file_exists( $nomeDaClasse.".joao.class.php"  )){
 include($nomeDaClasse.".joao.class.php");
 }

}

spl_autoload_register("joao_carregar_classes");

$jo = new Joao();

?>

Observação: A função spl_autoload_register sobrescreve a função autoload então se for adotar o uso desta, certifique-se de que nenhuma parte de seu sistema esteja usando o autoload convencional mas sim a spl_autoload_register.

Esta é uma solução, por exemplo, para a implantação do framework Smarty 3.0 ao seu sistema web. Pois ele utiliza esta função, e caso você não faça uso dela também, terá problemas.

Bom caros leitores este artigo (dica), fica por aqui. Caso haja dúvidas poste aí!

Simulando herança em JavaScript

Posted on fevereiro 14, 2011

Posted by Rodrigo Ireno

Já faz algum tempo que escrevi um artigo de como fazer classes em javascript, porém foi somente uma introdução. Na verdade javascript não é uma linguagem orientada a objetos, ela somente possui alguns recursos que possibilitam simular este conceito de programação.

Se fossemos comparar com todos os recursos que Java (por exemplo) disponibiliza, seria uma completa injustiça, pois atende em peso este conceito. Enquanto javascript sustenta-se apenas com functions, prototipagem e alguns métodos especiais.

Mesmo assim consegue simular uma série de conceitos da orientação a objetos, como:

  • Estruturas de objeto
  • Herança de atributos e métodos – (entre functions)

E pode acreditar, com isso já dá pra fazer muita coisa. Então mão na massa.

Existem várias formas de se fazer esta simulação, mas vou mostrar os métodos que prefiro usar, pois demonstra ter mais organização.

Herança via métodos call e apply

Call:

call( objeto, argumento1, argumento2, argumento3)

Apply:

apply( objeto, ArrayDeArgumentos )

Ambos os métodos trabalham de forma igual, o que eles fazem é trazer o contexto do objeto chamado para dentro do seu objeto atual, não entendeu?.  Vendo é mais fácil!

function Pai( nome, sobreNome){
 this.nome = nome;
 this.sobreNome = sobreNome;
}

function Filho(nome, sobrenome, idade){

 //call chama construtor do objeto Pai
 Pai.call(this, nome, sobrenome);

 this.idade = idade;

 this.mostra = function(){
 alert("Nome completo: "+this.nome+" "+this.sobreNome+"\nIdade: "+this.idade);
 };
}

var objota = new Filho("Maria", "Bonita", 35);

objota.mostra();

Veja que neste exemplo o que fiz foi chamar o construtor do objeto Pai, utilizando a função call. E veja que passei os parâmetros nome e sobrenome.

Agora vejamos este outro exemplo utilizando o método apply. Prefiro esse pois você escreve menos! Hehehe.


function Pai( nome, sobrenome){
 this.nome = nome;
 this.sobreNome = sobrenome;
}

function Filho(nome, sobrenome, idade){

 //apply chama construtor do objeto Pai
 Pai.apply(this, arguments);

 //também pode ser:
 //Pai.apply(this, new Array(nome, sobrenome));

 this.idade = idade;

 this.mostra = function(){
 alert("Nome completo: "+this.nome+" "+this.sobreNome+"\nIdade: "+this.idade);
 };
}

var objota = new Filho("Maria", "Bonita", 35);

objota.mostra();

Como vimos anteriormente o método apply recebe um array com os argumentos, certo. Então. A grande vantagem dele é que podemos utilizar a propriedade arguments herdada do objeto global (que todo objeto em javascript possui). Ele é um array justamente com todos os argumentos necessários para a construção do objeto pai. A única vantagem é a facilidade de implementação caso o objeto em questão tenha muitos argumentos. Você escreve bem menos.

Estes métodos pra mim já dão conta do recado, se você quiser se aprofundar um pouco mais aqui vai pelo menos os nomes dos outros métodos utilizados.

Herança via Object masquerading

Herança via Prototype

Multipla herança

É isso galera, até a próxima. E qualquer coisa comente aí.

Como criar plugins para wordpress – Parte 4 – publicando seu plugin

Posted on janeiro 29, 2011

Posted by Rodrigo Ireno

Como publicar seu plugin no wordpress.org

Neste artigo veremos os passos necessários para se publicar seu plugin no wordpress.org, site oficial do WordPress.

1º - Caso não tenha um cadastro em wordpress.org, registre-se. Pois é preciso estar logado para solicitar um repositório SVN para você. E uma vez que tenha registro seus plugins serão associados ao seu perfil de usuário do wordpress, o mesmo se aplica caso venha a publicar temas.

2º - Licença, caso você não inclua um arquivo de licença (licence.txt) junto ao seu plugin, será considerado pelo wordpress.org que você assumiu a licença GPL2.

3º - É obrigatório incluir o arquivo readme.txt junto ao seu plugin, pois todas as informações da página de seu plugin serão estraídas dele.

4º - Uma vez pronto, testado e funcionando você poderá solicitar a criação de um diretório SVN para seu plugin. Com este diretório será possível você disponibilizar e manter organizado todas as versões de seu plugin. Inclusive enviar versões como beta (em fase de desenvolvimento e teste).

Para isso será necessário manter seu plugin online em algum lugar e enviar uma solicitação através de um formulário como este, informando nome do plugin, breve descrição do que ele faz e a URL para baixar o seu plugin.

Página de solicitação

obs: para isso é preciso estar logado.

Você receberá um email de confirmação do wordpress.org, neste email constará o endereço de seu SVN a senha de acesso para ele será a mesma de acesso  ao seu perfil no wordpress.org.

5º - Baixar um software para gerenciar seu diretório SVN. Eu utilizo o Tortoise.

Entendendo o readme.txt

Este documento é muito importante, deve ficar na raiz do diretório de seu plugin. Como dito antes, as informações que nele constar serão utilizadas para preencher e formar a página oficial de seu plugin no wordpress.org.

Cada aba das páginas de plugin provem deste arquivo, exemplo: description, faq, changelog, screenshots e etc.

Esta página é destinada aos desenvolvedores: Developer Center

Ainda nela é possível ver os links para faq, informações sobre subversion (SVN) e uma página que contém um exemplo do formato padrão do readme.txt e logo abaixo um link para o validador do readme.txt. É muito importante validar seu arquivo, pois caso haja algum erro crítico seu plugin pode não ser publicado corretamente ou talvez nem seja publicado.

SESSÕES DO README.TXT

=== Título do plugin ===

Contributors:
Nome dos contribuidores...

Donate link:
link para possíveis doações

Requires at least: 3.0
mínima versão requerida do wordpress

Tested up to: 3.0.1
versão do wordpress em que o plugin foi testado

Stable tag: 1.2
Versão estável do plugin

Tags:
palavras chaves que tenham relação ao plugin, são apenas para fim de indexação e busca.

== Descritption ==

descrição do plugin

== Installation ==

descrição da instalação

== Frequently Asked Questions ==

= Pergunta é destacada desta forma =
A resposta vem logo embaixo.

== Upgrade Notice ==

1.2 Nesta nova versão temos uma super novidade.

== Screenshots ==

1. Aqui é a descrição da primeira screenshot. A imagem vai na raiz do plugin seu nome deve ser screenshot-1, screenshot-2 e etc..

2. Aqui vem a descrição da segunda screenshot

== Changelog ==

= 1.2 =
* Esta nova versão foram feitos os melhoramentos de....

= 1.1 =
* Este é primero melhoramento no gerenciamento de...

------------
para fazer um link dentro de uma sessão

[texto do meu link](http://www.destinodomeulink.com.br)

Utilizando o Tortoise

Depois de criado seu repositório e validado seu readme.txt, já podemos então publicá-lo. Para isso vamos primeiro para fim de organização criar na máquina local, um diretório plugins_wordpress, dentro deste diretório vamos criar um diretório com o mesmo nome do nosso plugin. Vou supor que o nome do plugin seja Meu WP, provavelmente o meu plugin terá o seguinte nome de diretório meu-wp.

Agora, selecione a pasta e clique com o botão direito, no menu de contexto irá aparecer:

Clique na opção SVN Checkout e será iniciado um download da estrutura de diretórios de seu SVN, será copiado tudo o que tem lá (no momento só os diretórios).

Para isso você precisa informar o diretório SVN online:

Concluído isso você terá a seguinte estrutura de diretórios ( o nome meu-wp é só um exemplo):

Explicando

Diretório trunk – Neste diretório irá ficar a versão disponível para download.

Diretório tags - Neste diretório serão incluídos todas as verões de seu plugin. Atenção o diretório tags trabalha juntamente com trunk. (vejamos adiante).

Diretório branches – Neste diretório ficam versões não oficiais (Em desenvolvimento ou teste).

O diretório trunk e tags trabalham juntos, portanto vamos supor que minha versão seja a 1.0, então devo colocar os arquivos de meu plugin na pasta trunk e criar um diretório dentro de tags como nome 1.0 e dentro dele colocar o mesmo conteúdo de trunk.

Nota: Aqui se vê a importância de informar a Stable tag no documento readme.txt. Portanto se a minha versão atual é a 1.0, em meu documento preciso informar que a Stable tag é a 1.0.

Certifique-se também de que o cabeçalho do plugin no aquivo principal esteja informando a versão correta do plugin – (isso é geralmente o mais fácil de esquecer).

Estes passos são necessário toda vez que for atualizar seu plugin, (recaptulando):

  • Atualizar seus arquivos na pasta trunk
  • Criar um diretório , dentro do diretório tags, como mesmo nome da minha versão atual e nele depositar o conteúdo da pasta trunk.

Fazendo isso, não terá problemas.

Sincronizando com seu SVN

Depois de feita todas as devidas alterações é só sincronizar. Para isso clique no diretório local de seu plugin, clique com o direito e no menu de contexto irá aparecer a opção Commit. Clique nele e  o processo irá iniciar, neste meio ele irá solicitar login e senha (são os mesmos de seu perfil no wordpress.org) informe-o e siga em frente.

Ele irá atualizar seu repositório, mesmo assim existe uma diferença de alguns minutos para que sua página seja atualizada a seu plugin disponibilizados. Talvez certa que 15 minutos.

Depois disso é só aguardar e verificar a página de seu plugin.

É isso pessoal a série termina aqui, espero que tenham curtido. Até a próxima, duvidas sugestões.. fiquem a vontade para comentar.

Como criar plugins para wordpress – Parte 3 – Internacionalização

Posted on janeiro 28, 2011

Posted by Rodrigo Ireno

Vamos abordar neste artigo como internacionalizar o seu plugin. Apesar de parecer complicado e demorado, hoje existem ferramentas para automatizar este processo. O WordPress é capaz de interpretar arquivos .mo e mostrar o idioma de acordo com a localização informada pelo browser do usuário.

Sendo um plugin feito no idioma inglês, ele terá tradução para, por exemplo, português (Brasil) e vários outros. Mas esta tradução é você quem faz. Então vamos logo a um exemplo prático.

Funções __() e _e()

__() – Esta função retorna a tradução disponível para o idioma capturado. Recebe dois parâmetros. O primeiro é a string (frase) escrita em seu idioma de origem. O segundo é o nome de domínio de texto. Veja adiante com detalhes.

_e() – Esta tem as mesmas características da anterior, porém ao invés de retornar a string ela ecoa na tela ( com echo ).

Este nome de domínio de texto deve ser único, e sempre deve ser fornecido a estas duas funções, pois ele será utilizado como prefixo dos arquivos  “.mo e “.po” de tradução. Por tanto..

Optei por fazer algumas mudanças no plugin do artigo anterior para que possamos utilizá-lo neste artigo. Faça download aqui.

Veja que já incluí as funções __() e _e(). E o nome de domínio é “meu-wp”.

Estando o plugin em inglês e vamos traduzi-lo para português (final pt_BR), o nome dos arquivos .mo e .po seriam respectivamente: meu-wp-pt_BR.po e meu-wp-pt_BR.mo.

Mas como criar estes arquivos?

Através de um software free chamado PoEdit.
Instale-o: PoEdit download

Um arquivo .po é um catálogo de tradução, ao criá-lo o PoEdit cria automaticamente o arquivo .mo , que é o arquivo interpretado pelo wordpress. Ele é bem fácil e intuitivo de usar.

Tendo instalado o PoEdit, mão na massa!

1.       Arquivo > Novo Catálogo

2.       No diálogo que aparece, na primeira aba, Insira nome do projeto e versão; Time de tradutores; E email de contato. (não é necessário preencher mais nenhum campo).

3.       Agora na segunda Aba (caminhos). No campo caminho base, se estiver com um “.” ponto não altere em nada. Abaixo clique no botão (Novo ítem) e informe o caminho onde se encontra os scripts de seu plugin. No meu caso ficou assim: C:\xampp\htdocs\blog\wp-content\plugins\meu-wp.

4.       Agora na aba (Palavras chave). Estão os nomes das funções de que capturam os textos a serem traduzidos. Clique em (novo item) e adicione o nome ­__ e em seguida o nome _e. São justamente o nome das funções que foram implementadas para tradução.

Explicando

O que este software faz não tem segredo, mas ajuda muito na tradução de plugins. Ele faz uso de expressão regular para encontrar as strings a serem traduzidas. Se der uma fuçada vai ver que existe uma variedade de linguagens que ele dá suporte. Basicamente o que ele faz é abrir recursivamente todos os arquivos do diretório que informamos. Neste caso os scripts php.

Depois disso confirme e salve o arquivo dentro da pasta lang, dentro do diretório do plugin. Dê o nome meu-wp-pt_BR, ele será salvo como .po e será criado o .mo simultaneamente.

Se ele ao não encontrou nenhuma string a traduzir você pode forçar outra busca clicando no botão atualizar na barra de ferramentas. Ele irá listar todas as frase e palavras encontradas para tradução. Ao clicar em uma linha a frase aparece num campo abaixo, logo abaixo da frase está um input onde você irá inserir a respectiva tradução para aquela sentença. Agora vem o trabalho de tradução. Ainda não acabou...

Carregando os arquivos de tradução

O WordPress interpreta, porém não carrega automaticamente, você deve informá-lo a respeito dos arquivos, com a função:

load_plugin_textdomain('meu-wp', false, 'meu-wp/lang');

Passando por parâmetro, respectivamente: o nome de domínio, false, e o caminho relativo ao diretório onde se encontram as traduções em formato .mo .

Você deve chamar esta função com um gancho init. Ex:

function iniciar(){
  load_plugin_textdomain('meu-wp', false, 'meu-wp/lang');
}
add_action('init', 'iniciar');

Antes de testar

O plugin foi feito em inglês, mas ele só irá traduzir os plugin se em seu cms estiver configurado como pt_BR , verifique em seu wp-config.php se está configurado desta forma. Estando tudo ok, é só testar.

Se tudo deu certo seu plugin foi traduzido com sucesso. O mesmo se aplica para tradução de temas, mas a função é diferente. Porém com essa base já dá pra andar com as próprias pernas.

É isso! próximo artigo será: o 4º da séria - como publicar seu plugin.


Como criar plugins para wordpress – Parte 2 – Boas práticas

Posted on janeiro 26, 2011

Posted by Rodrigo Ireno

Boas práticas para criar Plugins WordPress

Recentemente publiquei um artigo mostrando como fazer um plugin para WordPress. Mas ele era somente mais um hello world. Para complementar então aquele artigo, elaborei esse com base em algumas pesquisas. E vi que existem, pelo menos, estes bons conselhos a se seguir durante a implementação de um plugin. Disponíveis na documentação oficial

Orientação a Objetos

Desenvolver seu plugin utilizando oop já é uma boa iniciativa. Pois minimiza a zero a possibilidade de conflito de funções (funções com mesmo nome). É inclusive recomendado na própria documentação.

Faça bom uso da API de Plugins

Não tente reinventar o que já está pronto. Faça uso do que já está disponível, pois existem funções para fazer de tudo na Plugin API.

Use o objeto $wpdb para querys.

Para operações com banco de dados, utilize o objeto $wpdb. Utilizando-o corretamente é possível evitar SQL Injection. Utilize o atributo prefix deste objeto para montar suas querys, pois assim é possível seguir o padrão estabelecido durante a configuração de instalação do wordpress. Geralmente o prefixo sugerido pelo wordpress é wp_. Porém o usuário tem total liberdade para alterar isso para joaozinho_, agora diga, como você pode adivinhar isso? Simples, não adivinhe! Faça uso de $wpdb->prefix nas querys.

Operações excessivas com o banco de dados 🙁

Evite fazer operações desnecessárias com o banco. Faça todo o processamento e salve só quando necessário. Muitas operações podem abater o desempenho do CMS. Porém operações com SELECT são bem rápidas, se usadas com consciência. Por exemplo: se quer somente id_post e data, faça um select específico para isso. Evite SELECT * FROM. Isso é fatal para o desempenho do servidor.

Options, usar com moderação

Utilize o mínimo de options! Se possível use somente uma. Como? Simples, é possível inserir arrays associativos como parâmetro, ao inserir com add_option eles são serializados e inseridos na tabela option e ao recuperar com get_option o conteúdo já vem como array.

Uso de bibliotecas: jQuery.. etc.

Caso seu plugin faça uso de bibliotecas como, por exemplo, jQuery ou Prototype, não precisa inserir eles por sua conta. Basta solicitar isso ao WordPress e ele irá chamar para você. Com a função wp_enqueue_script é possível chamar bibliotecas específicas. E para inserir seu script é só usar a função wp_register_script. Mas faça chamada aos scripts somente quando forem realmente utilizados, pois esse arquivo será um peso a mais na hora de carregar as páginas. Compressão de script também é bem vinda.

Nome descritivo para o seu plugin

Essa parte é até meio óbvia, se você fez um plugin que serve para adicionar um botão de twitter na página. Então é natural que seu nome tenha alguma relação, como: add Button twitter, Power Button Twitter e etc. Isso ajuda muito nas buscas, porque ela basicamente procura pelo nome do plugin. Agora, uma vez decidido o nome do dito cujo, utilize um padrão para nomear os arquivos relacionados ao seu plugin. Ex:  meu-plugin.php, meu-plugin-config.php, meu-plugin-style.css, meu-plugin-script.js e etc.

Organização de arquivos

Procure manter bem organizado os arquivos que compõe seu plugin. Agrupe arquivos css, js e imagens em diretórios separados.

Boa limpeza nas desinstalações!

Sempre programe uma função de desinstalação, pois sujeira acumulada prejudica o desempenho do CMS. E pode trazer problemas até mesmo para uma futura instalação do próprio plugin autor dos itens esquecidos. Apague tabelas, options, imagens e outros. Se possível seria bom até mesmo mostrar ao usuário o que foi excluído.

Implementar para internacionalização

Não é difícil e nem arranca pedaço! Para internacionalizar seu plugin primeiro é preciso implementá-lo com as funções __() e _e().  A função __() retorna uma string e _e() ecoa a string na tela.

Este é um conjunto de boas práticas para se seguir durante a implementação de um plugin. Com certeza devem existir outras. Mas acredito que seguindo-as já seja possível fazer plugins de qualidade. Dando o mínimo de risco aos usuário do CMS.

Considerações finais:

Se você acha que faltou alguma coisa e tem alguma sugestão ou dúvida. Por favor comente! Estas foram algumas recomendações, todas elas encontradas no site oficial (link informado lá em cima).

fim e até a próxima!

Como criar plugins para WordPress – Parte 1

Posted on janeiro 25, 2011

Posted by Rodrigo Ireno

Neste artigo, vou mostrar como fazer um plugin para WordPress. Nele vamos utilizar algumas funções básicas para introduzir alguns conceitos. Neste caso vou utilizar orientação a objetos. Então vamos fazer:

Um plugin que fará uso de filtros para adicionar uma frase ao final do post. E também utilizar as actions de instalação e desinstalação.

Antes de prosseguir vamos responder algumas perguntas:

O que é um plugin WordPress?

Um plugin é um conjunto de scripts organizado de forma padronizada, que serve para estender as funcionalidades da plataforma WordPress. Existem os mais variados tipos de plugins. Por tanto...

Porque fazer um plugin?

Você deve optar por fazer um plugin somente se não existir, ou se sua funcionalidade não se aplica ao problema que você quer resolver. Como dito antes, exitem plugin’s para fazer de tudo nesta plataforma. Por tanto antes de fazer um, faça uma busca para se certificar de que já não exista um que atenda as suas necessidades.

Tendo tudo isso em mente, vamos em frente. Vejamos agora a estrutura básica de um plugin WordPress:

  • Arquivo principal (O arquivo que irá receber o cabeçalho.). É aconselhável que este arquivo PHP tenha um nome relacionado à sua atividade. Isso ajuda muito na busca (caso você venha publicá-lo).
  • Cabeçalho é um trecho comentado no topo do seu arquivo de plugin.
  • Readme.txt este arquivo é preciso caso venha publicar seu plugin no site oficial.
  • Função de: instalação, desinstalação e negócio

Arquivo Principal

Vamos do início. Suponhamos que você faça um plugin com nome Meu WP. Quando instalado todos os plugins ficam dentro do diretório /wp-content/plugins/. O nome ideal para o diretório deste plugin seria: meu-wp. O nome para o arquivo php, poderia ser: meu-wp.php ou meuWp.php.

Este arquivo principal conterá no início do script o cabeçalho padrão de um plugin, caso ele não tenha não será considerado um plugin pelo WordPress.

Neste arquivo é que devem ser chamadas as funções de instalação e desinstalação. E demais funções utilitárias, como por exemplo criar um aba no menu para o seu plugin ou até mesmo uma composição inteira de menu drop-down.

Cabeçalho

Este é o cabeçalho padrão necessário para seu arquivo plugin. Na própria documentação do WordPress é citado que somente o nome é obrigatório. Mas convenhamos colocar Nome do autor, seu email de contato e site é bem útil, não?! Eis o dito cujo:


/*
Plugin Name: Meu WP
Plugin URI: http://www.meuwp.com.br
Description: Ele faz alguma coisa..
Version: 1.0
Author: Meu nome vem aqui
Author URI: http://www.meusite.com.br
*/

readerme.txt

Este arquivo deve ficar na raiz do diretório do seu plugin (caso você venha publicá-lo). Veja o readme.txt padrão disponível do site oficial ( eles também tem um validador ). Uma coisa a ressaltar sobre este arquivo é que ele irá estruturar a página de seu plugin no site oficial. Muito em breve irei escrever um artigo explicando como postar seu plugin.

Licença

A licença é a padrão GPL2, deve ser incluída abaixo do cabeçalho do plugin.


/*  Copyright YEAR  NOME_DO_AUTOR  (email : EMAIL_DO_AUTOR)

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License, version 2, as
 published by the Free Software Foundation.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

Funções de instalação:

O WordPress disponibiliza uma séria de eventos que podem ser capturados através dos chamados hooks. Com eles é possível especificar a execução de uma função em determinados momentos do processamento deste CMS. Por exemplo, capturar quando o usuário posta algo, ou quando um comentário é exibido. Existe uma infinidade de eventos que podem ser capturados. Veja as referências no final deste artigo.

Nota: Seu plugin não precisa de nenhuma função para ser ativado ou desativado no painel de gerenciamento de plugins. De fato ele só precisa de um cabeçalho. Mas do que adianta ter um plugin que não faz nada rs..

Vejamos então as actions de instalação e desinstalação. Elas já foram feitas especificamente para isso, capturar evento ativação e desativação do plugin:

register activation hook


//Caso chame uma função simples:
register_activation_hook( __FILE__, 'nomeDaFuncao' );

//Caso chame de uma classe:
register_activation_hook( __FILE__, array('NomeDaClasse', 'NomeDoMetodo') );

register deactivation hook


//Para destivar com uma função:
register_deactivation_hook( __FILE__, 'NomeDaFuncao' );

//Para destivar com o método de uma classe:
register_activation_hook( __FILE__, array('NomeDaClasse', 'nomeDoMetodo') );

Criar uma página de configuração de seu plugin

É possível adicionar composições de meu, através das funções: add_menu_page e add_submenu_page.

Funções Utilitárias

A API de plugins do WordPress é muito completa, possui métodos que fazem de  tudo. Um método que vamos utilizar neste artigo é o get_option.

Options no WordPress

É possível através de um conjunto de métodos option capturar, guardar, atualizar e deletar opções do banco de dados sem digitar uma linha de SQL. Mas cuidado o ideal é usar somente uma option para seu plugin. Nestas options podemos capturar dados triviais como url do blog, nome, descrição. Tudo isso utilizando o comando certo passado por parâmetro. Veremos adiante.

Com tudo isso já podemos começar:

Nossa estrutura de trabalho:

Nome do plugin: Meu WP
Nome do arquivo principal: meu-wp.php
Pagina de configuração: meu-wp-config.php
Sub página: meu-wp-sub-pagina.php
Seu diretório: /meu-wp/

O que ele faz:

Ele captura o evento de post; Concatena o conteúdo do post com a frase configurada na sua página de configuração.

Mão na massa finalmente:

Arquivo principal: meu-wp.php

Ele conterá o cabeçalho.


<?php
/*
Plugin Name: Meu WP
Plugin URI: http://www.meuwp.com.br
Description: Ele faz alguma coisa..
Version: 1.0
Author: Meu nome vem aqui
Author URI: http://www.meusite.com.br
*/

class MeuWp{

 public function ativar(){
 add_option('meu_wp', '');
 }
 public function desativar(){
 delete_option('meu_wp');
 }
 public function criarMenu(){

 add_menu_page('titulo Meu WP', 'Meu WP',10, 'meu-wp/meu-wp-config.php');

 add_submenu_page('meu-wp/meu-wp-config.php', 'Sub pagina 01', 'titulo 01', 10, 'meu-wp/meu-wp-sub-pagina.php');

 }

 public function adicionaFrase($textoDoPost){
 $frase = get_option('meu_wp');

 if( strlen( $frase ) > 0 ){
 //famos dar um estilo pra diferenciar do resto!
 $frase = '<span style="color: #f00; font-size: 18px;">'.$frase.'</span>';

 return $frase."<br /><br />".$textoDoPost;
 }
 else{
 return $textoDoPost;
 }
 }
}

$pathPlugin = substr(strrchr(dirname(__FILE__),DIRECTORY_SEPARATOR),1).DIRECTORY_SEPARATOR.basename(__FILE__);

// Função ativar
register_activation_hook( $pathPlugin, array('MeuWp','ativar'));

// Função desativar
register_deactivation_hook( $pathPlugin, array('MeuWp','desativar'));

//Ação de criar menu
add_action('admin_menu', array('MeuWp','criarMenu'));

//Filtro do conteúdo
add_filter("the_content", array("MeuWp","adicionaFrase"));
?>

Página de configuração: meu-wp-config.php

Onde iremos configurar a frase que irá aparecer nos posts.


<?php
$msg = '';

if($_POST){
 update_option('meu_wp', $_POST['frase']);

 $msg = '<div id="message"><p>Frase configurada, veja seus posts agora!</p></div>';
}
?>
<div>
<div id="icon-plugins"><br /></div>

<h2>Meu WP - Configurações</h2>
<?php echo $msg; ?>
<form action="" method="post">
<dt>
 <b>Frase</b>
 <dd>
 <input type="text" name="frase" value="<?php echo get_option('meu_wp');?>"/>
 </dd>
 </dt>
<input type="submit" name="Submit" value="Salvar altera&ccedil;&otilde;es" />
</form>
</div>
</div>

Sub página: meu-wp-sub-pagina.php

Sub-página, só pra exemplificar.


<div>
<div id="icon-plugins"><br /></div>

<h2>Meu WP - sub página 1 - sinto muito, mas não faço nada!</h2>

<form action="" method="post">
<dt>
 <b>hello</b>
 <dd>
 <input type="text" name="nome" value=""/>
 </dd>
 </dt>
<input type="submit" name="Submit" value="Salvar altera&ccedil;&otilde;es" />
</form>
</div>
</div>

Com todos estes arquivos devidamente criados nossa estrutura de diretórios ficou assim:

/meu-wp/meu-wp.php
/meu-wp/meu-wp-config.php
/meu-wp/meu-wp-sub-pagina.php

Explicando...

Método ativar. Este método é chamado pela action de instalação e executa as ações de instalação. Se seu plugin tiver que criar uma tabela, por exemplo, é ali que se deve fazer isso.

Método desativar. Se em ativar você insere seu conteúdo e configurações aqui você remove. Ainda existem plugins que questionam o usuário se ele quer retirar as configurações salvas.

Método criarMenu. Chama o método para criar uma nova composição de menu add_menu_page e add_submenu_page. Para mais informações e possibilidades veja a documentação.

Método adicionarFrase. Este método está sendo chamado por um filter com o gancho the_content, este gancho insere por parâmetro o conteúdo do post. Filtros não alteram o banco de dados, somente apresentação no browser. Existem muitos ganchos, capturando todo tipo de evento. Veja as referências no final da página.

Instalando!

Agora vamos testar! Eu presumo que você tenha um localhost e um wordpress instalado nele. Então é só copiar o sua pasta meu-wp para dentro do diretório /wp-content/plugins/ , acesse o painel de gerenciamento de plugins e vualá! Ele está lá esperando sua ativação.

obs: Se você quiser compactar e testar online mesmo (o que eu não aconselho, a menos que tenha um site só pra teste). Não se esqueça de que o WordPress só descompacta arquivos .zip.

Chegamos ao fim. Fiquem espertos, pois ainda vou postar mais dois artigos para completar este. Qualquer dúvida e sugestão poste aí. Até a próxima.

Download dos arquivos: Meu WP

Agora seguem os links de referência:

Introdução
http://codex.wordpress.org/pt:Plugins

Escrevendo um Plugin:
http://codex.wordpress.org/Writing_a_Plugin

Plugin API:
http://codex.wordpress.org/Plugin_API

Adicionando Menus de Administração:
http://codex.wordpress.org/Adding_Administration_Menus

hook de ativação
http://codex.wordpress.org/Function_Reference/register_activation_hook

hook de desativação
http://codex.wordpress.org/Function_Reference/register_deactivation_hook

Add menu Page:
http://codex.wordpress.org/Function_Reference/add_menu_page

Add sub menu page:
http://codex.wordpress.org/Function_Reference/add_submenu_page

Filter Reference:
http://codex.wordpress.org/Plugin_API/Filter_Reference

Action Reference:
http://codex.wordpress.org/Plugin_API/Action_Reference

Ferramentas de Desenvolvimento Web

Posted on janeiro 24, 2011

Posted by Rodrigo Ireno

Olá desenvolvedores! Neste artigo vou abordar um assunto que é de grande interesse para quem está começando. Com tantas opções, variações e versões ( :S quanto “ões”! ). Em fim. É exatamente isso que deixa muita gente confusa na hora de escolher uma IDE.

Vou listar aqui algumas IDE’s que usei e dizer algumas vantagens e desvangens. Não pretendo fazer um a análise profunda, por tanto se tiver algo a acrescentar fique a vontade, comente sua experiência!

Vamos começar!

EditPlus


Este cara é um editor peso pena. Ele é bem simples não possui recursos de auto-completar, é praticamente um bloco de notas coloridos. Porém se você tem pressa com projetos online, creio que não exista mais rápido para salvar via ftp, já testei e é muito veloz. Mas tome cuidado, já ouvi alguns relatos de amigos que perderão arquivos inteiros por causa de alguns bugs. Isso porque (não sei se exatamente a versão) ele não cria um arquivo temporário para salvar via FTP (o que deveria ser de praxe), ele vai direto no arquivo. Então já sabe, se ele começar a ficar lento ou der algum pau no meio do processo de salvamento do seu arquivo, seja precavido e faça você mesmo uma cópia local do arquivo pode ser no bloco de notas mesmo.

NuSphere – PhpED


Esta é com certeza uma das melhores, para desenvolvimento web. É veloz para trabalhos via ftp, e possui uma vasta biblioteca com funções de auto-completar. Até hoje não encontrei grandes problemas nesta IDE, além do fato de ser pago L, mas fazer o que. Com relação à velocidade da troca via FTP, digamos que é um pouco mais lento que o EditPlus. Outra coisa muito bacana a se destacar é que ela dá suporte nativo ao Smarty Template.

PHP Eclipse


Um eclipse para edição de html, css, javascript, etc. Porém o que me deixa intrigado é que nem se quer as funções nativas do php ele destaca no código L. Totalmente sem noção! Tem suporte nativo para FTP. Auto-completa classes que você já criou, e uma grande vantagem, ele pode ser estendido com o uso de plugins e isso pode desbancar muita gente.

ZendStudio


Um eclipse super tunado, feito pela própria empresa que mantém o projeto PHP. É uma ótima IDE para os mais diversos projetos. Com o maravilhoso comando Generate Getters and Setters. Uma vez que você abriu um arquivo de uma classe e trabalhou nela, ele reconhece seus métodos e atributos e completa quando você está digitando. Claro que dá suporte a seu próprio framework zend. Porém é feito em java, por tanto é um pouco lento trabalhar com ele em projetos online via FTP. E quanto à licença, é gratuito para testar por cerca de um mês ou dois, depois deste prazo algumas funcionalidades são bloqueadas.

Aptana Studio


Quanto a esta IDE, não tenho tanto a dizer, pois comecei a utilizá-la recentemente. Então aqui vai um trecho de um artigo sobre Aptana escrito pelo Rodrigo Araújo do site codigofonte:

(...) Aptana Studio é um IDE de desenvolvimento para aplicações da web 2.0, gratuito, código livre, com suporte Ajax, PHP, Ruby on Rails, Adobe Air, iPhone, etc. Com Aptana se facilita em desenvolvimento integrado de Ajax com as tecnologías emergentes. (...)

Resumindo, estas são algumas das características principais de Aptana Studio:

  • Ajudas visuais para a escritura de scripts em diversos linguagens, como colorido e auto-escritura do código, ajudas contextuais de referência à medida que se escreve, etc.
  • Visualização de erros de sintaxe à medida que se escreve.
  • Suporte para fazer FTP a servidores remotos, com ferramentas para sincronização.
  • Debug em Firefox (Debug Internet Explorer também com a versão Profissional)
  • Bibliotecas de funções em Javascript populares em Ajax/Javascript para utilizar nos projetos.
  • Exemplos já criados para começar a conhecer as possibilidades de desenvolvimento rapidamente.
  • Pré-visualização de estilos CSS com o editor CSS.
  • Extensível a partir de plug-ins que pode criar Aptana ou outras empresas e ferramentas para estar a par de qualquer nova adição.
  • Extensível por Javascript. Os usuários podem escrever scripts para realizar ações e macros.
  • Os Snippets permitem inserir fragmentos de texto que se utilizam muitas vezes.

(...)

Então é isso! Espero que eu tenha ajudado um pouco você a se decidir a qual IDE utilizar. Pois há quem diga que quem é bom faz no bloco de notas. E é mesmo isso é verdade, o cara realmente pode fazer. Porém quando ele tiver uma classe com 50 atributos e tiver que fazer métodos get e set para cada um... vamos ver quem vai ser o doido de fazer num bloco de notas rs...

Se estiverem de bom humor comente um pouco de sua experiência. Pois eu mesmo até hoje não utilizei todos os recursos destas IDE’s, somente o essencial.