Lumine – mapeamento de banco de dados para PHP

Quando entrei no meu atual emprego, quase 4 anos atrás, uma cosia que eu não conhecia mesmo era esse lance de frameworks.
Talvez pela mistura de ser novato em programação web (conhecia bem html/css e um pouco de php) e ter trabalhado com programação c/c++, onde os programadores prezam muito o fato de se conhecer como as coisas funcionam – e não só fazer funcionar.

No fundo, eu concordo: não acho o ideal já partir de cara para o uso de frameworks, sem nem saber como as coisas são feitas na unha. Até porque, quando aparece algum problema no desenvolvimento, na maior parte das vezes temos que mudar algo no framework, ou fazer um work-around indo lá no meio do código – ou seja, fazer o trabalho sujo de catar milho e escrever código.

Um dos frameworks que mais me chamou atenção foi o Hibernate. É um framework para aplicações java, para persistêcnia de dados. Basicamente, você persiste objetos (sim, objetos, aqueles, do conceito da Orientação a Objetos) em bancos de dados sem ter que se preocupar em como isso vai funcionar; ao invés de ter que ficar escrevendo querys SQL de consulta, inserção, deleção, etc… você chama apenas um método específico que os objetos herdam, e o framework faz todo o trabalho.
Qual a vantagem? Bancos de dados SQL possuem uma estrutura totalmente diferente da forma como os dados existem na orientação a objetos. Fazer código para manipular os dados é custoso – tanto em termos de tempo quanto de trabalho. Quando o framework se propõe a fazer isso, o ganho de produtividade é gigantesco. Sem falar que, com isso, mudar de um banco de dados para o outro é bem mais simples, pois normalmente frameworks desse tipo possuem tal suporte.

Depois de ter conhecido esse framework, fiquei um tempo pensando se não tinha nada parecido em PHP (que é a linguagem server-side para web que mais conheço). Foi quando me deparei com o Lumine. Ele surgiu depois que um programador PHP conheceu também o Hibernate e sentiu necessidade de fazer o mesmo para PHP.
*não conheço o autor desse framework, mas já deixo aqui meus parabéns pra ele
A configuração dele é muito fácil: você escolhe qual banco de dados vai usar (por enquanto pode usar MySQL e PostGree) e define as strings de conexão (login, senha, etc…).
Depois, faz o mapeamento das classes com relação às tabelas do banco. Ou seja, você específica que uma classe (por exemplo Pessoa) estará relacionada a uma tabela do bando (chamada tbl_pessoa) e que os atributos (por exemplo nome, idade, sexo) estarão relacionados a colunas específicas da tabela.
Feito isso, você pode usar os métodos específicos para manipulação dos dados, como inserir uma nova Pessoa:

// recupera o arquivo que faz a configuração de lumine
// descrita anteriormente em "inicializando a configuração"
require_once ´configuracao.php´;
// Importa a classe pessoa
Util::Import(´entidades.Pessoa´);
// instancia a classe pessoa
$pessoa = new Pessoa;
// atribui propriedades
$pesso->nome = ´Hugo´;
$pessoa->idade = 23;
$pessoa->cpf = ´12345678912´;
// persiste o objeto no banco, usando insert
$pessoa->insert();

 

Ou recuperar do banco:

// instancia um novo objeto
$pessoa = new Pessoa;
// recupera o objeto com código 1 pela primeira chave primária da classe
$total = $pessoa->get( 1 );

 

Fica muito mais fácil pois você deixa de ter que misturar as querys SQL no meio do seu código PHP; o desacoplamento é muito maior, e a legibilidade é bem melhor: faz muito mais sentido você ver no código Pessoa->insert() do que toda aquela linguiçona SQL…
Minha sugestão? Quando tiver um tempo, baixe esse framework e experimente. Explore. Há uma curva de aprendizado, claro, e no começo a produtividade cairá um pouco. Mas, depois, a agilidade que ele te dá valerá a pena 🙂

E-commerce – recomende o que eu quero comprar

Comecei a escrever este texto quando eu e o Chris publicamos posts sobre Cookies:

Este na verdade seria o primeiro post sobre cookies que eu ia publicar, mas resolvi antes escrever a parte técnica sobre como criar e requisitar cookies para partir para a "filosofia" do uso, focado aqui em e-commerce.

Para melhorar a experiência do usuário precisamos primeiro pensar como ele, um usuário que visita um e-commerce chegou lá provavelmente por:

  • Intenção de compra
  • Pesquisa de preço (é a intenção de compra de quem tá sem dinheiro…)
  • "Por engano" através de publicidade

Resumindo a estas três formas de entradas, todas elas indicam algum interesse nos produtos – mesmo que não naquele momento.

Jabá

Se você está pensando em começar um negócio na internet recomendo a leitura de: Senhor empresário, porquê investir na internet? onde publiquei alguns dados sobre a movimentação (é muuuito dinheiro) crescente de dinheiro na internet, e as vantagens não só do e-commerce mas do site institucional.

Na vida offline

Quando você vai em uma revenda de automóveis e gosta de um carro, você pede pra ver, entrar, faz um test-drive e o vendedor percebe quando você gostou ou não de um produto devido a atenção que você dá a ele (o produto, não o vendedor!).

Se você voltar uma semana depois e o vendedor for bom, ele de cara vai soltar uma frase mais ou menos assim:

E aí, vai para casa dirigindo o Sentra hoje?

E acredite, isso vai perturbar tua cabeça pois tu vai se imaginar com aquele produto que tu tanto gostou na semana passada!


Sim, isso desperta desejo.

 

Porquê não fazer isso no seu e-commerce?

Deixe o sistema "lembrar" o que o usuário gostou e recomendar produtos que o usuário já tem intenção de compra, as chances de concretizar a venda são muito maiores!

 

Na vida online

Você está navegando e acessa um site de compras, por qualquer um dos três motivos que citei lá em cima, e acaba visitando a página de diversos produtos, mas entre eles você gostou de cinco produtos, que você salvou a url para mostrar para sua namorada.

Ela chega em casa e você mostra para ela os cinco produtos que você tem a url salvo, que são:

 

Nenhuma compra – você só queria mostrar para ela que encontrou os produtos e achou barato.

Pronto, agora o sistema (representando o vendedor) sabe que você gostou mais dos cinco produtos ali listados, pois tem informações armazenadas em cookies que eles foram visualizados por você duas vezes.

Você entra na Home da loja e aparece uma chama de produtos em destaque, misteriosamente os mesmo que você mostrou para sua namorada!

Aí está um exemplo simples em que os cookies podem ser usados para recomendações de produtos em um e-commerce, mas este exemplo é só uma das possibilidades.

 

Coloque a cabeça para funcionar, melhorar a experiência do usuário automaticamente vai melhorar as vendas do seu site! 🙂

Usando a Prototype – passo 2 – submit de form por ajax

Uma das coisas básicas em termos de programação para web é fazer um formulário em que você envia os dados para uma página que recebe os mesmos e insere (ou atualiza) uma tabela no banco de dados.
Vou mostrar abaixo como fazer isso de uma forma mais bacana, por ajax (sem precisar dar submit mesmo no form) com a ajuda da prototype (seguindo a série de posts), e totalmente acessíve. (se o usuário estiver num browser com o javascript desabilitado, funcionará corretamente, da forma tradicional).

Como falei, usaremos a prototype. Mais especificamente, o método request() da classe Form. Esse método serializa os dados do formulário e faz o request usando o método request() da classe Ajax da própria prototype, usando a action do form como url.
Obs.: O que é serializar os dados do form? O método percorre todos os elementos de dados de um formulário (inputs, selects, textareas…) e monta uma string no formato [nome do primeiro elemento]=[valor do primeiro elemento]&[nome do segundo elemento]=[valor do segundo elemento]&..&[nome do último elemento]=[valor do último elemento]
Mais sobre a serialização: http://www.prototypejs.org/api/form/serialize

No exemplo abaixo, ao clicar no botão submit do form, a função javascript é chamada. Essa função recebe o próprio form como parâmetro, e já chamo diretamente o método request() que faz o request para edit.php
No retorno da função (chamado de callback) eu verifico o que é retornado por esse edit.php
Nele, eu defini que se der algum erro será jogado o valor -1, e em caso de sucesso, 1 (e, nesse caso, chamo o método reset() que apaga todos os dados preenchidos no formulário, deixando-o pronto para uma nova inserção)

Código funciona html + javascript: 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Exemplo Prototype - form</title>
<script src="http://www.prototypejs.org/assets/2008/1/25/prototype-1.6.0.2.js"></script>
<script type="text/javascript">
    function submitForm(form) {
        /*
        usa método request() da classe Form da prototype, que serializa os campos
        do formulário e submete (por POST como default) para a action especificada no form
        */
        form.request({
          onComplete: function(transport){
              /*
            se o retorno for diferente de -1, entende-se que não houve problemas, então apaga-se
            os campos do formulário usando o método reset() da classe Form
            */
            if(transport.responseText!=-1)
                form.reset();
            }
        });
        return false;
    }
</script>
</head>
<body>
<h1>Submeter form com prototype</h1>
<form id="edit" name="edit" action="edit.php" onsubmit="submitForm(this); return false;">
    <label for="name">nome:</label><input type="text" name="name" id="name" />
    <label for="desc">descrição:</label><input type="text" name="desc" id="desc" />
    <label for="quant">quantidade:</label><input type="text" name="quant" id="quant" />
    <input type="submit" value="salvar" />
</form>
</body>
</html>

Segue abaixo também o código da página edit.php; vale lembrar que independe se é um php ou asp ou qualquer outra coisa. Conforme já comentei nesse post aqui  a linguagem usada no server-side não tem impacto algum na implementação javascript – devem ser implementações totalmente desacopladas (até porque uma é server-side, e outra client-side).

<?php
$bdConnection = mysql_connect("localhost", "root", "");
mysql_select_db("exemplos_andafter");
$sql = "INSERT INTO `produtos` (`name`, `desc`, `quant`) VALUES(´" . $_POST["name"] . "´, ´" . $_POST["desc"] . "´, ´" . $_POST["quant"] . "´)";
$result = mysql_query($sql) or die("-1");
echo("1");
?>

Qualquer dúvida, comentem 🙂

 

Internet Explorer 8 – beta 2

E foi lançado o beta 2 do Internet Explorer 8 (faça aqui o download).

Além de estar bem mais bonito e fácil de usar, a grande diferença para quem trabalha com web é o suporte dado pelo browser aos padrões web (webstandards) – a Microsoft já tinha feito um bom avanço no IE7, quando comparado ao IE8; mas parece que agora essa preocupação ficou mais forte (será que  apelo da comunidade ajudou nisso?). Inclusive muitas coisas da especificação 3 do CSS estão sendo implementadas (veja aqui a lista de novidades em termos de CSS no IE8).
Okey, muitas coisas desse IE8 não são novidades para quem usa Firefox ou Opera, por exemplo, como um DOM Inspector ou melhor debugger de javascript (coisa que o Firebug faz no FF), a opção de desativar o CSS ou, ainda, um campo para buscar em diferentes serviços (Live Search, Google, Yahoo, etc…) e suporte a microformats (IE´s Web Slices).

 

A cara nova do IE8:


Campo de sugestão de busca


Seleção de compatibilidade (onde você pode ver as páginas rendereizadas em versões antigas do IE)


Bookmarks

 

Vale a pena falar que há uma mudança grande na parte de privacidade: existe uma funcionalidade nova, chamada de private browsing, onde o usuário pode incapacitar o browser de acessar dados (como o histórico, dados de formulário, arquivos temporários, etc…). Com um clique apenas, você pode definir que um site específico não deve ter seus dados gravados, evitando qualquer referência a ele no seu histórico.

Sugiro esse post aqui, bem completinho, sobre as funcionalidades do IE8.

[update]Nesse post aqui no Webinsider, fala-se sobre o impacto do private browsing em termos de métricas[/update]