sexta-feira, 13 de julho de 2012

MVC PHP- PHP OOP


Olá. Neste post pretendo demonstrar um exemplo simples e prático de como usar o PHP orientado a objetos no esquema MVC (Model View Controller).
Observação : esse esquema passa a funcionar muito bem a partir do PHP 5.3

O resultado final será uma página que lista os clientes cadastrados.
(nos próximos posts de PHP posso detalhar as funções CRUD)

Não pretendo discutir os conceitos de MVC, apenas mostrar sua implementação em PHP, destacando a facilidade de construção e manutenção de código, quando as partes (camadas) da aplicação estão separadas em :
M- Modelo de Dados: estrutura dos Objetos (Classes)
V-View: Interface de apresentação dos dados p/ o Usuário (Telas ou páginas)
C- Controle : Regras de negócios (Componentes e Controllers)


Essas camadas devem ser independentes, ou seja : se mudar alguma regra de negócio, esta deve ser implementada na camada de Controle, assim como se a interface for alterada, não existe a a necessidade de se mexer nas regras.


Eu costumo utilizar mais uma "camada" em minhas aplicações conhecida como DAO (Data Access Object) que é a camada responsável pela comunicação com o Banco de Dados. Esta é utilizada pela camada de Controle para carregar os Modelos com os dados e entregar para as Views.


Figura 1- Resumo MVC


Exemplo de organização de código : (Neste exemplo mostrarei com a seção clientes)
Figura 2- Estrutura de pastas e arquivos


--App :
--Controller : cada Objeto tem o seu
, é onde ficam as regras de negócio



--DAO : cada Objeto tem o seu


--Model : quase todas as entidades do DB possuem o seu Objeto e outras informações que sejam compartilhadas em várias seções do site 



View : cada Objeto tem sua pasta com as operações básicas de qualquer CRUD (Create Read Update Delete) e um índice (lista inicial)
C->  add.php
R->  view.php
U->  edit.php
D-> remove.php


--lib : pasta que contém as principais funções compartilhadas  do sistema.




pastas com itens de layout do site :
--css : estilos css
--images : imagens da seção pública
--img : imagens da seção privada
--js : arquivos javascript
--pages : as páginas do site
--static_includes : arquivos que não mudam : meta-tags, cabeçalho, rodapé










Tabelas do Banco de Dados (MYSQL nesse exemplo):
Cliente,Estado,Cidade
Figura 3- Diagrama do DB

-- estado 
CREATE  TABLE IF NOT EXISTS `mydb`.`estado` (
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `uf` VARCHAR(2) NULL DEFAULT NULL ,
  `nome` VARCHAR(45) NULL DEFAULT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB
AUTO_INCREMENT = 28
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci

-- cidade 
CREATE  TABLE IF NOT EXISTS `mydb`.`cidade` (
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `estado_id` INT(11) NOT NULL ,
  `uf` VARCHAR(2) NULL DEFAULT NULL ,
  `nome` VARCHAR(120) NULL DEFAULT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `estado_cidade_FK` (`estado_id` ASC) ,
  CONSTRAINT `estado_cidade_FK`
    FOREIGN KEY (`estado_id` )
    REFERENCES `mydb`.`estado` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 9715
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci


-- cliente

CREATE  TABLE IF NOT EXISTS `mydb`.`cliente` (
  `id` INT(11) NOT NULL AUTO_INCREMENT ,
  `nome` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
  `email` VARCHAR(130) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
  `ddd` VARCHAR(3) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `fone` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
  `ramal` VARCHAR(6) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `endereco` VARCHAR(255) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
  `numero` VARCHAR(7) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
  `complemento` VARCHAR(30) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `bairro` VARCHAR(150) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `cidade_id` INT(11) NOT NULL ,
  `estado_id` INT(11) NOT NULL ,
  `cep` VARCHAR(9) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
  `tipo_end` ENUM('Res','Com','Cor') CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL DEFAULT 'Res' ,
  `tipo_fone` ENUM('Res','Com','Cel') CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT 'Res' ,
  `tipo_cliente` ENUM('pf','pj') CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `cnpj` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `cpf` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `inscr_estadual` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
  `senha` VARCHAR(8) NULL DEFAULT NULL ,
  `ativo` TINYINT(1) NOT NULL DEFAULT '1' ,
  `contato` VARCHAR(150) NULL DEFAULT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `cidade_cliente_FK` (`cidade_id` ASC) ,
  INDEX `estado_cliente_FK` (`estado_id` ASC) ,
  CONSTRAINT `cidade_cliente_FK`
    FOREIGN KEY (`cidade_id` )
    REFERENCES `mydb`.`cidade` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `estado_cliente_FK`
    FOREIGN KEY (`estado_id` )
    REFERENCES `mydb`.`estado` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci




Após algumas introduções , vamos ao código : 
De onde veio este exemplo existem clientes e funcionários.Ambos são pessoas.
Assim sendo temos a classe base Pessoa e as classes que estendem Pessoa que são Cliente e Funcionario. 
/app/model/Pessoa.php
//  @arquivo = /app/model/Pessoa.php
//  MVC : model
//  objeto : Pessoa

class Pessoa {

    var $id;
    var $nome;

    //construtor para poder usar o operador new()
    public function Pessoa() {}

    public function getId() {
        return $this->id;
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

}
/app/model/Cliente.php
//  @arquivo = /app/model/Cliente.php
//  MVC : model
//  objeto : Cliente

require_once($_SERVER['DOCUMENT_ROOT'] . '/app/model/Pessoa.php');
class Cliente extends Pessoa{

    var $email;
    var $ddd;
    var $fone;
    var $ramal;
    var $endereco;
    var $enderecoNum;
    var $enderecoComplemento;
    var $bairro;
    var $cidadeId;
    var $estadoId;
    var $cep;
    var $tipoEndereco;
    var $tipoFone;
    var $tipoCliente;
    var $cnpj;
    var $cpf;
    var $inscrEstadual;
    var $senha;
    //auxiliar
    var $cidadeNome;
    var $estadoNome;

    public function Cliente() {
        $this->id=0;
    }

    //funcoes automagicas pode fazer assim 
    function __set($param, $value) {
        $this->$param = $value;
    }

    function __get($var) {
        return $this->$var;
    }
    // ou fazer todos os getters e setters 
    public function getEmail() {
        return $this->email;
    }

    public function setEmail($email) {
        $this->email = $email;
    }

    public function getDdd() {
        return $this->ddd;
    }

    public function setDdd($ddd) {
        $this->ddd = $ddd;
    }

    public function getFone() {
        return $this->fone;
    }

    public function setFone($fone) {
        $this->fone = $fone;
    }

    public function getRamal() {
        return $this->ramal;
    }

    public function setRamal($ramal) {
        $this->ramal = $ramal;
    }

    public function getEndereco() {
        return $this->endereco;
    }

    public function setEndereco($endereco) {
        $this->endereco = $endereco;
    }

    public function getEnderecoNum() {
        return $this->enderecoNum;
    }

    public function setEnderecoNum($enderecoNum) {
        $this->enderecoNum = $enderecoNum;
    }

    public function getEnderecoComplemento() {
        return $this->enderecoComplemento;
    }

    public function setEnderecoComplemento($enderecoComplemento) {
        $this->enderecoComplemento = $enderecoComplemento;
    }

    public function getBairro() {
        return $this->bairro;
    }

    public function setBairro($bairro) {
        $this->bairro = $bairro;
    }

    public function getCidadeId() {
        return $this->cidadeId;
    }

    public function setCidadeId($cidadeId) {
        $this->cidadeId = $cidadeId;
    }

    public function getEstadoId() {
        return $this->estadoId;
    }

    public function setEstadoId($estadoId) {
        $this->estadoId = $estadoId;
    }

    public function getCep() {
        return $this->cep;
    }

    public function setCep($cep) {
        $this->cep = $cep;
    }

    public function getTipoEndereco() {
        return $this->tipoEndereco;
    }

    public function setTipoEndereco($tipoEndereco) {
        $this->tipoEndereco = $tipoEndereco;
    }

    public function getTipoFone() {
        return $this->tipoFone;
    }

    public function setTipoFone($tipoFone) {
        $this->tipoFone = $tipoFone;
    }

    public function getTipoCliente() {
        return $this->tipoCliente;
    }

    public function setTipoCliente($tipoCliente) {
        $this->tipoCliente = $tipoCliente;
    }

    public function getCnpj() {
        return $this->cnpj;
    }

    public function setCnpj($cnpj) {
        $this->cnpj = $cnpj;
    }

    public function getCpf() {
        return $this->cpf;
    }

    public function setCpf($cpf) {
        $this->cpf = $cpf;
    }

    public function getInscrEstadual() {
        return $this->inscrEstadual;
    }

    public function setInscrEstadual($inscrEstadual) {
        $this->inscrEstadual = $inscrEstadual;
    }

    public function getSenha() {
        return $this->senha;
    }

    public function setSenha($senha) {
        $this->senha = $senha;
    }

    public function getCidadeNome() {
        return $this->cidadeNome;
    }

    public function setCidadeNome($cidadeNome) {
        $this->cidadeNome = $cidadeNome;
    }

    public function getEstadoNome() {
        return $this->estadoNome;
    }

    public function setEstadoNome($estadoNome) {
        $this->estadoNome = $estadoNome;
    }

    
}
/app/controller/ClienteController.php
//  @arquivo = /app/controller/ClienteController.php
//  MVC : controller
//  objeto : Cliente

require_once($_SERVER['DOCUMENT_ROOT'] . '/app/model/Cliente.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/app/dao/ClienteDAO.php');

class ClienteController {
    // nao é necessario criar um construtor
    function add(Cliente $cliente) {
        $clienteDAO = new ClienteDAO();
        $clienteDAO->adicionarCliente($cliente);
    }

    function edit(Cliente $cliente) {
        $clienteDAO = new ClienteDAO();
        $clienteDAO->atualizarCliente($cliente);
    }

    function remove($clienteId) {
        $clienteDAO = new ClienteDAO();
        $clienteDAO->removerCliente($clienteId);
    }

    function desativar($clienteId) {
        $clienteDAO = new ClienteDAO();
        $clienteDAO->desativarCliente($clienteId);
    }

    public function loadOptions($idPreSelecionado) { // p/ montar os combos
        $clienteDAO = new ClienteDAO();
        $clientes = $clienteDAO->getClientes();
        $conta = 0;

        foreach ($clientes as $cliente) {

            if ($idPreSelecionado == $cliente->getId()) {
                echo " \n";
            } else {
                echo " \n";
            }
            $conta++;
        }

        if ($conta == 0) {
            echo " \n";
        }
    }

    public function buscaOptions($busca) {
        $clienteDAO = new ClienteDAO();
        $clientes = $clienteDAO->getClientesBusca($busca);
        $conta = 0;


        foreach ($clientes as $cliente) {
            echo " \n";
            $conta++;
        }

        if ($conta == 0) {
            echo " \n";
        }
    }

    public function atualizaPerfil(Cliente $cliente) {
        $clienteDAO = new ClienteDAO();
        $clienteDAO->atualizarPerfil($cliente);
    }

    public function getDadosPaginados($primeiroRegistro, $numPorPagina, $buscaCliente) {

        $clienteDAO = new ClienteDAO();
        $clientes = $clienteDAO->getClientesPaginados($primeiroRegistro, $numPorPagina, $buscaCliente);

        return $clientes;
    }

    public function getTotalClientes($buscaCliente) {
        $clienteDAO = new ClienteDAO();
        $total = $clienteDAO->getTotalClientes($buscaCliente);

        return $total;
    }

    public function loadDados($id) {
        $clienteDAO = new ClienteDAO();
        $cliente = $clienteDAO->load($id);
        return $cliente;
    }

    public function localizarReexecucoes(Cliente $cliente) {

        $clienteDAO = new ClienteDAO();
        $total = $clienteDAO->getTotalReexecucoes($cliente);
        return $total;
    }

    public function getListaClientes() {
        $clienteDAO = new ClienteDAO();
        $clientes = $clienteDAO->getClientes();
        return $clientes;
    }

}
/app/dao/ClienteDAO.php
//  @arquivo = /app/dao/ClienteDAO.php
//  MVC : controller
//  objeto : Cliente

require_once($_SERVER['DOCUMENT_ROOT'] . '/app/model/Cliente.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/lib/Conexao.php');

class ClienteDAO {

    public function ClienteDAO() {
        
    }

    public function adicionarCliente(Cliente $cliente) {
        $sqlQuery = "INSERT INTO `mydb`.`cliente`
                (
                `nome`,
                `email`,
                `ddd`,
                `fone`,
                `ramal`,
                `endereco`,
                `numero`,
                `complemento`,
                `bairro`,
                `cidade_id`,
                `estado_id`,
                `cep`,
                `tipo_end`,
                `tipo_fone`,
                `tipo_cliente`,
                `cnpj`,
                `cpf`,
                `inscr_estadual`,
                `senha`)
                VALUES
                ("
                . "'" . $cliente->getNome() . "',"
                . "'" . $cliente->getEmail() . "',"
                . "'" . $cliente->getDdd() . "',"
                . "'" . $cliente->getFone() . "',"
                . "'" . $cliente->getRamal() . "',"
                . "'" . $cliente->getEndereco() . "',"
                . "'" . $cliente->getEnderecoNum() . "',"
                . "'" . $cliente->getEnderecoComplemento() . "',"
                . "'" . $cliente->getBairro() . "',"
                . $cliente->getCidadeId() . ","
                . $cliente->getEstadoId() . ","
                . "'" . $cliente->getCep() . "',"
                . "'" . $cliente->getTipoEndereco() . "',"
                . "'" . $cliente->getTipoFone() . "',"
                . "'" . $cliente->getTipoCliente() . "',"
                . "'" . $cliente->getCnpj() . "',"
                . "'" . $cliente->getCpf() . "',"
                . "'" . $cliente->getInscrEstadual() . "',"
                . "'" . $cliente->getSenha() . "' "
                . ")";


        $conexao = new Conexao();
        $conexao->conecta();
        $rs = $conexao->executeUpdate($sqlQuery);
        $conexao->desconecta();
    }

    public function atualizarCliente(Cliente $cliente) {
        $sqlQueryUpdate = "UPDATE  `mydb`.`cliente`
                 SET "
                . "`nome`='" . $cliente->getNome() . "',"
                . "`email`='" . $cliente->getEmail() . "',"
                . "`ddd`='" . $cliente->getDdd() . "',"
                . "`fone`='" . $cliente->getFone() . "',"
                . "`ramal`='" . $cliente->getRamal() . "',"
                . "`endereco`='" . $cliente->getEndereco() . "',"
                . "`numero`='" . $cliente->getEnderecoNum() . "',"
                . "`complemento`='" . $cliente->getEnderecoComplemento() . "',"
                . "`bairro`='" . $cliente->getBairro() . "',"
                . "`cidade_id`=" . $cliente->getCidadeId() . ","
                . "`estado_id`=" . $cliente->getEstadoId() . ","
                . "`cep`='" . $cliente->getCep() . "',"
                . "`tipo_end`='" . $cliente->getTipoEndereco() . "',"
                . "`tipo_fone`='" . $cliente->getTipoFone() . "',"
                . "`tipo_cliente`='" . $cliente->getTipoCliente() . "',"
                . "`cnpj`='" . $cliente->getCnpj() . "',"
                . "`cpf`='" . $cliente->getCpf() . "',"
                . "`inscr_estadual`='" . $cliente->getInscrEstadual() . "',"
                . "`senha`='" . $cliente->getSenha() . "' "
                . "WHERE `id`=" . $cliente->getId();
        //echo 'entrei aqui';
        //print_r($cliente);
        // echo $sqlQueryUpdate;
        $conexao = new Conexao();
        $conexao->conecta();
        $rs = $conexao->executeUpdate($sqlQueryUpdate);
        $conexao->desconecta();
    }

    public function removerCliente($clienteId) {
        $sqlQuery = "DELETE FROM `mydb`.`cliente` "
                . "WHERE `id`=" . $clienteId;
        //echo $sqlQuery; 
        $conexao = new Conexao();
        $conexao->conecta();
//        try{
        $rs = $conexao->executeUpdate($sqlQuery);
        $conexao->desconecta();
    }

    public function desativarCliente($clienteId) {
        $sqlQuery = "UPDATE  `mydb`.`cliente` 
  SET ativo = false "
                . "WHERE `id`=" . $clienteId;
        //echo $sqlQuery; 
        $conexao = new Conexao();
        $conexao->conecta();
        $rs = $conexao->executeUpdate($sqlQuery);
        $conexao->desconecta();
    }

    public function getClientes() {

        $arrClientes = array();
        $indice = 0;
        $sqlQuery = "Select id,nome from cliente order by nome";

        $conexao = new Conexao();
        $conexao->conecta();
        $rs = $conexao->executeQuery($sqlQuery);

        while ($row = mysql_fetch_array($rs)) {
            $cliente = new Cliente();
            $cliente->setId($row['id']);
            $cliente->setNome($row['nome']);
            $arrClientes[$indice] = $cliente;
            $indice++;
        }

        $conexao->desconecta();
        return $arrClientes;
    }

    public function getClientesBusca($busca) {
        $arrClientes = array();
        $indice = 0;
        $sqlQuery = "Select id,nome from cliente where nome like '%" . $busca . "%' order by nome";

        $conexao = new Conexao();
        $conexao->conecta();
        $rs = $conexao->executeQuery($sqlQuery);

        while ($row = mysql_fetch_array($rs)) {
            $cliente = new Cliente();
            $cliente->setId($row['id']);
            $cliente->setNome($row['nome']);
            $arrClientes[$indice] = $cliente;
            $indice++;
        }

        $conexao->desconecta();
        return $arrClientes;
    }

    public function atualizarPerfil(Cliente $cliente) {
        $sqlQueryUpdate = "UPDATE  `mydb`.`cliente`
                 SET "
                . "`nome`='" . $cliente->getNome() . "',"
                . "`email`='" . $cliente->getEmail() . "',"
                . "`ddd`='" . $cliente->getDdd() . "',"
                . "`fone`='" . $cliente->getFone() . "',"
                . "`ramal`='" . $cliente->getRamal() . "',"
                . "`tipo_fone`='" . $cliente->getTipoFone() . "',"
//                . "`senha`='" . $cliente->getSenha() . "' "
                . "WHERE `id`=" . $cliente->getId();
        $conexao = new Conexao();
        $conexao->conecta();
        $rs = $conexao->executeUpdate($sqlQueryUpdate);
        $conexao->desconecta();
    }

    public function getClientesPaginados($primeiroRegistro, $numPorPagina, $buscaCliente) {
        $sqlQuery = "Select CL.*,C.nome as cidade,E.nome as estado 
from cliente CL left join estado E on (CL.estado_id = E.id) 
left join  cidade C on (CL.cidade_id=C.id ) ";
        if ($buscaCliente != NULL) {
            $sqlQuery.=" WHERE CL.nome like '%" . $buscaCliente . "%' ";
        }

        $sqlQuery.= " LIMIT " . $primeiroRegistro . "," . $numPorPagina;
        $conexao = new Conexao();
        $conexao->conecta();
        $rs = $conexao->executeQuery($sqlQuery);
        $cache = array();
        while ($row = mysql_fetch_array($rs)) {

            $cliente = new Cliente();
            $cliente->setId($row['id']);
            $cliente->setNome($row['nome']);
            $cliente->setEmail($row['email']);
            $cliente->setDdd($row['ddd']);
            $cliente->setFone($row['fone']);
            $cliente->setRamal($row['ramal']);
            $cliente->setEndereco($row['endereco']);
            $cliente->setEnderecoNum($row['numero']);
            $cliente->setEnderecoComplemento($row['complemento']);
            $cliente->setBairro($row['bairro']);
            $cliente->setCidadeId($row['cidade_id']);
            $cliente->setEstadoId($row['estado_id']);
            $cliente->setTipoEndereco($row['tipo_end']);
            $cliente->setTipoFone($row['tipo_fone']);
            $cliente->setTipoCliente($row['tipo_cliente']);
            $cliente->setCnpj($row['cnpj']);
            $cliente->setCpf($row['cpf']);
            $cliente->setInscrEstadual($row['inscr_estadual']);
            $cliente->setSenha($row['senha']);

            $cliente->setCidadeNome($row['cidade']);
            $cliente->setEstadoNome($row['estado']);
            $line = array(
                'id' => $cliente->getId(),
                'nome' => $cliente->getNome(),
                'email' => $cliente->getEmail()
            );
            array_push($cache, $line);
        }

        $conexao->desconecta();
        return $cache;
    }

    public function getTotalClientes($buscaCliente) {

        $conexao = new Conexao();
        $conexao->conecta();
        $sqlQuery = "SELECT COUNT(*) as total FROM mydb.cliente C ";
        if ($buscaCliente != NULL) {
            $sqlQuery.=" WHERE C.nome like '%" . $buscaCliente . "%' ";
        }
        $rs = $conexao->executeQuery($sqlQuery);
        $total = 0;
        while ($row = mysql_fetch_array($rs)) {
            $total = $row['total'];
        }

        $conexao->desconecta();
    }

    public function load($id) {

        $conexao = new Conexao();
        $conexao->conecta();
        $sqlQuery = "SELECT *  FROM mydb.cliente C where id=" . $id;
        $rs = $conexao->executeQuery($sqlQuery);
        $cliente = new Cliente();
        if ($row = mysql_fetch_array($rs)) {

            $cliente->setId($row['id']);
            $cliente->setNome($row['nome']);
            $cliente->setEmail($row['email']);
            $cliente->setTipoCliente($row['tipo_cliente']);
            $cliente->setCpf($row['cpf']);
            $cliente->setCnpj($row['cnpj']);
            $cliente->setDdd($row['ddd']);
            $cliente->setFone($row['fone']);
            $cliente->setRamal($row['ramal']);
            $cliente->setEndereco($row['endereco']);
            $cliente->setEnderecoNum($row['numero']);
            $cliente->setEnderecoComplemento($row['complemento']);
            $cliente->setBairro($row['bairro']);
            $cliente->setCidadeId($row['cidade_id']);
            $cliente->setEstadoId($row['estado_id']);
            $cliente->setTipoEndereco($row['tipo_end']);
            $cliente->setTipoFone($row['tipo_fone']);
            $cliente->setInscrEstadual($row['inscr_estadual']);
//            $cliente->setSenha($row['senha']);
        }
        $conexao->desconecta();
        return $cliente;
    }

    public function getTotalReexecucoes(Cliente $cliente) {
        $conexao = new Conexao();
        $conexao->conecta();
        $total = 0;
        $sqlQuery = "Select count(*) as total from ordem_servico OS 
LEFT JOIN servicos_ordem_servico SOS on (SOS.ordem_servico_id = OS.id)
where OS.cliente_id=" . $cliente->getId() . "
and SOS.reexecucao=1
and OS.data_entrada >= DATE_SUB(NOW(), INTERVAL 3 MONTH) ";
        $rs = $conexao->executeQuery($sqlQuery);
        while ($row = mysql_fetch_array($rs)) {
            $total = $row['total'];
        }
        $conexao->desconecta();
        return $total;
    }

}
/lib/Conexao.php
<?
/*
  @arquivo = /lib/Conexao.php
  MVC :  controller
  objeto : Conexao
  obs : arquivo em uso na versão corrente
 */

Class Conexao {

    var $host;
    var $user;
    var $pass;
    var $dbname;
    var $data;
    var $db;
    var $saida;
    var $status;
    var $entrada;

    function Conexao() {
        
    }

    public function conecta() {
        $this->status = 0;
        $this->host = "SERVIDOR";
        $this->user = "LOGIN_BANCO";
        $this->pass = "SENHA_BANCO";
        $this->dbname = "NOME_DB";
        $this->db = mysql_connect($this->host, $this->user, $this->pass);

        if (!$this->db) {
//  echo "Erro ao conectar no banco".trigger_error(mysql_error(),E_USER_ERROR);
            echo "Erro ao conectar no banco" . mysql_error();
        } else {
            //echo "Conectado no banco";
            $this->status = 1;
        }
        mysql_select_db($this->dbname, $this->db);
        mysql_set_charset('utf8');
    }

    public function executeQuery($query) {
        if ($this->status == 1) {
            //echo "lista...";
            if ($this->saida = mysql_query($query)) {
                // echo 'Rs loaded';
                return $this->saida;
            } else {
                echo "<pre class=\"error\">";
                echo "SQL ERROR: " . mysql_error();
                echo "SQL : " . $query;
                echo "</pre>";
                desconecta();
            }
        }
    }

    public function executeUpdate($query) {
        if ($this->status == 1) {
            if ($this->entrada = mysql_query($query)) {
                return true;
            } else {
                echo "<pre class=\"error\">";
                echo "SQL ERROR: " . mysql_error();
                echo "</pre>";
                desconecta();
                return false;
            }
        }
    }

    function desconecta() {
        return mysql_close($this->db);
    }

}

?>
Agora com a estrutura completa, basta criar a View que mostrará a lista de clientes /pages/listaClientes.php
//  @arquivo = /pages/listaClientes.php
//  @arquivo = /pages/listaClientes.php
//  MVC :  view
//  objeto : Cliente
//  obs : exemplo para o blog

//se o container já não tiver incluido, inclui
require_once($_SERVER['DOCUMENT_ROOT'] . '/app/controller/ClienteController.php');

$clienteC = new ClienteController();
$cache = $clienteC->getListaClientes(); // carrega os registros do array para a view
$total = count($cache);
?>
<table width="85%" border="0" cellspacing="2" cellpadding="0">
    <tr>
        <th>ID</th>
        <th>NOME</th>
        <th>EMAIL</th>
    </tr>
    <? if ($total > 0) { 
        for ($i = 0; $i < $total; $i++) {
            $idCliente = $cache[$i]->getId();
            $clienteNome = $cache[$i]->getNome();
            ?>
            <tr>
                <td><? echo $idCliente; ?></td>
                <td><? echo $clienteNome; ?></td>
                <td><? echo $cache[$i]->getEmail(); ?></td>
            </tr>
            <?
        }
    }
    ?>
    <tr>
        <th colspan="3">Total: <? echo $total; ?></th>
    </tr>
</table>

Resultado : 
Figura 4- Resultado


e para dar carga nessa tabela troquei o seguinte trecho da linha 11: 
$arrClientes=array();
    for ($x=0;$x<=5;$x++){        
        $cliente = new Cliente();
            $cliente->setId($x);
            $cliente->setNome("Cliente ".$x);
            $cliente->setEmail("cliente".$x."@exemploblog");
            $arrClientes[$x] = $cliente;
    }

$cache = $arrClientes;


Simples né ? Espero ter simplificado a implementação MVC em uma aplicação PHP.


Até a próxima...

7 comentários:

Caio disse...

acho q esse desenho do CakePHP exemplifica melhor como que tem que ser a implementação de um modelo 100% MVC.

http://book.cakephp.org/img/basic_mvc.png

Mario Cezzare (mcezzare) disse...

Não estou utilizando um framework, mas grato pela contribuição

Mario Cezzare (mcezzare) disse...

e me lembro de ter desenvolvido esse esquema para o TCC da faculdade por causa de problemas na implementação do cake em relação ao cache, que as páginas não atualizavam, mesmo removendo os arquivos do servidor, após testar em mais de 2 ambientes. mas lembrado do cake...
Também tem o Zend, entre outros uma boa fonte é o site http://www.phpframeworks.com/

thiago10gr disse...
Este comentário foi removido pelo autor.
Unknown disse...

Parceiro estou gostado muito e aprendendo bastante com seus Tutoriais sobre MVC e seus 'recursos'..
Poderia passar um exemplo de como usar essa função que apresentou:

function __set($param, $value){
$this->$param = $value;
}

function __get($var) {
return $this->$var;
}

Mario Cezzare (mcezzare) disse...

assim
$cliente = new Cliente();
// ....carga
$cpf = $cliente->__get("cpf") ;

ou
$var = "777987944321"
$cliente->__set("cpf" , $var) ;

[]'s

Inside rox'X disse...

Copiei a classe ClienteController, mas tá dando erro, acredito que falta alguns parametros...

Vou voltar aos estudos para tentar encontrar o que poderia ser.