Frank K Hosaka Postado Fevereiro 3 Denunciar Share Postado Fevereiro 3 (editado) Baseado no tutorial de Alexandre nesse endereço: PHP::CRUD COM MVC – Alexandre Bezerra Barbosa (wordpress.com) eu fiz algumas modificações, assim: arquivo /Astudy/Controles/Controle.php <?php require_once $_SERVER['DOCUMENT_ROOT']."/Astudy/Modelos/Config.php"; class Controle { public function view($arquivo, $array = null) { if (!is_null($array)) { foreach ($array as $var => $value) {${$var} = $value; } } ob_start(); include VISOES . "$arquivo.php"; ob_flush(); } } arquivo /Astudy/Controles/ControleContato.php <?php class ControleContato extends Controle { private $Conexao; public function __construct(){ $this->Conexao=new Conexao(); $conta=$this->Conexao->select("count(*) as conta from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'contatos'")[0]->conta; if($conta==0){ $this->Conexao->exec('create table contatos ( id int unsigned auto_increment primary key,nome varchar(80) not null, telefone varchar(20) default null,email varchar(80) default null)'); }} public function atualizar(){ $id=$_POST['id']; $nome=$_POST['nome']; $telefone=$_POST['telefone']; $email=$_POST['email']; $this->Conexao->update("contatos set nome='$nome', telefone='$telefone', email='$email' where id=$id"); return $this->listar();} public function criar(){return $this->view('form');} public function editar(){ $id=$_GET['editar']; $contato=$this->Conexao->select("* from contatos where id=$id")[0]; return $this->view('form', ['contato' => $contato]); } public function excluir(){ $id=$_GET['id']; $this->Conexao->delete("contatos where id=$id"); return $this->listar();} public function listar(){ $contatos = $this->Conexao->select("* from contatos"); return $this->view('grade', ['contatos' => $contatos]);} public function salvar(){ $nome=$_POST['nome']; $telefone=$_POST['telefone']; $email=$_POST['email']; $this->Conexao->insert("contatos (nome,telefone,email) values ('$nome','$telefone','$email')"); return $this->listar();} } arquivo /Astudy/Index.php <?php require __DIR__ ."/Modelos/Config.php"; if($_GET){ $comando=explode('_',key($_GET)); $controle=new $comando[0]; $funcao=$comando[1]; if(count($comando)==3){ $_GET[$funcao]=$comando[2];} call_user_func(array($controle,$funcao));} else {require VISOES . "inicio.php";} arquivo /Astudy/Modelos/Conexao.php <?php class Conexao { private static $conexao; public function delete($sql){ return $this->getInstance()->query("delete from $sql");} public function exec($sql){ return $this->getInstance()->query($sql);} public static function getInstance() { if (is_null(self::$conexao)) { self::$conexao = new PDO('mysql:host='.HOST.';dbname='.DBNAME, USER, PASSWORD); self::$conexao->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); self::$conexao->exec('set names utf8');} return self::$conexao;} public function insert($sql){ return $this->getInstance()->query("insert into $sql");} public function select($sql){ $stmt=$this->getInstance()->query("select $sql"); return $stmt->fetchAll(PDO::FETCH_OBJ);} public function update($sql){ return $this->getInstance()->query("update $sql");} } arquivo /Astudy/Modelos/Config.php <?php date_default_timezone_set('America/Sao_Paulo'); define("PROJETO",'Astudy'); defined('CONTROLES') || define('CONTROLES',$_SERVER['DOCUMENT_ROOT'].'/' .PROJETO . '/Controles/'); defined('MODELOS') || define('MODELOS',$_SERVER['DOCUMENT_ROOT'].'/' . PROJETO . '/Modelos/'); defined('VISOES') || define('VISOES',$_SERVER['DOCUMENT_ROOT'].'/' . PROJETO . '/Visoes/'); defined('HOST') || define('HOST',"localhost"); defined('DBNAME') || define('DBNAME',"diario"); defined('USER') || define('USER',"root"); defined("PASSWORD") || define('PASSWORD',''); spl_autoload_register(function($Class){ $includeDir = false; $findDir = ['Controles','Modelos','Visoes']; foreach ($findDir as $DirName) { if (!$includeDir && file_exists(FindClass($DirName, $Class)) && !is_dir(FindClass($DirName, $Class))) { include_once (FindClass($DirName, $Class)); $includeDir = true;}} if (!$includeDir) { die("$Class - Erro interno no servidor ao encontrar dados cruciais de funcionamento!");}}); function FindClass($dir, $class) { return ( $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . PROJETO . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $class . '.php');} arquivo /Astudy/Visoes/basico.html <!DOCTYPE html> <html lang="en"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <style> body {width:1000px;margin:0 auto} </style> arquivo /Astudy/Visoes/form.php <?php include "basico.html"; ?> <div class="container"> <form action="?ControleContato.<?php echo isset($contato->id) ? "atualizar&id={$contato->id}" : "salvar"; ?>" method="post" > <div class="card" style="top:40px"> <div class="card-header"> <span class="card-title">Contatos</span> </div> <div class="card-body"></div> <div class="form-group d-flex justify-content-end"> <label style="width:10%">Nome:</label> <input type="text" class="form-control" name="nome" id="nome" value="<?php echo isset($contato->nome) ? $contato->nome : null; ?>" /> </div> <div class="card-body"></div> <div class="form-group d-flex justify-content-end"> <label style="width:10%">Telefone:</label> <input type="text" class="form-control" name="telefone" id="telefone" value="<?php echo isset($contato->telefone) ? $contato->telefone : null; ?>" /> </div> <div class="card-body"></div> <div class="form-group d-flex justify-content-end"> <label style="width:10%">Email:</label> <input type="text" class="form-control" name="email" id="email" value="<?php echo isset($contato->email) ? $contato->email : null; ?>" /> </div> <div class="card-body"></div> <div class="card-footer"> <input type="hidden" name="id" id="id" value="<?php echo isset($contato->id) ? $contato->id : null; ?>" /> <button class="btn btn-success" type="submit">Salvar</button> <a class="btn btn-danger" href="?ControleContato.listar">Cancelar</a> </div> </div> </form> </div> arquivo /Astudy/Visoes/grade.php <?php include "basico.html"; ?> <h1>Contatos</h1> <hr> <div class="container"> <table class="table table-bordered table-striped" style="top:40px;"> <thead> <tr> <th>Nome</th> <th>Telefone</th> <th>Email</th> <th><a href="?ControleContato.criar" class="btn btn-success btn-sm">Novo</a></th> </tr> </thead> <tbody> <?php if ($contatos) { foreach ($contatos as $contato) { ?> <tr> <td><?php echo $contato->nome; ?></td> <td><?php echo $contato->telefone; ?></td> <td><?php echo $contato->email; ?></td> <td> <a href="?ControleContato.editar.<?php echo $contato->id; ?>" class="btn btn-primary btn-sm">Editar</a> <a href="?ControleContato.excluir&id=<?php echo $contato->id; ?>" class="btn btn-danger btn-sm">Excluir</a> </td> </tr> <?php } } else { ?> <tr> <td colspan="5">Nenhum registro encontrado</td> </tr> <?php } ?> </tbody> </table> </div> arquivo /Astudy/Visoes/inicio.php <?php include "basico.html"; ?> <h1>Contatos</h1><hr> <div class="container"> Bem-vindo ao aplicativo MVC Contatos! <br /><br /> <a href="?ControleContato.listar" class="btn btn-success">Vamos Começar!</a></div> Editado Fevereiro 13 por Frank K Hosaka Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Frank K Hosaka Postado Fevereiro 3 Autor Denunciar Share Postado Fevereiro 3 (editado) Para testar o código acima, você pode usar esse aplicativo em PHP, depois de salvar o código acima (tudo) no arquivo script.txt no diretório raiz do C:/Wamp64/www: arquivo ScriptIn.php <?php if (!is_dir("Astudy")){ mkdir("Astudy"); mkdir("Astudy/Controles"); mkdir("Astudy/Modelos"); mkdir("Astudy/Visoes");} $script=file_get_contents("script.txt"); $ocorrencias=substr_count($script,"arquivo /Astudy/"); $substring = "arquivo /Astudy/"; $posicao = []; $posicao[0]=strpos($script,$substring); for($i=1;$i<=$ocorrencias-1;$i++){ $posicao[$i]=strpos($script,$substring,$posicao[$i-1]+1);} $codigo=[]; for($i=0;$i<=$ocorrencias-2;$i++){ $codigo[]=substr($script,$posicao[$i],$posicao[$i+1]-$posicao[$i]);} $codigo[]=substr($script,$posicao[$ocorrencias-1],strlen($script)-$posicao[$ocorrencias-1]); for($i=0;$i<=$ocorrencias-1;$i++){ $lines=explode("\n",$codigo[$i]); $arquivo=trim(substr($lines[0],9)); $criar=fopen($arquivo,"w"); $tamanhoNome=strlen($arquivo)+9; $conteudo=trim(substr($codigo[$i],$tamanhoNome)); file_put_contents($arquivo,$conteudo); fclose($criar);} echo "Trabalho encerrado"; Editado Fevereiro 13 por Frank K Hosaka Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Frank K Hosaka Postado Fevereiro 10 Autor Denunciar Share Postado Fevereiro 10 (editado) O código que eu publiquei é simplista, ele não usa o objeto Request e nem o objeto Contato que aparecem no tutorial original, isso porque reduzi todo o PDO para o método query, e deixei de lado o conceito de objeto estático, não sei quando vou usar esse tipo de objeto ou quando vou usar outros métodos do PDO. O que eu mais gostei do tutorial foi do roteador, ele é o mais simples que eu encontrei na internet, ele usa duas chaves para identificar o destino do código, o controle e o seu método. Na minha versão, eu tirei as chaves. Outra coisa bacana é autoload, o do tutorial só serve para quem colocar todos os arquivos no diretório raiz. Eu distribui os arquivos em pastas diferentes, logo o autoload tem que ser mais robusto, e tive a sorte de encontrar na internet. O problema é que a vida do autoload é bem curta. O melhor lugar para colocar o autoload é no controle principal, pois todas as outras classes vão invocá-lo, através do comando extends na hora de definir a classe. E sem dúvida o controle também é o mehor lugar para manter conectado todo o projeto à sessão. O tutorial não usa a sessão, mas eu usei no meu projeto. A sessão é importante para mim, essa foi a única forma que eu encontrei para voltar ao ponto de partida. Editado Fevereiro 13 por Frank K Hosaka Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Frank K Hosaka
Baseado no tutorial de Alexandre nesse endereço: PHP::CRUD COM MVC – Alexandre Bezerra Barbosa (wordpress.com) eu fiz algumas modificações, assim:
Link para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.