Lavorare con Rgl in Ajax

Ora approfondiremo un argomento un attimino più complesso e per chi possiede un minimo di esperienza sia di PHP che in Javascript.

Note: Nell'esempio utilizzerò JQuery, per diffusione di utilizzo.

Non starò qui a spiegare cosa sia una richiesta asincrona e nemmeno sul come funziona... non è il manuale corretto :-)!

Mi dedicherò a spiegare con un semplice esempio come poter utilizzare le chiamate asincrone con Rgl.

Ovviamente, si tratta di una procedura non obbligatoria. Rgl per sua natura non è e non vuole essere uno strumento rigido. L'utilizzatore sarà libero di usarlo come meglio crede! Io semplicemente mostro una via...

Come prima cosa spostiamoci all'interno del template, apriamo il file test.php e scriviamo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Test Ajax</title>
    </head>
    <body>
        Inserisci il tuo nome: <input type="text" data-input="name" value="">
        <br><br>
        Ciao mi chiamo: <span id="nome_normale"></span> <br>
        Ciao il mio nome Crittografato: <span id="nome_crittografato"></span>
    </body>
    <script src="https://code.jquery.com/jquery-2.2.4.js" integrity="sha256-iT6Q9iMJYuQiMWNd9lDyBUStIq/8PuOW33aOqmvFpqI=" crossorigin="anonymous"></script>
    <script type="text/javascript">
        $('[data-input="name"]').on('keyup', function(){
            var nome = $('[data-input="name"]').val();
            $.ajax({
                method: "POST",
                url: "<?php echo _CONFIG_[_SITE_] ?>Templates/ajax/ajax.php",
                data: {'Richiedi_nome':1, 'Nome':nome}
            }).done(function( data ) {
                $('#nome_normale').html(data.nome);
                $('#nome_crittografato').html(data.nomec);
            });
        });
    </script>
</html>

Abbiamo creato un campo di input dove inserire il nostro nome, due tag span dove intercettare i valori inviati in modo asincrono ed abbiamo utilizzato ajax di jquery per collegarci al file ajax.php situato all'interno della directory ./Templates/ajax/ajax.php.


Ora apriremo e gestiremo questo file (ajax.php) scrivendoci:

<?php
include("../../Config/config.php");
include(_CONFIG_['_ROOT_']."Lib/rgl.php");

Rgl::is_ajax();
if($_POST['Richiedi_nome']){
    include(_CONFIG_['_ROOT_'].'Templates/ajax/mio_nome.php');
}

?>

In questo caso abbiamo utilizzato il metodo Rgl::is_ajax(); tra qualche paragrafo spiegheremo perchè!

Abbiamo scritto in questo file che se la variabile globale contiene Richiedi_nome di includere il file (ancora da creare) mio_nome.php.


Sempre all'interno della directory ajax creiamo il file mio_nome.php e scriviamo questo codice:

<?php
header('Content-Type: application/json');
include(_CONFIG_['_ROOT_'].'Model/testModel.php');
$TestModel = new TestModel(
    array(
        "Crypto", // gestione Criptazione
        "Session", // gestione delle sessioni
        "Language", // gestione delle lingue
        "Avvisi", // gestore avvisi e alert
        "Str", // trattamento delle stringhe
        "DTime", // trattamento delle date
        "VerifySend", // verifica i dati in invio
        #"SendMail", // invia email in vari formati
        "DB", // gestione del DB in PDO comprende (MySql, SqLite, PostgreSql)
        #"MySql", // gestione del DB Mysql
        #"SqLite", // gestione del DB SqLite
        #"PgSql", // gestione del DB PstgreSql
        "BreadC", // gestione briciole di pane
        #"UploadFile", // Upload File & image
        "LogIn", // gestione Login
        #"Files", // gestione dei file fisici
        #"Restful" // request and response restful,
    )
);
echo $TestModel->return_name($_POST);

?>

Questo paragrafo avrà bisogno di qualche spiegazione in più.

Per ora, la sezione ajax in qualche modo è separata dal contesto globale di RGL dovremmo richiamare il file Model che potrebbe interessarci (in questo caso testModel.php).

Inoltre non è detto che la risposta debba essere obbligatoriamente in json, quindi non siamo obbligati ad inserire il content-type.

Richiamato il model dovremmo provvedere ad inizializzare la classe:

$TestModel = new TestModel()

e come valore dovremmo aggiungere tutti i blocchi che potrebbero interessarci.

Infine, richiamiamo il metodo:

echo $TestModel->return_name($_POST);

Ora dovremmo spostarci all'interno del model e creare il metodo:

class TestModel extends Rgl {
    # No __construct

    function return_name($_){
        if(strlen($_['Nome']) >= 3){
            return json_encode(array(
                'nome' => $_['Nome'],
                'nomec' => Crypto::Crypt($_['Nome']),
            ));
        }
    }

}

Nulla di complicato, preleva i dati inviati in post e li restituisce trasformati in json.


Ok, è ora di provare lo script inserendo il nostro nome all'interno del campo. Mi raccomando digitiamo più di tre lettere, perchè è stato inserito un controllo!

Funziona? Perfetto!
Non funziona? Rivediamo attentamente i passaggi!

Ora proviamo ad accedere alla pagina ajax direttamente dalla barra degli indirizzi digitando:

http://localhost/nostro_progetto/Templates/ajax/ajax.php

Grazie a Rgl::is_ajax() verremo reindirizzati alla pagina di errore configurata all'interno del file config.php alla costante: _ERROR_404_, questo per ragioni di sicurezza.

Infatti le chiamate in ajax possono essere effettuate solo dal dominio in cui è posto il progetto. Non è propriamente vero e non vale come legge universale, ma il concetto si avvicina molto. Se volete approndire il concetto, in rete ci sono numerose guide.


Perchè richiamare tante pagine, quanto ne bastavano due?

Qualcuno si sarà domandato questo... ed è vero... all'inizio sembra troppo articolato, ma prima di arrivare a questo punto ho studiato diverse situazioni, da progetti minuscoli a progetti molto elaborati ed ho trovato come "soluzione" intermedia questo procedimento.

Ma come detto in precedenza, non esiste un sistema giusto ed uno sbagliato se l'obiettivo viene regiunto. Quindi procedete come meglio credete ;-)