Ecommerce, mais simples do que parece

Post on 29-Jun-2015

1.303 views 0 download

Transcript of Ecommerce, mais simples do que parece

mais simples do que parecemais simples do que pareceE-commerceE-commerce

Michael Granados - @dgmikeMichael Granados - @dgmike

Então... você tem uma idéia, mas...

Por onde começar?

Seja rápido

Quanto mais tempo demorar para começar sua startup mais você estará jogando dinheiro fora!

Inicie seu negócio enquanto antes, seu lucro só virá depois que você se lançar definitivamente

Desenvolvimento ágil

Programador preguiçoso?

O seu trabalho é deixar com que as pessoas façam menos esforços

Inspire-se em você mesmo

Uma idéia!

e-commerce

E-commerce pronto?

● Magento● Joomla + VirtueMart● WordPress + WP-shopping-cart● Django + Sathmo● Loja Locaweb● OsCommerce● PretaShop● ...

O ambienteO ambiente

O ambiente

● Sistema de controle de versão - GIT● Linguagem forte e madura – PHP● Banco de dados – MySQL● Servidor – Apache

Controle de versão – existem vários

● Subversion● Bazaar● Git● Mercuial● CVS

Como funciona?

Como funciona?

FTPFTP

Como funciona?

FTPFTPSkywalker

UPLOAD

Como funciona?

FTPFTP

Como funciona?

FTPFTP

Corrige BUG online

Como funciona?

FTPFTP Darth Vader

UPLOAD

Como funciona?

REPOSITÓRIO

Como funciona?

REPOSITÓRIO

Skywalker Darth Vader

1

Como funciona?

REPOSITÓRIO

clone

1

1 1

Como funciona?

REPOSITÓRIO

push

2

2

1

Como funciona?

REPOSITÓRIO

push2

2

1

Como funciona?

REPOSITÓRIO

2

2

1

Como funciona?

REPOSITÓRIO

2

2

2

pull

Como funciona?

REPOSITÓRIO

push2

3

3

Como funciona?

REPOSITÓRIO SERVIDOR

clone/pull

push

Framework – vantagens

● Métodos mágicos que auxiliam no desenvolvimento

● Regras que ajudam a manter a organização dos arquivos – geralmente MVC

● Gama de interfaces para bancos de dados● Helpers que libertam-te de escrever código● Scripts que geram boa parte do código● Gerenciamento de cache – deixando a

aplicação mais rápida

Framework – desvantagens

● Você precisa aprender uma nova lingua● O fato dos scripts gerarem boa parte do código

interfere em sua criação● Regras que nem sempre se aplicam a seu

negócio● Criação de demasiados arquivos que nem

sempre são necessários

Frameworks - exemplos

● Zend Framework● CodeIgniter● CakePHP● Synphony● Spaghetti*● VórticePHP

Proposta, um microframework

● Público: github● Organização: MVC – Model, View, Control● Gerenciamento de URLs

O que o framework terá

● Manipular Banco de Dados● Métodos mágicos definidos por você● Reaproveitamento de código● URLs amigáveis● Segurança● Fácil de entender● Simples de fazer manutenção

M de MVC – Model

Iremos usar PDO (PHP Database Object) como base para o Model

● Suporte para vários bancos de dados● Nativo desde o PHP5.2● Extensível● Orientado a Objetos● Fácil de usar

M de MVC – Model

Vários bancos, apenas um objeto

new PDO(‘mysql:dbname=banco;host=localhost’,

‘usuario’, ‘senha’);

new PDO(‘sqlite:/opt/database/mydb.sq3’);

Helper – pau pra toda obra!

function error() {

die('Internal Server Error.');

}

function url($uri) {

return BASE_URL.$uri;

}

function valor($numero) {

return "R$ ".number_format($numero);

}

Mapeamento de URLs – URLs amigáveis

$urls = array(

# 'Expressão regular' => “Controller”

'^/?$' => 'Inicio',

'^/categoria/(\d+)/?$' => 'Categoria',

'^/produto/(\d+)/?$' => 'Produto',

);

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

Abracadabra: a mágica!$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/';

foreach ($urls as $regexp => $class) {

if (preg_match("@$regexp@", $url, $atributos)) {

if (class_exists($class)) {

array_shift($atributos);

$method = $_POST ? 'post' : 'get';

$class = new $class;

call_user_func_array(array($class, $method), $atributos);

die();

}

}

}

error();

O resultado!

class Inicio {

function get($attr1, $attr2, $attr3) {

// seu controller

}

function post() { // opcional

}

}

O resultado!

class Inicio { # controller

function get($attr1, $attr2, $attr3) {

// seu controller

}

function post() { // opcional

}

}

O resultado!

class Inicio {

function get($attr1, $attr2, $attr3) {

// seu controller

}

function post() { // opcional

}

}

O resultado!

class Inicio {

function get($attr1, $attr2, $attr3) {

// seu controller

}

function post() { // opcional

}

}

Template: aproveitando os métodos mágicos

Adicionando um produto

class Adiciona {

public function get($id, $ajax = false) {

$con =& get_con();

if (!$con->produto($id)) {

error();

}

if (isset($_SESSION['carrinho'][$id])) {

$_SESSION['carrinho'][$id]++;

} else {

$_SESSION['carrinho'][$id] = 1;

}

header('Location: '.url('carrinho'));

}

}

E-commerce pronto?!

Para que o e-commerce esteja pronto de fato, falta apenas um detalhe: o comprador deve comprar

Vamos por a mão na massa!!!

Formas de pagamento

Boleto bancário

Cartão de crédito

Cartões de débito

Transação entre contas...

... ou usar o PagSeguro

PagSeguro: como funciona?

PagSeguro: como funciona?

Pague com o PagSeguro

PagSeguro: como funciona?

Pague com o PagSeguro

POST

PagSeguro: como funciona?

Usuário - POST

E o tal do retorno?

Usuário - POST

Usuário - GET

E o tal do retorno?

Usuário - POST

Usuário - GET

Robô POST

E o tal do retorno?

Usuário - POST

Usuário - GET

Robô POST

Bad GuyPOST?

E o tal do retorno?

Usuário - POST

Usuário - GET

Robô POST

POST – TOKEN

VERIFICADO/FALSO

E o tal do retorno?

Bad GuyPOST?

Na pática, use a biblioteca

A Visie possui uma ótima biblioteca que gera o formulário de forma simples

http://visie.com.br/pagseguro/php.php

http://github.com/pagseguro

#comofas?

require_once('pagseguro/pgs.php');

$cod = uniqid(true);

$pgs = new Pgs(array(

'email_cobranca' => 'mike@visie.com.br',

'tipo' => 'CP',

'ref_transacao' => $cod,

));

#comofas?

foreach ($_SESSION['carrinho'] as $id => $qtd) {

$produto = $con->produto($id);

$pgs->adicionar(array(

'id' => $produto->id,

'descricao' => $produto->nome,

'valor' => $produto->valor,

'quantidade' => $qtd,

));

}

Melhoria: brincando com JS

$pgs->mostra(array(

'open_form' => false,

'show_submit' => false

));

document.forms[0].submit();

#comofas Retorno automático

Use o cod_referencia

Passo final: Publicando!

Com o controle de versão e um servidor bom, tudo fica mais fácil!

Faça o clone do projeto no servidor

Import do banco de dados

Divulgue!

Links

http://dgmike.com.br/dgeco

http://slideshare.com/dgmike

http://github.com/dgmike/dgeco

Referências

http://php.net/

http://br.php.net/pdo

http://github.com/

http://learn.github.com/

http://visie.com.br/pagseguro

http://www.generatedata.com/

http://tinyurl.com/mkmu58 (W3C: HTML5)

Perguntas?!

http://meadiciona.com/dgmike

http://formspring.me/dgmike

@dgmike