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 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
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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