Jump to content
Fórum Script Brasil
  • 0

Sofrendo com estrutura MVC... Ajudem, por favor


Ewerton M.

Question

Fala galera...

Gostaria da ajuda de vocês mais uma vez...

Através do curso de PHP que fiz aprendi um modelo de loja virtual totalmente estruturado, apesar de ser legalzinho quero usar a estrutura MVC e refazer essa loja...

Pois bem, quando eu trabalho com ORM como meio de conexão, funciona, porém, aqui na empresa não querem ORM, infelizmente, querem PDO com Prepared Statement. (Eu sei, eu sei... Também não entendi o motivo, mas infelizmente tenho que acatar...). RSRSRS

Vamos lá, a estrutura que eu uso de pastas:

lojavirtual/
    app/
        admin/
            modules/
                 Clientes.php
            AdminController.php
            AdminView.php
    config/
         xml/
         ini/
             config.ini
    lib/
        Main.class.php
        StaffLoja.class.php
    views/
        admin/
            clientes/
                novoCliente.tpl.php
                lerCliente.tpl.php
                alterarCliente.tpl.php
                deletarCliente.tpl.php
            plugin/
                css/
                js/
                img/
    inde.php
    admin.php
    bootstrap.php
Vamos aos principais arquivos... Que com o Doctrine funcionava perfeitamente, mas tive que readaptar para o PDO com Prepared Statement... bootstrap.php
<?php
/*
 * Com o adminAppLoad, eu chamo os meus arquivos de VIEW e CONTROLLER.
 * Esses arquivos serao responsaveis por direcionar os meus arquivos.
 */
function adminAppLoad($classe){
    $dir = dirname(__FILE__);
    $arquivo = "$dir/app/admin/$classe.php"; 
    
    if(file_exists($arquivo)){
        require_once($arquivo);
        return true;
    }
}
/*
 * Com adminModLoad eu chamo as minhas regras de negocio, especifica para
 * cada um dos Models. 
 */ 
function adminModLoad($classe){
    $dir = dirname(__FILE__);
    $arquivo = "$dir/app/admin/modules/$classe.php";
    
    if(file_exists($arquivo)){
        require_once($arquivo);
        return true;
    }
}


/*
 * Nesse metodo eu chamo as minhas classes dentro de /lib/
 * A partir do classload é possivel carregar a classe de Banco.
 * A mesma que carregara toda a minha aplicacao.
 */
function libLoad($classe){
    $dir = dirname(__FILE__);
    $arquivo = "$dir/lib/$classe.class.php";
    
    if(file_exists($arquivo)){
        require_once($arquivo);
        return true;
    }
}


//Carrego o meu metodo adminAppLoad.
spl_autoload_register('adminAppLoad');
//Carrego o emu metodo adminModLoad.
spl_autoload_register('adminModLoad');
//Carrego o meu metodo libLoad.
spl_autoload_register('libLoad');

/*
 *Aqui eu carrego a minha classe de conexao ao DB,
 *Aqui eu pego os valores da Array e coloca no DSN.
 */

$config = parse_ini_file('config/ini/config.ini');
$dsn = "{$config['driver']}:host={$config['host']};dbname={$config['banco']}";
$conn = new PDO($dsn,$config['usuario'],$config['senha']);
Main.class.php
<?php
/**
 * Desenvolvimento - Loja Virtual
 * Data: 13/10/2011
 * @author Ewerton Melo de Souza
 * Descrição: Possui os métodos responsáveis pelas
 * operações padrões de CRUD.
 * Esse CRUD será requerido por todo o sistema, possuindo uma estrutura padrão.
 */

    class Main{
        
        private $conn;
        
        function __construct(){}

        //Metodo generico para gravar informacoes no DB
        function novo($tabela,$dados){
            //Executo um foreach para separar as colunas de valores...
            foreach ($dados as $coluna=>$valor){
                //Passa as colunas para um Array...
                $colunas[] = "`$coluna`";
                //Passa os valores para um array...
                $valores[] = $valor;
                /**
                *===============================HOLDERS=============================
                *$holders[] = "?"
                *Como usamos o Prepared Statement e estamos inserindo os valores
                *dinamicamente, precisamos colocar dentro do VALUE as `interrogacoes`
                *correspondetes a cada campo. Desta forma, criamos um Array contendo
                *o valor de `?`
                *===================================================================
                */
                $holders[] = "?";
            }
            
            /**
            *Faco a implusao dos meus dados, pegando o meu Array e convertendo em 
            *Strings, separando por virgulas.
            */
            $colunas = implode(', ',$colunas);
            $holders = implode(', ',$holders);
            
            //Aqui eu chamo o $holders[], em VALUES da minha Query
            $sql = "INSERT INTO $tabela ($colunas) VALUES ($holders)";
            
            //Preparo meu SQL para ser executado atraves da variavel $sql
            $query = $this->conn->prepare($sql);
            /**
            *Aqui em execute(), chamamos a nossa Array que realmente possui algum valor.
            *Desta forma, toda vez que a minha Array $valores for executada, ele ira 
            *inserir uma valor em cada '?' da $holders[] dentro de VALUES da minha Query.
            */
            $query->execute($valores);
            
        }

        //Metodo generico para ler informacoes no DB
        function ler($tabela,$colunas,$cond=null){
            
            /**
            *Aqui crio a Query que sera chamada. Nela usamos valores dinamicos para
            *serem inseridos em minha variavel $sql.
            */
            $sql = "SELECT $colunas FROM $tabela";
                
                //SE $cond não estiver vazia...
                if(!empty($cond)){
                
                    /**
                    *Concatena em $sql WHERE $cond. Ficaria da seguinte
                    *forma, o campo $sql concatenado
                    * SELECT $colunas FROM $tabela WHERE $cond
                    */
                    
                    $sql .= " WHERE id = $cond";
                }
            
            //Preparo meu SQL para ser executado atraves da variavel $sql
            $query = $this->conn->prepare($sql);
            //Executo meu objeto que esta com a query SQL preparada...
            $query->execute();
            /**
            *Com o metodo fetchAll(), eu listo todos os meus valores da Array.
            */
            $result = $query->fetchAll();

            //Por se tratar de uma consulta, preciso retornar o meu objeto...
            return $result;
        }

        //Metodo generico para alterar informacoes no DB
        function alterar($tabela,$dados,$id){
            /**
            *Aqui crio a Query que sera chamada. Nela usamos valores dinamicos para
            *serem inseridos em minha variavel $sql.
            */
            foreach($dados as $coluna => $valor) {
                $colunas[] = "`$coluna` = ?";
                $valores[] = $valor;
            }
            
            $valores[] = $id;
            
            $colunas = implode(', ', $colunas);
            
            /**
            *Com a '?' na minha condicao id eu passarei os valores atraves de um 
            *Prepared Statement
            */
            $sql = "UPDATE $tabela SET $colunas WHERE id = ?";

            //Preparo meu SQL para ser executado atraves da variavel $sql
            $query = $this->conn->prepare($sql);
            $query->execute($valores);
        }

        //Metodo generico para deletar informacoes no DB
        function deletar($tabela,$id){
            //Preparo meu SQL para ser executado atraves da variavel $sql
            //O '?' sera chamado atraves de um Prepared Statement
            $sql = "DELETE FROM $tabela WHERE id = ?";
            
            //Preparo meu SQL para ser executado atraves da variavel $sql
            $query = $this->conn->prepare($sql);
            //Executo a minha Query passando o meu valor de $id.
            $query->execute(array($id));
        }
    }
Clientes.php
?php
    class Clientes{
        private $db;
        private $staff;
        
        function __cnstruct(){
            $this->db = new Main();
            $this->staff = new StaffLoja();
        }
        
        
        //Método para incluir um novo cliente na base.
        function novoCliente(){
            try{
                if($_POST){
                    $dados['nome'] = $_POST['nome'];
                    $dados['doc'] = $_POST['doc'];
                    $dados['nascimento'] = $_POST['nascimento'];
                    $dados['endereco'] = $_POST['endereco'];
                    $dados['numero'] = $_POST['numero'];
                    $dados['compl'] = $_POST['compl'];
                    $dados['bairro'] = $_POST['bairro'];
                    $dados['cidade'] = $_POST['cidade'];
                    $dados['cep'] = $_POST['cep'];
                    $dados['uf'] = $_POST['uf'];
                    $dados['ddd1'] = $_POST['ddd1'];
                    $dados['fone1'] = $_POST['fone1'];
                    $dados['ddd2'] = $_POST['ddd2'];
                    $dados['fone2'] = $_POST['fone2'];
                    $dados['ddd3'] = $_POST['ddd3'];
                    $dados['fone3'] = $_POST['fone3'];
                    $dados['email'] = $_POST['email'];                    
                    $dados['username'] = $_POST['username'];
                    
                    $pass = $_POST['password'];
                    $confirmpass = $_POST['confirmpassword'];
                    /*
                    //Retorno do método que faz a verificação e criptografa a senha.
                    $pass = $this->staff->authPassword($pass,$confirmpass);
                    */
                    $dados['password'] = $_POST['password'];
                    $dados['ativo'] = 1;
                    $dados['cad_user'] = 1;
                    
                    if($dados){
                        $this->db->novo('cliente', $dados);
                    }
                }
            }catch(Exception $e){
                echo $e->getMessage() . "<br><br>";
                echo $e->getTrace() . "<br><br>";
            }
        }
        
        function lerCliente(){
            $result = $this->db->ler('cliente','*');
            return $result;
        }
        
        function alterarCliente($id){
            if($_POST){
                $this->db->alterar('cliente', $_POST, $id);
                echo "<meta http-equiv='refresh' content='0; url=index.php?module=noticias&action=readNoticias'>";
            }
            return $this->db->see('cliente',$id);
        }
        
        function deletarCliente($id){
            $this->db->deletar('cliente',$id);    
        }
    }
novoCliente.tpl.php
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link rel="StyleSheet" href="views/plugin/css/estilos.css" type="text/css" media="all" />
<title>Cardios | Admin - Início</title>
</head>
<body>

    <div id="mainMenu">
        <div>
            <ul id="menu">
                <li><a href="admin.php">Início</a></li>
                <li><a href="admin.php?module=usuarios&action=lerUsuario">Adm. de Usuários</a></li>
                <li><a href="admin.php?module=clientes&action=lerCliente">Adm. de Clientes</a></li>
                <li><a href="admin.php?module=produtos&action=lerProduto">Adm. de Produtos</a></li>
                <li><a href="admin.php?module=relatorios&action=lerRelatorios">Adm. de Relatórios</a></li>
                <li><a href="admin.php?module=logs&action=lerLogs">Adm. de Logs</a></li>
                <li><a href="admin.php?module=ajuda&action=lerAjuda">Ajuda</a></li>
            </ul>
        </div>
    </div>
    
    <div id="menuEsquerda">
        <li id="itemMenuEsquerdo"><a href="admin.php?module=contas&action=lerMinhaConta" style="text-decoration:none; color:#000000;">Minha conta</a>
        <li id="itemMenuEsquerdo"><a href="admin.php?module=logs&action=lerMeusLogs" style="text-decoration:none; color:#000000;">Meus Logs</a>
        <li id="itemMenuEsquerdo"><a href="admin.php?module=builds&action=moduloConstrucao" style="text-decoration:none; color:#000000;">Adm. de Conteúdo</a>
        <li id="itemMenuEsquerdo"><a href="admin.php?module=login&action=logoff" style="text-decoration:none; color:#000000;">Sair</a>
    </div>
    
    <div id="divCentral">
        <form action="" method="post">
        <table border="0">
            <tr>
                <td width="450" colspan="4" bgcolor="#dddcdc" align="center"><font face="verdana" size="2.0em"><b>Cadastro de Cliente</b></font></td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Nome Completo</b></font></td>
                <td colspan="2">
                    <input type="text" name="nome" size="50" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>CPF/CNPJ</b></font></td>
                <td colspan="2">
                    <input type="text" name="doc" size=30" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Data de Nascimento</b></font></td>
                <td colspan="2">
                    <input type="text" name="nascimento" size=20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Endereço</b></font></td>
                <td colspan="2">
                    <input type="text" name="endereco" size="50" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Número</b></font></td>
                <td colspan="2">
                    <input type="text" name="numero" size="10" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Complemento</b></font></td>
                <td olspan="2" >
                    <input type="text" name="compl" size="50" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Bairro</b></font></td>
                <td colspan="2">
                    <input type="text" name="bairro" size="50" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Cidade</b></font></td>
                <td colspan="2">
                    <input type="text" name="cidade" size="50" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>CEP</b></font></td>
                <td colspan="2">
                    <input type="text" name="cep" size="20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>UF</b></font></td>
                <td colspan="2">
                    <select name="uf">
                        <option value="AC"></option>
                        <option value="AC">AC</option>
                        <option value="AL">AL</option>
                        <option value="AP">AP</option>
                        <option value="AM">AM</option>
                        <option value="BA">BA</option>
                        <option value="CE">CE</option>
                        <option value="DF">DF</option>
                        <option value="ES">ES</option>
                        <option value="GO">GO</option>
                        <option value="MA">MA</option>
                        <option value="MT">MT</option>
                        <option value="MS">MS</option>
                        <option value="MG">MG</option>
                        <option value="PA">PA</option>
                        <option value="PB">PB</option>
                        <option value="PR">PR</option>
                        <option value="PE">PE</option>
                        <option value="PI">PI</option>
                        <option value="RJ">RJ</option>
                        <option value="RN">RN</option>
                        <option value="RS">RS</option>
                        <option value="RO">RO</option>
                        <option value="RR">RR</option>
                        <option value="SC">SC</option>
                        <option value="SP">SP</option>
                        <option value="SE">SE</option>
                        <option value="TO">TO</option>
                    </select>
                </td>
            </tr>
            
            <tr>
                <td colspan="1" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Telefone Residencial</b></font></td>
                <td>
                    <input type="text" name="ddd1" size="10" maxlenght="5" />
                </td>
                <td>
                    <input type="text" name="fone1" size="20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="1" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Telefone Celular</b></font></td>
                <td>
                    <input type="text" name="ddd2" size="10" maxlenght="5" />
                </td>
                <td>
                    <input type="text" name="fone2" size="20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="1" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Telefone Comercial</b></font></td>
                <td>
                    <input type="text" name="ddd3" size="10" maxlenght="5" />
                </td>
                <td>
                    <input type="text" name="fone3" size="20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>E-Mail</b></font></td>
                <td colspan="2">
                    <input type="text" name="email" size="50" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Usuário</b></font></td>
                <td colspan="2">
                    <input type="text" name="username" size="20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Senha</b></font></td>
                <td colspan="2">
                    <input type="password" name="password" size="20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Confirmar Senha</b></font></td>
                <td colspan="2">
                    <input type="password" name="confirmpassword" size="20" maxlenght="5" />
                </td>
            </tr>
            
            <tr>
                <td colspan="2" width="150" bgcolor="#dddcdc"><font face="verdana" size="1.8em"><b>Conta Ativa</b></font></td>
                <td colspan="2">
                    <select name="ativo">
                        <option value="1">Sim</option>
                        <option value="2">Não</option>
                    </select>
                </td>
            </tr>
            
            <tr>
                <td colspan="4" width="150" align="center"> </td>
            </tr>
            
            <tr>
                <td colspan="4" width="150" align="center">
                    <input type="submit" value="Cadastrar Cliente" />   <input type="reset" value="Limpar dados" />
                </td>
            </tr>
            
            <input type="hidden" value="1" name="cad_user" />
        </table>
        </form>
    </div>

</body>
</html>
chamo as páginas da seguinte forma:
admin.php?module=clientes&action=lerCliente
admin.php?module=clientes&action=novoCliente
Conclusão, quando vou cadastrar um novo cliente, dá o seguinte erro:
Fatal error: Call to a member function novo() on a non-object in C:\xampp\htdocs\site\lojavirtual\app\admin\modules\Clientes.php on line 46

Sabem me dizer porque???

As páginas se encontram, porém, ele está requerendo alguma coisa, em algum lugar que eu não estou entendendo...

Edited by Ewerton M.
Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Caro Ewerton,

Concordo com o Willian Gustavo, já que você referenciou o erro em:

Fatal error: Call to a member function novo() on a non-object in C:\xampp\htdocs\site\lojavirtual\app\admin\modules\Clientes.php on line 46

Então você deve saber que é algo na página Clientes.php, não é necessário postar todo código.

Vamos lá, você deve estar chamando uma FUNCTION chamada novo(), porém ela não está instanciada(incluida) na página que você está chamando. Poste como você está chamando essa função.

Abs.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...