Jefferson NF 0 Denunciar post Postado Julho 26, 2011 Entendi, mas é que fica estranho. Aparece a tela de login, toda certinha, com css e tudo mais, mas se ele enviar um login e/ou senha inexistente, fica uma tela branca com apenas uma frase, por isso queria aproveitar a tela de login. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Julho 26, 2011 Você pode fazer a validação com javascript, ou direto no teu form antes de enviar a requisição pro banco. Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 26, 2011 Isso que eu queria saber, nesse meu login.php, eu posso ter codigo php apenas para verificar se o usuario digitou todos os campos, só pra isso? Outra duvida, com relação ao login.php, se eu coloco um codigo assim: <?php require_once(INCLUDE_MENU_LATERAL_ADMIN); ?> , apenas para não ficar repetindo em todos os meus arquivos o codigo referente ao menu, está errado? Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 26, 2011 - Eu posso ter codigo php, na tela de login, apenas para verificar se o usuario digitou todos os campos? - Posso utilizar o php dessa maneira: <?php require_once(INCLUDE_MENU_LATERAL_ADMIN); ?> Apenas para não ficar repetindo em todas as minhas paginas o codigo referente ao menu, está errado? - Posso fazer isso na minha view.php echo "<table border='1' id='table_index'> <tr> <td width='5' style='border-right: hidden;'></td> <td style='border-right: hidden;'><label for='Nome'><b>Nome</b></label></td> <td style='border-right: hidden;'><label for='Login'><b>Login</b></label></td> <td style='border-right: hidden;'><label for='Email'><b>E-mail</b></label></td> <td style='border-right: hidden;'><label for='Ultimo Acesso'><b>Último Acesso</b></label></td> <td></td> </tr> </table>"; $listaDeAdministradores = $administradorDAO->listaAdministradores; for($i = 0; $i < count($listaDeAdministradores); $i++){ echo $listaDeAdministradores[$i]->getNome()."<br />"; } Compartilhar este post Link para o post Compartilhar em outros sites
criatividade zero 17 Denunciar post Postado Julho 27, 2011 View: class AdministradorView { public function getResposta($resposta){ if($resposta){ echo 'Login efetuado com sucesso!'; } else{ echo 'Erro ao efetuar o login. Dados incorretos!'; } } } isso aqui esta bem errado, e por sinal, foi uma duvida minha identica quando comecei a estudar MVC vou dar um passo mais adiante do seu problema, mas você vai sacar temos um controller para um artigo, que retorna o campo texto e o campo total_comments total_comments é uma coluna com o total de comentarios que o artigo recebeu 1) seu controller vai fazer: if total_comments > 0 (para listar todos os comentarios) 2) sua view teria que ter o mesmo if para listar os comentários if total_comments > 0 (loop para os comentarios) isso é redundante, pior seria em uma tela com varios ifs que seriam duplicados ficou claro de entender o erro? é o controller quem faz a verificação, e nao a view controller: if($resposta){ echo 'Login efetuado com sucesso!'; } else{ echo 'Erro ao efetuar o login. Dados incorretos!'; 1 session 2ª tentativa... 2 session 3ª tentativa... 3 conta suspensa por 15 minutos } perceba que o controller identifica o que aconteceu, e pode fazer o que preciso for ex: mostrar um captcha apos algumas tentativas mas da forma que você fez, na view, isso seria mais errado ainda Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Julho 27, 2011 post #65 exato! Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2011 é o controller quem faz a verificação, e nao a view Perfeito. :joia: perceba que o controller identifica o que aconteceu, e pode fazer o que preciso for ex: mostrar um captcha apos algumas tentativas mas da forma que você fez, na view, isso seria mais errado ainda Só quero deixar claro alguns pontos que as pessoas confundem. :seta: Regras de negócio e controle de fluxo são coisas distintas. :seta: Não existe nenhum problema em ter PHP na marcação da View, PHP nasceu para ser "embutido" na marcação. Na imagem acima, vemos as direções das interações entre os participantes: 1. Model conversa indiretamente com a View. 2. View conversa diretamente com a Model e indiretamente com o Controller 3. Controller conversa com a Model e com a View. Talvez o grande ponto que confunde as pessoas são as interações indiretas, então vou tentar deixar de forma muito explícita como essas interações ocorrem: Na imagem acima vemos algumas coisas ocorrendo: 1. Usuário pode fazer algumas coisas. 2. Moderador pode fazer as mesmas coisas que o usuário e ainda outras coisas específicas. Quando um usuário quer fazer alguma coisa, ele manda uma mensagem através da View (ex: Clicar no botão Novo tópico) Independentemente de qual mensagem o usuário resolveu tomar, é responsabilidade do Controller interceptá-la e manipulá-la. O grande ponto está em entender o que é, de fato, regra de negócio, veja o diagrama abaixo sobre a criação de um novo tópico: Como pode ver, cada camada possui uma responsabilidade muito específica, fica claro o que cada parte precisa fazer. O grande ponto são as interações com dados, imagine que tenhamos que exibir uma lista de tópicos. Para montar a marcação dessa lista: 1. Controller aciona a Model de tópicos para recuperar a lista com todos os tópicos de uma determinada área. 2. Controller aciona a View de tópicos e repassa essa lista para a View. 3. A View itera sobre a lista e monta a marcação: <?php //Dentro do controlador $model = new ModelTopics(); $view = new ViewTopics( $model ); $view->showTopics(); //o controlador que fala para a view exibir os tópicos Quando a ViewTopics receber a instrução para exibir os tópicos, ela irá iterar sobre a listagem: <?php echo '<ul>'; foreach ( $model->getTopics() as $topic ) { echo '<li>' , $topic->getTitle() , '</li>'; } echo '</ul>'; Perceba que não verificamos se algum tópico está invisível, se o usuário possui permissão para visualizar algum tópico nem nada, essa verificação é responsabilidade exclusiva da Model :seta: Isso é regra de negócio. Quando a View chamar getTopics() ela já está confiando que a Model irá fazer o trabalho dela, ou seja, se algum tópico não puder ser exibido ao usuário, ele nem deverá ser enviado para a View. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 27, 2011 Pessoal, valeu mesmo pela ajuda de vocês, nem sei com agradecer. Vou consertar algumas coisas no meu código, baseado nas dicas de vocês. Vou descrever uma ação passo a passo, só para vocês me confirmarem se eu realmente entendi, por favor. Exemplo login: O usuario digita a URL do sistema ou clica em algum lugar, aparece o arquivo index.php, que na verdade é o formulário de login Quando o usuário clicar em LOGAR, o action do form envia para o controller a ação e os dados informados no index.php. Esse controller cria um model e passa os dados para que esta verifique no BD se o usuario existe. O model retorna para o controller o resultado de sua validação (true ou false, por exempplo), o controller então, baseado na resposta da model, envia a view de erro ou de ok para o usuário. É isso? Nesse exemplo, eu posso no controller redirecionar o usuario para uma nova pagina (um .php) caso esteja tudo certo? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2011 É isso? Jefferson, veja o diagrama que postei. Tente visualizar sua sequencia nesse diagrama, se der certo, então é isso. Já estamos no post #69 do tópico e estou vendo que o tópico está andando em círculos. Vamos tentar ser mais objetivos nas perguntas e ler melhor as dicas dadas, isso otimizará a ajuda e evitará redundâncias. Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 27, 2011 Melhorei um pouco meus codigos, acho que agora ficou legal Controller: case "validarLogin":{ $administradorModel = new AdministradorModel(); $administradorModel->validarLogin($_REQUEST["login"], $_REQUEST["senha"]); $administradorView = new AdministradorView(); if($administradorModel->getRespostaValidacaoLogin()){ $administradorView->exibirRespostaValidacaoLoginPositiva(); } else{ } } Model: public function validarLogin($login, $senha){ $bancoDeDados = new BancoDeDados(); $bancoDeDados->conectar(); try { $sql = "SELECT * FROM administrador WHERE login = '".$login."' AND senha = '".md5($senha)."'"; $retorno = $bancoDeDados->executarQuery($sql); if (mysql_num_rows($retorno) > 0){ /*$administrador = new Administrador(); $administrador->setNome("Jefferson_jj"); $administrador->setLogin("Jefferson_jj"); $administrador->setSenha("Jefferson_jj"); $administrador->setEmail("Jefferson_jj");*/ //$criarSessao = new CriarSessao(); //$criarSessao->criarSessaoAdmin($administrador); $this->atualizarAcesso($login); $this->setRespostaValidacaoLogin(true); } else{ $this->setRespostaValidacaoLogin(false); } } View: public function exibirRespostaValidacaoLoginPositiva(){ header ("Location: ../admin/home.php"); } Só uma duvida, com relação ao login, o controller que criaria a sessão e colocaria alguns dados? Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2011 Melhorei um pouco meus codigos, acho que agora ficou legal Controller: Tão errado quanto ter regras de negócio na View, é ter regras de negócio no Controller e seu Controller possui regras que deveriam estar na Model. Tente ser menos específico no Controller, em vez de verificar passo a passo uma coisa, deixe isso para o Model e veja apenas o resultado: if ( $model->validaLogin() ) { //login válido } else { //login inválido } View: header ("Location: ../admin/home.php"); Não é responsabilidade de View fazer isso, quem deveria tê-lo feito é o Controller. Só uma duvida, com relação ao login, o controller que criaria a sessão e colocaria alguns dados? Sessão, persistência, etc é responsabilidade da Model, não do Controller. Compartilhar este post Link para o post Compartilhar em outros sites
criatividade zero 17 Denunciar post Postado Julho 27, 2011 é o controller quem faz a verificação, e nao a view Perfeito. :joia: valeu professor :) essa duvida você que me explicou a algum tempo era exatamente o mesmo caso o camada View possui ifs, loops... isso é inevitavel, mas o caso dele era redundancia como o meu erro inicial acho que fez-se confusão ao falar em view não-burra (inteligente) de fato, a view é uma camada inteligente, como todas as outras, porem é uma camada que 'arruma' a view não faz nada, apenas mostra header ("Location: ../admin/home.php"); pode ser entendido como uma ação, então nao é para a view fazer isso se existe um redirecionamento, entende-se que não ha nada para mostrar, APENAS, se você tiver um redirecionamento em js mostrando: página errada, você será redirecionado em 5 segundos Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 27, 2011 Acho que agora foi No controller eu apenas recebo o retorno do model: case "validarLogin":{ $administradorModel = new AdministradorModel(); $administradorView = new AdministradorView(); if($administradorModel->validarLogin( $_REQUEST["login"], $_REQUEST["senha"])){ header ("Location: ../admin/home.php"); } else{ $administradorView->exibirValidacaoLoginNegativa(); } } No model eu verifico no BD e retorno true ou false e agora vou colocar tudo na sessao, na model Com relação a listagem: É melhor eu mandar, pelo controller, que a model liste, tipo assim: case "listarUsuarios":{ $administradorModel = new AdministradorModel(); $administradorModel->listar(); $administradorView = new AdministradorView(); $administradorView->exibirListaAdministradores($administradorModel); } break; Ou é melhor eu deixar que a view se comunique com a model e pegue a lista, assim: case "listarUsuarios":{ $administradorModel = new AdministradorModel(); $administradorView = new AdministradorView(); $administradorView->exibirListaAdministradores($administradorModel); } break; Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2011 APENAS, se você tiver um redirecionamento em js mostrando: página errada, você será redirecionado em 5 segundos Correto, nesse caso o redirecionamento, por ser feito em JS, precisa ocorrer no navegador. Contudo, é importante notar que, mesmo ocorrendo no navegador, não é a View que faz o redirecionamento. MVC pessoal, ocorre a todo momento: Na sua barra de endereços do navegador (sim, a barra do próprio firefox, ie, chrome, etc) :seta: A própria barra é chamada de View. Quando você começa a digitar alguma coisa e um popup aparece com sugestões baseadas no histórico, é o Controlador recebendo a ação de digitação do usuário, consultando a Model e recuperando as URLs que são adequadas. Ou seja, quando a aplicação é modelada, MVC também acontece no front-end com o Javascript. Acho que agora foi No controller eu apenas recebo o retorno do model: Agora seu controller ficou adequado. :clap: Siga a mesma linha com o restante da aplicação e você terá feito tudo correto. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 27, 2011 Entendi. Como eu perguntei acima, existe alguma diferença se eu chamar a função list() do model no controller ou na view? Compartilhar este post Link para o post Compartilhar em outros sites
criatividade zero 17 Denunciar post Postado Julho 27, 2011 Jefferson NF, o JBN é o cara que saca das coisas, eu aprendi lendo os topicos relacionados ao MVC você esta quase tentando acertar por adivinhação e isso não contribui para você entender de fato como funciona o MVC minha sugestão é que você leia tudo que tem sobre o assunto - MVC nao é uma forma pessoal de se fazer, mas sim, uma metodologia de desenvolvimento, quando você captar isso vai sentir aquele 'estalo' MVC são 3 camadas model, view e controll você SABE realmente o que cada camada faz? esse é o 1º passo pra entender, caso contrario é dar murro em ponta de faca tente aprender MVC usando o proprio MVC... aprenda por etapas nao de um passo maior que a perna pq depois a confusão é maior ainda - experiencia propria com exemplos errados Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Julho 27, 2011 você esta quase tentando acertar por adivinhação e isso não contribui para você entender de fato como funciona o MVC Concordo 100% com isso que você falou ! Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 27, 2011 Valeu pelas dicas e pela ajuda. Eu sei como isso tudo funciona na teoria, na prática é bem diferente, estou lendo bastante coisa. Vi as videos aulas recomendada aqui mesmo, li o blog do Andrey, peguei até um exemplo dele. Leio e releio esse topico, principalmente, no começo, onde é explciado, bem na teoria, a função de cada camada. mas agora bastante coisa ficou esclarecida, principalmente, depois da intervençã do João nesse topico. Ja estou conseguindo entender muito melhor as coisas e até ver alguma coisas funcionando e no padrão MVC. Só que algumas duvidas, bobas, as vezes, como essa da função list, aparecem e esse tipo de duvida voce nao encontra em nenhum material por aí. Mas valeu mesmo pela ajuda e pelas dicas. Compartilhar este post Link para o post Compartilhar em outros sites
João Batista Neto 448 Denunciar post Postado Julho 27, 2011 Só que algumas duvidas, bobas, as vezes, como essa da função list, aparecem e esse tipo de duvida voce nao encontra em nenhum material por aí. Essa dúvida do list foi respondida no post #67 por antecipação. Leia esse post com calma, deguste cada vírgula, teste exaustivamente, quebre a cabeça, volte a testar. Lá no final do post #67 tem a resposta para a questão da lista :seta: http://forum.imasters.com.br/topic/438854-sistema-em-mvc/page__view__findpost__p__1737562 Compartilhar este post Link para o post Compartilhar em outros sites
Jefferson NF 0 Denunciar post Postado Julho 27, 2011 Valeuuu Muito obrigado. Compartilhar este post Link para o post Compartilhar em outros sites