SlideShare uma empresa Scribd logo
1 de 67
Baixar para ler offline
E-commerce
mais simples do que parece




Michael 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 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?



       FTP
Como funciona?



                       FTP
Skywalker




              UPLOAD
Como funciona?



       FTP
Como funciona?
           Corrige BUG online


       FTP
Como funciona?



        FTP      Darth Vader




      UPLOAD
Como funciona?
REPOSITÓRIO
Como funciona?
    REPOSITÓRIO


                1




Skywalker   Darth Vader
Como funciona?
    REPOSITÓRIO


              1


             clone

1                 1
Como funciona?
    REPOSITÓRIO


              2



      push
2                 1
Como funciona?
    REPOSITÓRIO


              2



             push
2                 1
Como funciona?
    REPOSITÓRIO


              2




2                 1
Como funciona?
    REPOSITÓRIO


              2



             pull
2                   2
Como funciona?
    REPOSITÓRIO


              3



             push
2                 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?
PagSeguro: como funciona?



          Pague com o
           PagSeguro
PagSeguro: como funciona?



Pague com o   POST
 PagSeguro
E o tal do retorno?


    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



Bad Guy
 POST?    Robô
          POST
E o tal do retorno?


                 Usuário - POST




                 Usuário - GET

                 POST – TOKEN

Bad Guy
 POST?    Robô
          POST


                                  VERIFICADO/FALSO
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

Mais conteúdo relacionado

Mais procurados

PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPGuilherme Blanco
 
Orientação a Objetos em PHP
Orientação a Objetos em PHPOrientação a Objetos em PHP
Orientação a Objetos em PHPzehzinho
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicaçãoAntonio Spinelli
 
Da Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualDa Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualMichael Castillo Granados
 
Criando controle de acesso com php e my sql
Criando controle de acesso com php e my sqlCriando controle de acesso com php e my sql
Criando controle de acesso com php e my sqlPaulo Damas
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressZé Fontainhas
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraFlávio Lisboa
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidademetzen
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2garux
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Fugindo das armadilhas do MVC
Fugindo das armadilhas do MVCFugindo das armadilhas do MVC
Fugindo das armadilhas do MVCEdiaimo Borges
 

Mais procurados (19)

Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHP
 
Orientação a Objetos em PHP
Orientação a Objetos em PHPOrientação a Objetos em PHP
Orientação a Objetos em PHP
 
jQuery na Prática!
jQuery na Prática!jQuery na Prática!
jQuery na Prática!
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicação
 
Da Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualDa Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtual
 
Criando controle de acesso com php e my sql
Criando controle de acesso com php e my sqlCriando controle de acesso com php e my sql
Criando controle de acesso com php e my sql
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPress
 
Prog web 06-php-oo
Prog web 06-php-ooProg web 06-php-oo
Prog web 06-php-oo
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Bread board
Bread boardBread board
Bread board
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidade
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2
 
Minicurso de jQuery
Minicurso de jQueryMinicurso de jQuery
Minicurso de jQuery
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Fugindo das armadilhas do MVC
Fugindo das armadilhas do MVCFugindo das armadilhas do MVC
Fugindo das armadilhas do MVC
 

Semelhante a Ecommerce, mais simples do que parece

Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroMichael Castillo Granados
 
Programação web ii aulas 06 e 07
Programação web ii   aulas 06 e 07Programação web ii   aulas 06 e 07
Programação web ii aulas 06 e 07Yuri Bispo
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHPAugusto das Neves
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Willian Magalhães
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesCarlos Santos
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveisLabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveisCarlos Santos
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosRegis Magalhães
 
LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09Carlos Santos
 

Semelhante a Ecommerce, mais simples do que parece (20)

Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguro
 
Curso de Introdução - PHP
Curso de Introdução - PHPCurso de Introdução - PHP
Curso de Introdução - PHP
 
Programação web ii aulas 06 e 07
Programação web ii   aulas 06 e 07Programação web ii   aulas 06 e 07
Programação web ii aulas 06 e 07
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Ajax em java
Ajax em javaAjax em java
Ajax em java
 
Aula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQLAula 02 - Curso PHP e MySQL
Aula 02 - Curso PHP e MySQL
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveisLabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
LabMM4 (T11 - 12/13) - PHP - Tipos de dados e variáveis
 
Php 05 Mvc
Php 05 MvcPhp 05 Mvc
Php 05 Mvc
 
Php curl - Coleta de dados na web
Php curl - Coleta de dados na webPhp curl - Coleta de dados na web
Php curl - Coleta de dados na web
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09
 

Ecommerce, mais simples do que parece

  • 1. E-commerce mais simples do que parece Michael Granados - @dgmike
  • 3. 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
  • 4. Programador preguiçoso? O seu trabalho é deixar com que as pessoas façam menos esforços Inspire-se em você mesmo
  • 6. E-commerce pronto? ● Magento ● Joomla + VirtueMart ● WordPress + WP-shopping-cart ● Django + Sathmo ● Loja Locaweb ● OsCommerce ● PretaShop ● ...
  • 8. O ambiente ● Sistema de controle de versão - GIT ● Linguagem forte e madura – PHP ● Banco de dados – MySQL ● Servidor – Apache
  • 9. Controle de versão – existem vários ● Subversion ● Bazaar ● Git ● Mercuial ● CVS
  • 12. Como funciona? FTP Skywalker UPLOAD
  • 14. Como funciona? Corrige BUG online FTP
  • 15. Como funciona? FTP Darth Vader UPLOAD
  • 17. Como funciona? REPOSITÓRIO 1 Skywalker Darth Vader
  • 18. Como funciona? REPOSITÓRIO 1 clone 1 1
  • 19. Como funciona? REPOSITÓRIO 2 push 2 1
  • 20. Como funciona? REPOSITÓRIO 2 push 2 1
  • 21. Como funciona? REPOSITÓRIO 2 2 1
  • 22. Como funciona? REPOSITÓRIO 2 pull 2 2
  • 23. Como funciona? REPOSITÓRIO 3 push 2 3
  • 24. Como funciona? REPOSITÓRIO SERVIDOR clone/pull push
  • 25. 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
  • 26. 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
  • 27. Frameworks - exemplos ● Zend Framework ● CodeIgniter ● CakePHP ● Synphony ● Spaghetti* ● VórticePHP
  • 28. Proposta, um microframework ● Público: github ● Organização: MVC – Model, View, Control ● Gerenciamento de URLs
  • 29. 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
  • 30. 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
  • 31. 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’);
  • 32. 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); }
  • 33. Mapeamento de URLs – URLs amigáveis $urls = array( # 'Expressão regular' => “Controller” '^/?$' => 'Inicio', '^/categoria/(d+)/?$' => 'Categoria', '^/produto/(d+)/?$' => 'Produto', );
  • 34. 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();
  • 35. 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();
  • 36. 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();
  • 37. 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();
  • 38. 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();
  • 39. 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();
  • 40. 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();
  • 41. 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();
  • 42. O resultado! class Inicio { function get($attr1, $attr2, $attr3) { // seu controller } function post() { // opcional } }
  • 43. O resultado! class Inicio { # controller function get($attr1, $attr2, $attr3) { // seu controller } function post() { // opcional } }
  • 44. O resultado! class Inicio { function get($attr1, $attr2, $attr3) { // seu controller } function post() { // opcional } }
  • 45. O resultado! class Inicio { function get($attr1, $attr2, $attr3) { // seu controller } function post() { // opcional } }
  • 46. Template: aproveitando os métodos mágicos
  • 47. 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')); } }
  • 48. 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!!!
  • 49. Formas de pagamento Boleto bancário Cartão de crédito Cartões de débito Transação entre contas... ... ou usar o PagSeguro
  • 52. PagSeguro: como funciona? Pague com o PagSeguro
  • 53. PagSeguro: como funciona? Pague com o POST PagSeguro
  • 54. E o tal do retorno? Usuário - POST
  • 55. E o tal do retorno? Usuário - POST Usuário - GET
  • 56. E o tal do retorno? Usuário - POST Usuário - GET Robô POST
  • 57. E o tal do retorno? Usuário - POST Usuário - GET Bad Guy POST? Robô POST
  • 58. E o tal do retorno? Usuário - POST Usuário - GET POST – TOKEN Bad Guy POST? Robô POST VERIFICADO/FALSO
  • 59. 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
  • 60. #comofas? require_once('pagseguro/pgs.php'); $cod = uniqid(true); $pgs = new Pgs(array( 'email_cobranca' => 'mike@visie.com.br', 'tipo' => 'CP', 'ref_transacao' => $cod, ));
  • 61. #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, )); }
  • 62. Melhoria: brincando com JS $pgs->mostra(array( 'open_form' => false, 'show_submit' => false )); document.forms[0].submit();
  • 64. 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!