Aproveitando o exemplo do Zend_Auth e Zend_Acl, dei uma melhorada e fiz uma atualização para usar AJAX na pagina de login. Caso a senha nao confira, mostra o hint que foi cadastrado no banco, caso o usuario não exista, tambem exibe uma mensagem de login invalido.
paginalogin.phtml
<html>
<head>
<script type="text/javascript" src="<?php echo $this->baseUrl ?>/public/mootools.js"></script>
</head>
<script>
// Pegando os valores e montando o objeto ajax
function validar(){
var usuario = $('usuario').value;
var senha = $('senha').value;
var queryString = {"usuario": usuario, "senha": senha };
var opcoes =
{
"method":"get",
"data": queryString,
"onComplete": completouSolicitacao
};
var ajaxObj = new Ajax("<?php echo $this->baseUrl ?>/Login/login", opcoes).request();
}
function completouSolicitacao(info){
// limpa o hint
$('hint').innerHTML = "";
var obj = Json.evaluate( info );
// Caso tenha tido erro na validacao do login
if (obj.erro == true){
// Caso o problema tenha sido na senha
if(obj.tipo == "senha" )
$('hint').innerHTML = "Senha nao confere. Hint: " + obj.hint;
else
// Caso o problema tenha sido o login invalido
$('hint').innerHTML = "Login invalido";
}else{
// Nao teve erros, submeter formulario
$('frm').submit();
}
}
</script>
<form name="frm" id="frm" onSubmit="return validar(this)"
action="<? echo $this->baseUrl ?>/Login/login" method="post">
<table>
<tr>
<td>
Usuario:
</td>
<td>
<input type="text" name="usuario" id="usuario"/>
</td>
</tr>
<tr>
<td>
Senha:
</td>
<td>
<input type="password" name="senha" id="senha" value="" />
<label id="hint"></label>
</td>
</tr>
</table>
<input class="botao" type="button" value="Entrar" onclick="validar();"/>
</form>
</html>
logincontroller.php
function paginaajaxAction(){
}
function loginAction()
{
$usuario = $this->_request->getParam("usuario");
$senha = $this->_request->getParam("senha");
Zend_Loader::loadClass('UsuarioDAO');
Zend_loader::loadClass("Zend_Json");
Zend_Json::$useBuiltinEncoderDecoder = true;
$dao = new UsuarioDAO();
// Verificando o cabecalho do request pra ver se é um request xml
// A maioria dos frameworks ajax implementam o cabecalho ajax, mas nao é uma
// regra, caso isso nao seja feito esse metodo nao irá funcionar.
if($this->_request->isXmlHttpRequest()){
// Obtem o usuario
$usuario = $dao->recuperaPorUsuario($usuario);
// verifica se conseguiu obter
if ($usuario){
// Caso tenha conseguido obter e a senha nao confere
if ( $usuario->s_senha != $senha ){
@$obj->erro = true;
$obj->tipo = "senha";
$obj->hint = $usuario->s_hint;
} else {
// Caso a senha confira, nao teve erro.
@$obj->erro = false;
}
}else{
// Nao conseguiu obter, logo login nao existe
@$obj->erro = true;
$obj->tipo = "logininvalido";
}
// Transforma o objeto default para JSON
$objJson = Zend_Json::encode( $obj );
// coloca na camada de visao
$this->view->obj = $objJson;
// Chama o Action responsavel por ecoar o JSON
$this->_forward("paginaajax");
return;
}else{
// Fazer validacao dos campos. Por exemplo usando o Zend_Validate
if( true ){
$this->realizaLogin($usuario, $senha);
} else {
// Deu erro, volta pra pagina de login
$this->_forward('paginalogin');
return;
}
}
}//loginAction
Exemplo para download: www.guiarapido.net/public/programatik1.zip
Dezembro 4, 2008 at 1:37 pm
Brother, me explica uma coisa: Por que vc fez toda a parada do ajax, fez a validação do usuário e da senha lá no servidor, mas no final você submeteu o formulário, ao invés de colocar logo o cabra na sessão e mudar o conteúdo da parte onde está o formulário?
me explica?
Dezembro 4, 2008 at 2:41 pm
Porque a ideia era apenas mostrar a parte da validacao do usuario via ajax, mas realmente poderia ter validado e já colocado na sessao.
No caso, ele faz a validacao via ajax, e depois dá o submit para ai sim colocar na sessao e depois ir pra outra pagina.