Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Victor Hugo Soares

Sistema PHP MVC com Ajax

Recommended Posts

Olá a todos,

estou com um probleminha e já revirei de todos os lados e não consegui :sleepy:

o login em ajax funciona perfeitamente, porém a recuperação de senha não está dando certo :(

minha aplicação tem a seguinte estrutura de diretórios:

 

|-aplicacao_site

|-aplicacao_site/core/Aplicacao.php

|-aplicacao_site/core/Controlador.php

|-aplicacao_site/core/View.php

|-aplicacao_site/libs/Helper.php

|-aplicacao_site/model/Model.php

|-aplicacao_site/view/_templates/cabecalho.php

|-aplicacao_site/view/_templates/menu.php

|-aplicacao_site/view/_templates/rodape.php

|-aplicacao_site/controller/Login.php

|-aplicacao_site/view/Login/index.php

|-aplicacao_site/view/Login/recuperacaoSenha.php

|-publico

|-publico/site

|-publico/site/index.php ->primeiro arquivo a ser executado

|-publico/site/ajax.php

|-publico/site/.htaccess

|-publico/site/vendor/autoload.php

|-publico/site/vendor/jquery/jquery.min.js

|-publico/site/vendor/jquery/jquery.validate.min.js

|-publico/site/js/login.js

|-publico/site/js/RecuperaSenha.js

 

Vamos aos códigos: Obs: arroba é o nome do site;

 

|-publico/site/.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /arroba/
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

 

|-publico/site/index.php

<?php

date_default_timezone_set( "America/Sao_Paulo" );

try {
	
    
    require 'definicoes.php';
    
    // This is the (totally optional) auto-loader for Composer-dependencies (to load tools into your project).
    // If you have no idea what this means: Don't worry, you don't need it, simply leave it like it is.
    if ( file_exists( ARROBA . 'vendor/autoload.php' ) ) {        
        require ARROBA . 'vendor/autoload.php';        
    }
    
    // load application config (error reporting etc.)
    require APP . 'config/config.php';
    
    $app = \core\Aplicacao::INSTANCIA();    
    
    $app->Inicia();
    
} catch ( Exception $e ){
    
    echo '<br /> Erro na execução do sistema <br />';
    echo $e->getMessage();
}

 

|-publico/site/vendor/autoload.php

<?php

spl_autoload_register(
    
    function( $className ){
        
        $className = str_replace("\\", "/" , $className . '.php');
        
        $className = APP . $className;
        
        if ( file_exists( $className ) ){
            require_once ( $className );
        }  else { 
            //echo '<br /> Não será carregada automaticamente <br />'; 
        }
        
    }
);

 

|-publico/site/js/login.js

var formulario = "#FrmLogin";
var formulario2 = "#FrmRecuperaSenha";

function InicializaValidacao(){ 
	
	$( formulario ).validate({
		
		rules: {
			email:{
				required: true,
				email: true
			},
			senha:{
				required: true
			}
				
		},
		
		messages:{
			email:{
				required: "Por favor preencha o Email",
				email: "Por favor preencha com um Email válido!"
			},
			senha:{
				required: "Por favor preencha a Senha"
			}
		},
		
	    highlight: function(element){
	        $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
	    },
	    unhighlight: function(element){
	    	$(element).closest('.form-group').removeClass('has-error').addClass('has-success');
	    },
		
		//função chamada caso os dados estejam de acordo
		submitHandler: function(form){
			
			$.ajax({
				
				type: "post",
				url: "ajax.php",
				dataType: "html",
				data: $(formulario).serialize(),
				beforeSend: function(data){
				},
				complete: function(){
				},
				success: function(data){
					
					var retorno = $.parseJSON( data );
					
					if( retorno.sucesso ){
                    	
						window.location.assign( 'inicio' );
						
					}else{
                        //console.log( 'Falhou' );
						$( '#myModal' ).find('#myModalLabel').html( 'Problema na autenticação' );
						$( '#myModal' ).find('.modal-body').html( retorno.errMsg );
						$( '#myModal' ).modal( 'show' );
						
					}
				},
				error: function(){
					
					//console.log( 'Erro' );
					
				}
				
			});
		}
		
	});
	
}

$( document ).ready( function(){
	
	InicializaValidacao();
	
});

 

|-publico/site/js/RecuperaSenha.js

var formulario = "#FrmRecuperaSenha";

function InicializaValidacao(){ 
	
	$( formulario ).validate({
		
		rules: {
			email:{
				required: true,
				email: true
			}
				
		},
		
		messages:{
			email:{
				required: "Por favor preencha o Email",
				email: "Por favor preencha com um Email válido!"
			}
		},
		
	    highlight: function(element){
	        $(element).closest('.form-group').removeClass('has-success').addClass('has-error');
	    },
	    unhighlight: function(element){
	    	$(element).closest('.form-group').removeClass('has-error').addClass('has-success');
	    },
		
		//função chamada caso os dados estejam de acordo
		submitHandler: function(form){
			
			$.ajax({
				
				type: "post",
				url: "ajax.php",
				dataType: "html",
				data: $( formulario ).serialize(),
				beforeSend: function(data){},
				complete: function(){},
				success: function(data){
					
					console.log( data );
					
					var retorno = $.parseJSON( data );
					
					if( retorno.sucesso ){
						
						$( '#myModal' ).find('#myModalLabel').html( 'Problema na autenticação' );
						$( '#myModal' ).find('.modal-body').html( retorno.errMsg );
						$( '#myModal' ).modal( 'show' );
						
					}else{
                        //console.log( 'Falhou' );
						$( '#myModal' ).find('#myModalLabel').html( 'Problema na autenticação' );
						$( '#myModal' ).find('.modal-body').html( retorno.errMsg );
						$( '#myModal' ).modal( 'show' );
						
					}
				},
				error: function(){
					
					window.location.assign( 'problem' );
					
				}
				
			});
		}
		
	});
	
}

$( document ).ready( function(){
	
	InicializaValidacao();
	
});

 

|-aplicacao_site/core/Aplicacao.php

<?php
namespace core;

class Aplicacao
{
    /** @var null The controller */
    private $url_controller = null;

    /** @var null The method (of the above controller), often also named "action" */
    private $url_action = null;

    /** @var array URL parameters */
    private $url_params = array();
    
    /**
     * Instancia da classe
     * @var Aplicacao
     */
    private static $instancia;

    /**
     * "Start" the application:
     * Analyze the URL elements and calls the according controller/method or the fallback
     */
    public function __construct()
    {
        // create array with URL parts in $url
        $this->splitUrl();
    }
    
    public function Inicia(){
        
        // check for controller: no controller given ? then load start-page
        if ( !$this->url_controller ) {
            
            $page = new \controller\Inicio();
            $page->index();

        } elseif ( file_exists( APP . str_replace( '\\', '/' , $this->url_controller ) . '.php' ) ) {
            
            // here we did check for controller: does such a controller exist ?

            // if so, then load this file and create this controller
            // example: if controller would be "car", then this line would translate into: $this->car = new car();
            //require APP . 'controller/' . $this->url_controller . '.php';
            $this->url_controller = new $this->url_controller();

            // check for method: does such a method exist in the controller ?
            if ( method_exists( $this->url_controller, $this->url_action ) ) {

                if ( !empty( $this->url_params ) ) {
                    // Call the method and pass arguments to it
                    call_user_func_array( array( $this->url_controller, $this->url_action ), $this->url_params );
                } else {
                    // If no parameters are given, just call the method without parameters, like $this->home->method();
                    $this->url_controller->{ $this->url_action }();
                }

            } else {
                if (strlen($this->url_action) == 0) {
                    // no action defined: call the default index() method of a selected controller
                    $this->url_controller->index();
                }
                else {
                    //header('location: ' . URL . 'problem');
                    $page = new \controller\Problem();
                    $page->index();
                }
            }
        } else {
            //header('location: ' . URL . 'problem');
            $page = new \controller\Problem();
            $page->index();
        }
    }
    
    /**
     * Cria uma instancia de um objeto da Classe caso não exista uma
     * @return Aplicacao
     */
    public static function INSTANCIA() {
        
		if ( !self::$instancia ){
            self::$instancia = new Aplicacao();
        }       
        
        return self::$instancia;
    }

    /**
     * Get and split the URL
     */
    private function splitUrl()
    {
        
        if ( isset( $_GET[ 'url' ] ) ) {

            // split URL
            $url = trim( $_GET[ 'url' ], '/' );
            $url = filter_var( $url, FILTER_SANITIZE_URL );
            $url = explode( '/', $url );

            // Put URL parts into according properties
            // By the way, the syntax here is just a short form of if/else, called "Ternary Operators"
            // @see http://davidwalsh.name/php-shorthand-if-else-ternary-operators
            $this->url_controller = isset($url[0]) ? '\controller\\' . $url[0] : null;
            $this->url_action = isset($url[1]) ? $url[1] : null;

            // Remove controller and action from the split URL
            unset($url[0], $url[1]);

            // Rebase array keys and store the URL params
            $this->url_params = array_values($url);

            // for debugging. uncomment this if you have problems with the URL
            //echo 'Controller: ' . $this->url_controller . '<br>';
            //echo 'Action: ' . $this->url_action . '<br>';
            //echo 'Parameters: ' . print_r($this->url_params, true) . '<br>';
        }
    }
}

 

|-aplicacao_site/core/Controlador.php

<?php
namespace core;

class Controlador
{
    /**
     * @var null Database Connection
     */
    public $db = null;

    /**
     * @var null Model
     */
    public $model = null;

    /**
     * Whenever controller is created, open a database connection too and load "the model".
     */
    function __construct()
    {
        $this->openDatabaseConnection();
        $this->loadModel();
    }

    /**
     * Open the database connection with the credentials from application/config/config.php
     */
    private function openDatabaseConnection()
    {
        // set the (optional) options of the PDO connection. in this case, we set the fetch mode to
        // "objects", which means all results will be objects, like this: $result->user_name !
        // For example, fetch mode FETCH_ASSOC would return results like this: $result["user_name] !
        // @see http://www.php.net/manual/en/pdostatement.fetch.php
        $options = array( \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ, \PDO::ATTR_ERRMODE => \PDO::ERRMODE_WARNING);

        // generate a database connection, using the PDO connector
        // @see http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/
        $this->db = new \PDO(DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET, DB_USER, DB_PASS, $options);
    }

    /**
     * Loads the "model".
     * @return object model
     */
    public function loadModel()
    {
        //require_once APP . 'model/model.php';
        // create new "model" (and pass the database connection)
        $this->model = new \model\Model($this->db);
    }
}

 

|-aplicacao_site/core/View.php

<?php

namespace core;

class View {
    
    /** @var array <br/> Lista de folhas de Estilo que serão incorporados na página */
    private static $listaCSS = array();
    
    /** @var array <br/> Lista de scripts em Javascript que serão incorporados na página */
    private static $listaJS = array();
    
    /** @var array <br/> Lista de dados das tabelas DataTables em JSON que serão incorporados na página */
    private static $dadosDataTables = array();
    
    /** @var View <br/> Instancia da classe */
    private static $instancia;
    
    /**
     * Cria uma instancia de um objeto da Classe caso não exista uma
     * @return View
     */
    public static function INSTANCIA() {
        if ( !self::$instancia ){
            self::$instancia = new View();
        }        
        return self::$instancia;
    }
    
    public static function PEGACSS( $chave = null ) {
        
        if( $chave ){
            return ( isset( static::$listaCSS[ $chave ] ) ? static::$listaCSS[ $chave ] : null );
        } else {
            return ( isset( static::$listaCSS ) ? static::$listaCSS : null );
        }
    }
    
    public static function REGISTRACSS( $valor, $chave = null ) {
        
        if( $chave ){
            static::$listaCSS[ $chave ] = $valor;
        } else {
            static::$listaCSS[] = $valor;
        }
        
    }
    
    public static function PEGAJS( $chave = null ) {
        
        if( $chave ){
            return ( isset( static::$listaJS[ $chave ] ) ? static::$listaJS[ $chave ] : null );
        } else {
            return ( isset( static::$listaJS ) ? static::$listaJS : null );
        }
    }
    
    public static function REGISTRAJS( $valor, $chave = null ) {
        
        if( $chave ){
            static::$listaJS[ $chave ] = $valor;
        } else {
            static::$listaJS[] = $valor;
        }
        
    }
    
    public static function PEGADADOSDATATABLE( $chave = null ) {
        
        if( $chave ){
            return ( isset( static::$dadosDataTables[ $chave ] ) ? static::$dadosDataTables[ $chave ] : null );
        } else {
            return ( isset( static::$dadosDataTables ) ? static::$dadosDataTables : null );
        }
    }
    
    public static function REGISTRADADOSDATATABLE( $valor, $chave = null ) {
        
        if( $chave ){
            static::$dadosDataTables[ $chave ] = $valor;
        } else {
            static::$dadosDataTables[] = $valor;
        }
        
    }
    
}

 

|-aplicacao_site/libs/Helper.php

<?php
namespace libs;

class Helper {
    
    CONST DB_CHAVE_CRYPT = 'XYZ';
    
    public static function getConexaoBDARROBA(){
        
        $mySQL = \classes\db\mysql\MySQL::getInstance();
        
        $connector = $mySQL->createConnector( 'arroba' , $mySQL->createConnectionConfig( DB_HOST , DB_NAME , DB_USER , DB_PASS ) );
        
        return $connector;
    }
    
    /**
     * debugPDO
     *
     * Shows the emulated SQL query in a PDO statement. What it does is just extremely simple, but powerful:
     * It combines the raw query and the placeholders. For sure not really perfect (as PDO is more complex than just
     * combining raw query and arguments), but it does the job.
     * 
     * @author Panique
     * @param string $raw_sql
     * @param array $parameters
     * @return string
     */
    static public function debugPDO($raw_sql, $parameters) {

        $keys = array();
        $values = $parameters;

        foreach ($parameters as $key => $value) {

            // check if named parameters (':param') or anonymous parameters ('?') are used
            if (is_string($key)) {
                $keys[] = '/' . $key . '/';
            } else {
                $keys[] = '/[?]/';
            }

            // bring parameter into human-readable format
            if (is_string($value)) {
                $values[$key] = "'" . $value . "'";
            } elseif (is_array($value)) {
                $values[$key] = implode(',', $value);
            } elseif (is_null($value)) {
                $values[$key] = 'NULL';
            }
        }

        /*
        echo "<br> [DEBUG] Keys:<pre>";
        print_r($keys);
        
        echo "\n[DEBUG] Values: ";
        print_r($values);
        echo "</pre>";
        */
        
        $raw_sql = preg_replace($keys, $values, $raw_sql, 1, $count);

        return $raw_sql;
    }
    
    //verifica se existe a array e/ou a chave informada.
    //retorna false caso um dos dois não exista.
    static public function Existe($array, $key)
    {
        return isset($array) && array_key_exists($key, $array) && !empty($array[$key]);
    }
    
    static public function doAjaxRequest()
    {
        
        if ( self::Existe( $_POST, 'functionName' ) ){
            
            list( $nomeClasse, $nomeMetodo ) = explode( '::', $_POST[ 'functionName' ] );
            
            if ( ! isset( $nomeClasse ) || $nomeClasse === "" || $nomeClasse === null ){                
                throw new \Exception( 'Classe não encontrada na solicitação em Ajax!' );
            }
            if ( ! isset( $nomeMetodo ) || $nomeMetodo === "" || $nomeMetodo === null ){
                throw new \Exception( 'Método não encontrado na solicitação em Ajax!' );
            }
            
            require_once ( APP . '/core/Controlador.php' );
            require_once ( APP . '/controller/' . strtolower( $nomeClasse ) . '.php' );
            
            call_user_func( '\controller\\' . $nomeClasse . "::" . $nomeMetodo );
            
        } else {
            throw new \Exception( 'Parâmetro do Ajax "functionName" não encontrado!' );
        }
    }
    
    //busca a sql dentro de um arquivo xml
    static function PegaSQL( $xml, $id ){
        
        try
        {
            $dom = new \DOMDocument( '1.0', 'UTF-8' );
            $dom->load( APP . "/sql" . $xml);
            $xml = new \DOMXPath( $dom );
            return $xml->query( "//*[@id='" . $id . "']" )->item(0)->nodeValue;
            
        } catch( \Exception $e ) {
            return false;
        }
    }
}

 

|-aplicacao_site/controller/Login.php

<?php
namespace controller;
/**
 * Class Login
 *
 * Please note:
 * Don't use the same name for class and method, as this might trigger an (unintended) __construct of the class.
 * This is really weird behaviour, but documented here: http://php.net/manual/en/language.oop5.decon.php
 *
 */

class Login extends \core\Controlador {
    
    static $loginOK = false;
    
    /**
     * PAGE: index
     * This method handles what happens when you move to http://yourproject/login/index (which is the default page btw)
     */
    public function index() {
        
        $app = \core\Aplicacao::INSTANCIA();
        
        if( $app->Logado() ){
            
            if( $app->MesmaSessao() ){
                
                // load views
                require APP . 'view/_templates/cabecalho.php';
                require APP . 'view/inicio/index.php';
                require APP . 'view/_templates/rodape.php';
                
            } else {
                
                // carrega a página de login
                require APP . 'view/autenticacao/index.php';
            }
            
            
            
        } else {
            // carrega a página de login
            require APP . 'view/login/index.php';
        }
    }
    
    /**
     * Método chamado via Ajax permitindo o usuário logar no sistema
     * 
     * Como o método é chamado via Ajax, a execução do código não passa pela index.php, sendo assim
     * necessário a importação de todos os arquivos de configuração e tals
     */
    static public function LOGAR() { 
        
        $retorno[ 'sucesso' ] = false;
        $retorno[ 'errMsg' ] = null;
        
        if( ! \libs\Helper::Existe( $_POST, 'email' ) ){
            //$email = $_POST[ 'email' ];
            //throw new Exception( 'Parâmetro email não encontrado' );
            $retorno[ 'errMsg' ] = 'Parâmetro email não encontrado';
            
        } elseif( ! \libs\Helper::Existe( $_POST, 'senha' ) ){
            //$senha = $_POST[ 'senha' ];
            //throw new Exception( 'Parâmetro senha não encontrado' );
            $retorno[ 'errMsg' ] = 'Parâmetro senha não encontrado';
            
        } else {
            
            require_once APP . 'config/config.php';
            
            $app = \core\Aplicacao::INSTANCIA();
            
            if ( $app->FazerAcesso( $_POST[ 'email' ], $_POST[ 'senha' ] ) ){
        
                $retorno[ 'sucesso' ] = true;
            } else {
                $retorno[ 'errMsg' ] = 'Usuário ou senha inválidos!';
            }
        }
        
        echo json_encode( $retorno );
        
    }
    
    public function recuperacaoSenha(){
		
		$app = \core\Aplicacao::INSTANCIA();
		
        // carrega a página de login
        require APP . 'view/login/recuperacaoSenha.php';
    }
	
	/**
     * Método chamado via Ajax permitindo o usuário logar no sistema
     * 
     * Como o método é chamado via Ajax, a execução do código não passa pela index.php, sendo assim
     * necessário a importação de todos os arquivos de configuração e tals
     */
    static public function RecuperarSenha() { 
        
        $retorno[ 'sucesso' ] = false;
        $retorno[ 'errMsg' ] = null;
        
        if( ! \libs\Helper::Existe( $_POST, 'email' ) ){
            //$email = $_POST[ 'email' ];
            //throw new Exception( 'Parâmetro email não encontrado' );
            $retorno[ 'errMsg' ] = 'Parâmetro email não encontrado';
            
        } else {
            
            require_once APP . 'config/config.php';
			
        }
        
        echo json_encode( $retorno );
        
    }
}

 

|-aplicacao_site/view/Login/index.php

<!DOCTYPE html>
<html lang="pt-br">

<head>

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="VH - Soluções Inteligentes">
<meta name="author" content="Victor Hugo - Soluções Inteligentes">

<title>VH - Soluções Inteligentes</title>

<!-- Bootstrap Core CSS -->
<link href="<?php echo URL; ?>vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

<!-- Custom CSS -->
<link href="<?php echo URL; ?>css/style.css" rel="stylesheet">

<!-- Custom Fonts -->
<link href="<?php echo URL; ?>vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">

<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
    
</head>
    
<body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-4 col-md-offset-4">
                <div class="login-panel panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">Por favor autentique-se</h3>
                    </div>
                    <div class="panel-body">
                    
                        <!-- Form -->
                        <form id="FrmLogin" role="form" method="post" action="login">
                        	<input type="hidden" name="functionName" value="Login::LOGAR" />
                            <fieldset>
                                <div class="form-group">
                                    <!-- <input class="form-control" placeholder="E-mail" name="email" type="email" autofocus>  -->
                                    <input class="form-control" placeholder="E-mail" name="email" autofocus>
                                </div>
                                <div class="form-group">
                                    <input class="form-control" placeholder="Senha" name="senha" type="password" value="">
                                </div>
                                <!--
                                <div class="checkbox">
                                    <label>
                                        <input name="remember" type="checkbox" value="Remember Me">Remember Me
                                    </label>
                                </div>
                                -->
                                <div>
                                	<label>
                                		<a href="login/recuperacaoSenha">Esqueceu a Senha?</a>
                                	</label>
                                </div>
                                <input type="submit" class="btn btn-lg btn-success btn-block" value="Entrar" />
                            </fieldset>
                        </form>
                        <!-- /form -->
                        
                        <!-- Modal -->
                        <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                            <div class="modal-dialog">
                                <div class="modal-content">
                                    <div class="modal-header">
                                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                                        <h4 class="modal-title" id="myModalLabel">Problemas de autenticação</h4>
                                    </div>
                                    <div class="modal-body">
                                        Texto body modal
                                    </div>
                                    <div class="modal-footer">
                                        <button type="button" class="btn btn-default" data-dismiss="modal">Fechar</button>
                                        <!-- <button type="button" class="btn btn-primary">Save changes</button> -->
                                    </div>
                                </div>
                                <!-- /.modal-content -->
                            </div>
                            <!-- /.modal-dialog -->
                        </div>
                        <!-- /.modal -->
                        
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    <!-- jQuery -->
    <script src="<?php echo URL; ?>vendor/jquery/jquery.min.js"></script>
    
    <!-- Bootstrap Core JavaScript -->
    <!-- Necessário para Modal -->
    <script src="<?php echo URL; ?>vendor/bootstrap/js/bootstrap.min.js"></script>
    
    <!-- Script para a validação do Formulário -->
	<script type="text/javascript" src="<?php echo URL; ?>vendor/jquery/jquery.validate.min.js"></script>
		
    <!-- Custom Page JavaScript -->
    <script type="text/javascript" src="<?php echo URL; ?>js/login.js"></script>
    
</body>
    
</html>

 

|-aplicacao_site/view/Login/recuperacaoSenha.php

<!DOCTYPE html>
<html lang="pt-br">

<head>

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="VH - Soluções Inteligentes">
<meta name="author" content="Victor Hugo - Soluções Inteligentes">

<title>VH - Soluções Inteligentes</title>

<!-- Bootstrap Core CSS -->
<link href="<?php echo URL; ?>vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

<!-- Custom CSS -->
<link href="<?php echo URL; ?>css/style.css" rel="stylesheet">

<!-- Custom Fonts -->
<link href="<?php echo URL; ?>vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css">

<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
        <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
        <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
    
</head>
    
<body>
    
    <div class="container">
        <div class="row">
            <div class="col-md-4 col-md-offset-4">
                <div class="login-panel panel panel-default">
                    <div class="panel-heading">
                        <h3 class="panel-title">Recuperação de senha</h3>
                    </div>
                    <div class="panel-body">
                    
                        <!-- Form -->
                        <form id="FrmRecuperaSenha" role="form" method="post" action="login">
                        	<input type="hidden" name="functionName" value="Login::RecuperarSenha" />
                            <fieldset>
								<div>
                                	<label>
                                		<a href="../login"> <i class="fa fa-arrow-left" /> </i> Voltar </a>
                                	</label>
                                </div>
                                <div class="form-group">
                                    <!-- <input class="form-control" placeholder="E-mail" name="email" type="email" autofocus>  -->
                                    <input class="form-control" placeholder="E-mail" name="email" autofocus>
                                </div>
                                <input type="submit" class="btn btn-lg btn-success btn-block" value="Enviar" />
                            </fieldset>
                        </form>
                        <!-- /form -->
                        
                        <!-- Modal -->
                        <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
                            <div class="modal-dialog">
                                <div class="modal-content">
                                    <div class="modal-header">
                                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                                        <h4 class="modal-title" id="myModalLabel">Problemas de autenticação</h4>
                                    </div>
                                    <div class="modal-body">
                                        Texto body modal
                                    </div>
                                    <div class="modal-footer">
                                        <button type="button" class="btn btn-default" data-dismiss="modal">Fechar</button>
                                        <!-- <button type="button" class="btn btn-primary">Save changes</button> -->
                                    </div>
                                </div>
                                <!-- /.modal-content -->
                            </div>
                            <!-- /.modal-dialog -->
                        </div>
                        <!-- /.modal -->
                        
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    <!-- jQuery -->
    <script src="<?php echo URL; ?>vendor/jquery/jquery.min.js"></script>    
    
    <!-- Bootstrap Core JavaScript -->
    <!-- Necessário para Modal -->
    <script src="<?php echo URL; ?>vendor/bootstrap/js/bootstrap.min.js"></script>
    
    <!-- Script para a validação do Formulário -->
	<script type="text/javascript" src="<?php echo URL; ?>vendor/jquery/jquery.validate.min.js"></script>
		
    <!-- Custom Page JavaScript -->
    <script type="text/javascript" src="<?php echo URL; ?>js/RecuperaSenha.js"></script>
    
</body>
    
</html>

meio complicadinho né, mas se alguém puder dar uma força agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal,

Depois de 3 dias pelejando encontrei a solução, bem simples, porém desapercebido.

como o sistema é mvc com url amigáveis a url em si não chama o arquivo mas simbolizam o controller e actions e parametros para a execução do sistema.

Quando executo o ajax a url passada leva em consideração a url da aplicação. Então dependendo da quantidade de actions e parâmetros eu devo inserir "../" na chamada da url do ajax. Obrigado aí Wash Albano pelo interesse e força.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.