Slides de aula do curso de PHP com MySQLDescrição completa
Full description
Descrição completa
Dimensionamento de uma ponte com duas longarinasDescrição completa
Full description
jsp
Ensayo MVC
Descrição completa
Descrição completa
Descrição completa
Descrição completa
Descrição completa
Full description
Exemplo de MVC com PHP MVC,, Padrões de Projeto MVC por Tarcísio por Tarcísio
Nesse artigo irei demonstrar demonstrar na prática, prática, a aplicação do padrão de projeto projeto MVC com PHP. Para isso, construirei um aplicativo de Agenda de Contatos Telefônicos conforme requisitos funcionais, diagramas e código que serão mostrados ao longo desse texto. Mas, antes de começar, aconselho a vocês que leiam o artigo de introdução a MVC, o mesmo poderá ser visualizado acessando acessando o link Entendendo o MVC (ModelView-Controller).. View-Controller)
Hierarquia de Diretórios Conforme a Imagem 1, irei seguir um padrão de hierarquia de diretórios e arquivos, vou explicar sobre as responsabilidades dos diretórios e arquivos logo abaixo.
Imagem 1 – Hierarquia de Diretórios e Pastas Diretório “controllers”
Conforme se pode deduzir pelo nome, irei usá-lo para guardar as classes da camada de controle do sistema, as famosas classes controladoras ou controllers, responsáveis por fazer o intermédio entre a camada de dados ( models ou modelos) e visualização ( views), conforme o artigo de introdução a MVC citado acima. Diretório “databases”
Por se tratar de um projeto apenas de exemplo, irei persistir os dados dos contatos e telefones usando um banco de dados SQLite SQLite,, é nesse diretório que o arquivo referente ao banco ficará. Caso queria conectar a aplicação com o MySQL, veja como no fim do artigo Diretório “lib”
Nesse diretório, irei guardar as classes classes diretamente ligadas ligadas ao sistema, sistema, como por exemplo, classes de filtros de dados, validações genéricas, helpers (caso haja algum), interfaces e abstrações não ligadas à camada de negócio do sistema. Se estivesse construindo um framework em PHP, guardaria as classes do mesmo nesse diretório. Diretório “models”
Aqui, guardarei as classes de dados diretamente abstraídas e ligadas às regras r egras de negócio do sistema, como por exemplo, as classes Contato e Telefone, entre outras. Diretório “views”
Esse é o diretório onde guardarei os arquivos HTML do sistema, tais arquivos representam a camada de visualização ( view), da qual foi falada no artigo arti go de introdução ao MVC . Arquivo “index.php”
É um arquivo índex como qualquer outro, é nele que a execução do sistema irá começar.
Implementação das Classes das Camadas Classes Primárias ou Genéricas
Depois de todos os diretórios explicados, mostrarei a implementação de algumas classes necessárias para a separação do sistemas em camadas (Modelo – Model, Visão – View , – Controller). A primeira delas que mostrarei, é a de controlador genérico, Controlador – não diretamente ligado às regras de negócio do sistema si stema de Agenda Telefônica. Veja o exemplo abaixo. 1 2 3 4
5 * @package Exemplo simples com MVC @author DigitalDev 6 ** @version 0.1.1 7 * 8 * Camada - Controladores Controladores ou Controllers 9 * Diretório Pai - controllers 10* Arquivo - IndexController.php */ 11class IndexController 12{ 13 /** * Ação que deverá ser executada quando 14 * nenhuma outra for especificada, do mesmo jeito que o 15 * arquivo index.html ou index.php é executado quando nenhum 16 * é referenciado 17 */ public function indexAction() 18 { 19 //redirecionando para a pagina de lista de contatos 20 header('Location: ?controle=Contato&acao=listarContato'); 21 } 22} 23?> 24 25 26 27 28 Conforme vocês devem ter visto acima, usei o sufixo Controller no nome da classe e Action no nome do método. Esse é o padrão de nomenclatura que irei utilizar em todas as outras classes da camada Controle e seus métodos. Além disso, nomearei os arquivos que irão conter as classes com o mesmo nome da própria classe. A segunda classe que implementarei será a Application. A responsabilidade da mesma será a de verificar qual classe da camada de controle ( Controller ) e qual método da Action) o usuário deseja executar. Dê uma olhada no código abaixo, espero que classe ( Action ele seja simples o suficiente para esclarecer seu modo de funcionamento. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* Verifica qual classe controlador (Controller) o usuário deseja chamar * e qual método dessa classe (Action) deseja executar * Caso o controlador (controller) não seja especificado, o IndexControllers será o padrão * Caso o método (Action) não seja especificado, o indexAction será o padrão * * @package Exemplo simples com MVC * @author DigitalDev * @version 0.1.1 **/ class Application { /** * Usada pra guardar o nome da classe * de controle (Controller) a ser executada * @var string */ protected $st_controller; /** * Usada para guardar o nome do metodo da * classe de controle (Controller) que deverá ser executado * @var string */ protected $st_action; /** * Verifica se os parâmetros de controlador (Controller) (Controller) e ação (Action) foram * passados via parâmetros "Post" ou "Get" e os carrega tais dados * nos respectivos atributos da classe */ private function loadRoute() { /* * Se o controller nao for passado por GET, * assume-se como padrão o controller 'IndexController'; */ $this->st_controller = isset($_REQUEST['controle']) ? $_REQUEST['controle'] $_REQUEST['co ntrole'] : 'Index';
?
/* * Se a action nao for passada por GET, * assume-se como padrão a action 'IndexAction'; 'IndexAction'; */ $this->st_action = isset($_REQUEST['acao']) $_REQUEST['acao'] $_REQUEST['ac ao'] : 'index'; }
/** * * Instancia classe referente ao Controlador (Controller) e executa * método referente e acao (Action) * @throws Exception */ public function dispatch()
{ 66 $this->loadRoute(); 67 68 //verificando se o arquivo de controle existe 69 $st_controller_file = 'controllers/'.$this70 >st_controller.'Controller.php'; if(file_exists($st_controller_file)) 71 require_once $st_controller_file; 72 else 73 throw new Exception('Arquivo '.$st_controller_file.' nao 74 encontrado'); 75 76 //verificando se a classe existe $st_class = $this->st_controller.'Controller'; 77 if(class_exists($st_class)) 78 $o_class = new $st_class; 79 else 80 throw new Exception("Classe '$st_class' nao existe no 81 arquivo '$st_controller_file'"); 82 //verificando se o metodo existe 83 $st_method = $this->st_action.'Action'; 84 if(method_exists($o_class,$st_method)) 85 $o_class->$st_method(); 86 else throw new Exception("Metodo '$st_method' nao existe na 87 classe $st_class'"); 88 } 89 90 /** 91 * Redireciona a chamada http para outra página 92 * @param string $st_uri */ 93 static function redirect( $st_uri ) 94 { 95 header("Location: $st_uri"); 96 } 97 } 98 ?> 99 100 101 102 103 104 105
Apesar da classe acima não ter semelhança alguma com a classe IndexController que escrevi, ela também faz parte da camada de controle ( Controller ), mas está num nível mais acima. O fato dela ser responsável por verificar qual controlador ( Controller ) e qual método ( Action) irá executar, faz da mesma o coração do sistema. A terceira classe que irei implementar será responsável por cuidar da camada de visualização. Apesar de código um pouco extenso, ela é uma classe sem muitas funcionalidade, mas poderá ser enriquecida de acordo com nossas necessidades futuras.
setView($st_view); $this->v_params = $v_params; } /** * Define qual arquivo html deve ser renderizado * @param string $st_view * @throws Exception */ public function setView($st_view) { if(file_exists($st_view)) $this->st_view = $st_view; else throw new Exception("View File '$st_view' don't
51 exists"); } 52 53 /** 54 * Retorna o nome do arquivo que deve ser renderizado 55 * @return string */ 56 public function getView() 57 { 58 return $this->st_view; 59 } 60 61 /** * Define os dados que devem ser repassados à view 62 * @param Array $v_params 63 */ 64 public function setParams(Array $v_params) 65 { 66 $this->v_params = $v_params; } 67 68 /** 69 * Retorna os dados que foram ser repassados ao arquivo de 70 visualização 71 * @return Array */ 72 public function getParams() 73 { 74 return $this->v_params; 75 } 76 77 /** * Retorna uma string contendo todo 78 * o conteudo do arquivo de visualiza√ß√£o 79 * 80 * @return string 81 */ 82 public function getContents() { 83 ob_start(); 84 if(isset($this->st_view)) 85 require_once $this->st_view; 86 $this->st_contents = ob_get_contents(); ob_end_clean(); 87 return $this->st_contents; 88 } 89 90 /** 91 * Imprime o arquivo de visualização 92 */ public function showContents() 93 { 94 echo $this->getContents(); 95 exit; 96 } 97 } 98 ?> 99 100
101 102 103 104 105 106 107 108 109 110 111 112 113 Os dados de algumas classes da camada de modelo deverão persistir no banco de dados, para isso, será necessário a implementação de pequeno bloco de código responsável pela conexão entre o sistema e o SGDB. A alternativa que adotarei será a de implementar uma classe abstrata, que deverá ser herdada pelas classes em que os dados deverão ser armazenados no banco de dados. Veja código da classe abstrata a seguir. 1 o_db = new PDO("sqlite:./databases/db.sq3"); 21 $this->o_db->setAttribute ( PDO::ATTR_ERRMODE , 22PDO::ERRMODE_EXCEPTION ); 23 // Fim de conexão com SQLite 24 25 26 /* //Inicio de conexão com MySQL 27 $st_host = 'ip ou host'; 28 $st_banco = 'bancodedados'; 29 $st_usuario = 'usuario'; 30 $st_senha = 'senha';
$st_dsn = "mysql:host=$st_host;dbname=$st_banco"; $this->o_db = new PDO ( $st_dsn, $st_usuario, $st_senha ); //Fim de conexão com MySQL */
Conforme Vocês já devem ter visto, a classe PersistModelAbstract faz referência ao arquivo db.sq3 dentro do diretório databases, esse arquivo será o responsável por guardar nossos dados. Irei mostrar isso na prática com o continuar desse artigo. Implementarei também, duas outras pequenas classes, a primeira será usada para filtrar os dados passados via POST e GET e a segunda será usada para validar os dados. Irei chamá-las de DataFilter e DataValidator, respectivamente. 1
* @return string 23 */ 24 static function numeric( $st_data ) 25 { 26 $st_data = preg_replace("([[:punct:]]|[[:alpha:]]| 27)",'',$st_data); return $st_data; 28 } 29 30 31 /** 32 * 33 * Retira tags HTML / XML e adiciona "\" antes * de aspas simples e aspas duplas 34 * @param string $st_string 35 */ 36 static function cleanString( $st_string ) 37 { 38 return addslashes(strip_tags($st_string)); } 39 } 40 ?> 41 42 43 44 45 46 47 48
* Verifica se o dado passado e um numero * @param mixed $mx_value; * @return boolean */ static function isNumeric( $mx_value ) { $mx_value = str_replace(',', '.', $mx_value); if(!(is_numeric($mx_value))) return false; return true; } /** * Verifica se o dado passado e um numero inteiro * @param mixed $mx_value; * @return boolean */ static function isInteger( $mx_value ) { if(!DataValidator::isNumeric($mx_value)) return false; if(preg_match('/[[:punct:]&^-]/', $mx_value) > 0) return false; return true; }
Por fim, irei implementar o código do arquivo “index.php”, o mesmo será extremamente simples. Veja abaixo. 1
14error_reporting(E_ALL); 15 'lib/Application.php'; 16require_once $o_Application = new Application(); 17$o_Application->dispatch(); 18?> 19 20 21 22 Nesse estágio de desenvolvimento, a hierarquia de diretórios e arquivos deve se dar como a Imagem 2 mostrada abaixo.
Imagem 2 – Hierarquia de Diretórios e Pastas A Camada de Negócios
Agora, com as classes do sistema implementadas, irei finalmente me preocupar com as regras de negócio da Agenda Telefônica. Veja a documentação abaixo. Lista de requisitos
Permitir ao usuário visualizar a lista de contatos na tela principal do sistema. Permitir ao usuário administrar o cadastro de contatos. Permitir ao usuário, selecionar o contato e visualizar os telefones do mesmo. Permitir ao usuário administrar o cadastro de telefones do contato selecionado.
Permitir ao usuário cadastrar “n” telefones para o contato selecionado.
Diagrama de Casos de Uso
Imagem 3 – Diagrama de Casos de Uso Diagrama de Classe
Nesse diagrama, apenas documentarei as classes diretamente ligadas ao sistema de Agenda Telefônica, a diagramação das classes que implementei acima não será abordada.
Imagem 4 – Diagrama de Classes Diagrama de Entidade Relacionamento
Pelo fato da necessidade da persistir os dados de contato e dos telefones, será necessário duas tabelas para guardar os dados das classes. Veja o Diagrama de Entidade Relacionamento (DER) abaixo.
Imagem 5 – Diagrama de Entidade Relacionamento Agora que já tenho a arquitetura da camada de negócio já definida, o proximo passo é implementar as classes responsáveis por gerenciar as mesmas. Isso mesmo, estou me referendo às classes “Contato” e “Telefone”, e como eu já havia falado, os dados das
mesmas devem persistir no banco de dados, por esse motivo, elas devem herdar a classe PersistModelAbstract. 1 2 3 4
* Responsável por gerenciar e persistir os dados dos * Contatos da Agenda Telefônica * * @package Exemplo simples com MVC * @author DigitalDev * @version 0.1.1 * * Camada - Modelo ou Model. * Diretório Pai - models * Arquivo - ContatoModel.php **/ class ContatoModel extends PersistModelAbstract { private $in_id; private $st_nome; private $st_email; function __construct() { parent::__construct(); //executa método de criação da tabela de Telefone $this->createTableContato(); }
/** * Setters e Getters da * classe ContatoModel */ public function setId( $in_id ) { $this->in_id = $in_id; return $this; } public function getId() { return $this->in_id; } public function setNome( $st_nome ) { $this->st_nome = $st_nome; return $this; } public function getNome() { return $this->st_nome; } public function setEmail( $st_email ) { $this->st_email = $st_email; return $this; } public function getEmail()
{ 55 return $this->st_email; 56 } 57 58 /** 59 * Retorna um array contendo os contatos * @param string $st_nome 60 * @return Array 61 */ 62 public function _list( $st_nome = null ) 63 { 64 if(!is_null($st_nome)) $st_query = "SELECT * FROM tbl_contato WHERE con_st_nome 65 LIKE '%$st_nome%';"; 66 else 67 $st_query = 'SELECT * FROM tbl_contato;'; 68 69 $v_contatos = array(); 70 try { 71 $o_data = $this->o_db->query($st_query); 72 while($o_ret = $o_data->fetchObject()) 73 { 74 $o_contato = new ContatoModel(); $o_contato->setId($o_ret->con_in_id); 75 $o_contato->setNome($o_ret->con_st_nome); 76 $o_contato->setEmail($o_ret->con_st_email); 77 array_push($v_contatos, $o_contato); 78 } 79 } catch(PDOException $e) 80 {} 81 return $v_contatos; 82 } 83 84 /** 85 * Retorna os dados de um contato referente * a um determinado Id 86 * @param integer $in_id 87 * @return ContatoModel 88 */ 89 public function loadById( $in_id ) { 90 $v_contatos = array(); 91 92 $in_id;";$st_query = "SELECT * FROM tbl_contato WHERE con_in_id = 93 $o_data = $this->o_db->query($st_query); 94 $o_ret = $o_data->fetchObject(); $this->setId($o_ret->con_in_id); 95 $this->setNome($o_ret->con_st_nome); 96 $this->setEmail($o_ret->con_st_email); 97 return $this; 98 } 99 /** 100 * Salva dados contidos na instancia da classe 101 * na tabela de contato. Se o ID for passado, 102 * um UPDATE será executado, caso contrário, um 103 * INSERT será executado 104 * @throws PDOException
* @return integer 105 */ 106 public function save() 107 { 108 if(is_null($this->in_id)) $st_query = "INSERT INTO tbl_contato 109 ( 110 con_st_nome, 111 con_st_email 112 ) 113 VALUES ( 114 '$this->st_nome', 115 '$this->st_email' 116 );"; 117 else $st_query = "UPDATE 118 tbl_contato 119 SET 120 con_st_nome = '$this->st_nome', 121 con_st_email = '$this->st_email' 122 WHERE con_in_id = $this->in_id"; 123 try 124 { 125 126 if($this->o_db->exec($st_query) > 0) 127 if(is_null($this->in_id)) 128 { /* 129 * verificando se o driver usado é sqlite e 130 pegando o ultimo id inserido 131 * por algum motivo, a função nativa do 132PDO::lastInsertId() não funciona com sqlite */ 133 if($this->o_db134 >getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite') 135 { 136 $o_ret = $this->o_db->query('SELECT 137last_insert_rowid() AS con_in_id')->fetchObject(); return $o_ret->con_in_id; 138 } 139 else 140 return $this->o_db->lastInsertId(); 141 } else 142 return $this->in_id; 143 } 144 catch (PDOException $e) 145 { 146 throw $e; } 147 return false; 148 } 149 150 /** 151 * Deleta os dados persistidos na tabela de 152 * contato usando como referencia, o id da classe. */ 153 public function delete() 154 {
if(!is_null($this->in_id)) 155 { 156 $st_query = "DELETE FROM 157 tbl_contato 158 WHERE con_in_id = $this->in_id"; if($this->o_db->exec($st_query) > 0) 159 return true; 160 } 161 return false; 162 } 163 164 /** * Cria tabela para armazernar os dados de contato, caso 165 * ela ainda não exista. 166 * @throws PDOException 167 */ 168 private function createTableContato() { 169 /* 170 caso do Sqlite, o AUTO_INCREMENT é automático na chave 171primaria *daNotabela 172 * No caso do MySQL, o AUTO_INCREMENT deve ser especificado 173na criação do campo */ 174 if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 175 'sqlite') 176 $st_auto_increment = ''; 177 else 178 $st_auto_increment = 'AUTO_INCREMENT'; 179 $st_query = "CREATE TABLE IF NOT EXISTS tbl_contato 180 ( 181 con_in_id INTEGER NOT NULL 182$st_auto_increment, 183 con_st_nome CHAR(200), con_st_email CHAR(100), 184 PRIMARY KEY(con_in_id) 185 )"; 186 187 //executando a query; 188 try 189 { $this->o_db->exec($st_query); 190 } 191 catch(PDOException $e) 192 { 193 throw $e; 194 } } 195 } 196?> 197 198 199 200 201 202 203 204
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 Agora é a vez da classe TelefoneModel ser implementada. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
* Setters e Getters da * classe TelefoneModel */ public function setId( $in_id ) { $this->in_id = $in_id; return $this; } public function getId() { return $this->in_id; } public function setDDD( $in_ddd ) { $this->in_ddd = $in_ddd; return $this; } public function getDDD() { return $this->in_ddd; } public function setTelefone( $in_telefone ) { $this->in_telefone = $in_telefone; return $this; } public function getTelefone() { return $this->in_telefone; } public function setContatoId( $in_contato_id ) { $this->in_contato_id = $in_contato_id; return $this; } public function getContatoId() { return $this->in_contato_id; }
/** * Retorna um array contendo os telefones * de um determinado contato * @param integer $in_contato_id * @return Array */ public function _list( $in_contato_id ) { $st_query = "SELECT * FROM tbl_telefone WHERE con_in_id = $in_contato_id";
$v_telefones = array(); 76 try 77 { 78 $o_data = $this->o_db->query($st_query); 79 while($o_ret = $o_data->fetchObject()) { 80 $o_telefone = new TelefoneModel(); 81 $o_telefone->setId($o_ret->tel_in_id); 82 $o_telefone->setDDD($o_ret->tel_in_ddd); 83 $o_telefone->setTelefone($o_ret->tel_in_telefone); 84 $o_telefone->setContatoId($o_ret->con_in_id); array_push($v_telefones,$o_telefone); 85 } 86 } 87 catch(PDOException $e) 88 {} return $v_telefones; 89 } 90 91 /** 92 * Retorna os dados de um telefone referente 93 * a um determinado Id 94 * @param integer $in_id * @return TelefoneModel 95 */ 96 public function loadById( $in_id ) 97 { 98 $v_contatos = array(); 99 $st_query = "SELECT * FROM tbl_telefone WHERE tel_in_id = $in_id;"; 100 try 101 { 102 $o_data = $this->o_db->query($st_query); 103 $o_ret = $o_data->fetchObject(); $this->setId($o_ret->tel_in_id); 104 $this->setDDD($o_ret->tel_in_ddd); 105 $this->setTelefone($o_ret->tel_in_telefone); 106 $this->setContatoId($o_ret->con_in_id); 107 return $this; 108 } catch(PDOException $e) 109 {} 110 return false; 111 } 112 113 /** 114 * Salva dados contidos na instancia da classe * na tabela de telefone. Se o ID for passado, 115 * um UPDATE será executado, caso contrário, um 116 * INSERT será executado 117 * @throws PDOException 118 * @return integer */ 119 public function save() 120 { 121 if(is_null($this->in_id)) 122 $st_query = "INSERT INTO tbl_telefone 123 ( con_in_id, 124 tel_in_ddd, 125 tel_in_telefone
) 126 VALUES 127 ( 128 $this->in_contato_id, 129 '$this->in_ddd', '$this->in_telefone' 130 );"; 131 else 132 $st_query = "UPDATE 133 tbl_telefone 134 SET tel_in_ddd = '$this->in_ddd', 135 tel_in_telefone = '$this->in_telefone' 136 WHERE 137 tel_in_id = $this->in_id"; 138 try { 139 140 if($this->o_db->exec($st_query) > 0) 141 if(is_null($this->in_id)) 142 { 143 /* 144 * verificando se o driver usado é sqlite e 145pegando o ultimo id inserido * por algum motivo, a função nativa do 146 PDO::lastInsertId() não funciona com sqlite 147 */ 148 if($this->o_db149>getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite') { 150 $o_ret = $this->o_db->query('SELECT 151 last_insert_rowid() AS tel_in_id')->fetchObject(); 152 return $o_ret->tel_in_id; 153 } else 154 return $this->o_db->lastInsertId(); 155 } 156 else 157 return $this->in_id; 158 } catch (PDOException $e) 159 { 160 throw $e; 161 } 162 return false; } 163 164 /** 165 * Deleta os dados persistidos na tabela de 166 * telefone usando como referencia, o id da classe. 167 */ 168 public function delete() { 169 if(!is_null($this->in_id)) 170 { 171 $st_query = "DELETE FROM 172 tbl_telefone 173 WHERE tel_in_id = $this->in_id"; if($this->o_db->exec($st_query) > 0) 174 return true; 175 }
return false; 176 } 177 178 179 180 /** 181 * Cria tabela para armazernar os dados de telefone, caso 182 * ela ainda não exista. 183 * @throws PDOException */ 184 private function createTableTelefone() 185 { 186 /* 187 * No caso do Sqlite, o AUTO_INCREMENT é automático na chave 188primaria da tabela * No caso do MySQL, o AUTO_INCREMENT deve ser especificado 189 do campo 190na criação */ 191 if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 192'sqlite') $st_auto_increment = ''; 193 else 194 $st_auto_increment = 'AUTO_INCREMENT'; 195 196 197 $st_query = "CREATE TABLE IF NOT EXISTS tbl_telefone 198 ( 199 tel_in_id INTEGER NOT NULL $st_auto_increment, 200 con_in_id INTEGER NOT NULL, 201 tel_in_ddd CHAR(5), 202 tel_in_telefone CHAR(12), 203 PRIMARY KEY(tel_in_id) )"; 204 205 //executando a query; 206 try 207 { 208 $this->o_db->exec($st_query); 209 } catch(PDOException $e) 210 { 211 throw $e; 212 } 213 } 214} 215?> 216 217 218 219 220 221 222 223 224 225
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 Depois das classes da camada de modelo implementadas, o próximo passo é escrever o código das classes de controle referente ao fluxo de gerenciamento das classes acima. Elas também serão duas, ContatoController e TelefoneController. 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1
//Listando os contatos cadastrados $v_contatos = $o_Contato->_list(); //definindo qual o arquivo HTML que será usado para //mostrar a lista de contatos $o_view = new View('views/listarContatos.phtml'); //Passando os dados do contato para a View $o_view->setParams(array('v_contatos' => $v_contatos)); //Imprimindo código HTML $o_view->showContents(); }
/** * Gerencia a requisiçães de criação * e edição dos contatos */ public function manterContatoAction() { $o_contato = new ContatoModel(); //verificando se o id do contato foi passado if( isset($_REQUEST['in_con']) ) //verificando se o id passado é valido if( DataValidator::isNumeric($_REQUEST['in_con']) ) //buscando dados do contato $o_contato->loadById($_REQUEST['in_con']); if(count($_POST) > 0) { $o_contato>setNome(DataFilter::cleanString($_POST['st_nome'])); $o_contato>setEmail(DataFilter::cleanString($_POST['st_email'])); //salvando dados e redirecionando para a lista de contatos if($o_contato->save() > 0) Application::redirect('?controle=Contato&acao=listarC ontato'); } $o_view = new View('views/manterContato.phtml'); $o_view->setParams(array('o_contato' => $o_contato)); $o_view->showContents(); } /** * Gerencia a requisições de exclusão dos contatos */ public function apagarContatoAction() { if( DataValidator::isNumeric($_GET['in_con']) ) { //apagando o contato $o_contato = new ContatoModel(); $o_contato->loadById($_GET['in_con']);
$o_contato->delete(); //Apagando os telefones do contato $o_telefone = new TelefoneModel(); $v_telefone = $o_telefone->_list($_GET['in_con']); foreach($v_telefone AS $o_telefone) $o_telefone->delete(); Application::redirect('?controle=Contato&acao=listarConta }
1 9 2 9 3 9 4 e por sua vez a classe TelefoneController 1 loadById($_REQUEST['in_con']); 1 8 $o_telefone = new TelefoneModel(); 1 $v_telefones = $o_telefone->_list($_GET['in_con']); 9 $o_view = new View('views/listarTelefones.phtml'); 2 $o_view->setParams(array('o_contato' => 0 $o_contato,'v_telefones' => $v_telefones)); $o_view->showContents(); 2 } 1 } 2 2 /** 2 * Gerencia a requisiçães de criação * e edição dos telefones do contato 3 */ 2 public function manterTelefoneAction() 4 { 2 $o_contato = new ContatoModel();
As classes implementadas acima estão fazendo referência à arquivos HTML contidos na camada de visualização, para esse programa funcionar, será preciso implementá-los. Isso é o que irei fazer agora. Arquivo – listarContatos.phtml Diretório Pai – views