Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Esempio Pratico di AJAX : User Manager

    ATTENZIONE:

    Questo post viene redatto un po per volta, sia perché sarebbe troppo lungo altrimenti, sia perché lo posto mano a mano che lo finisco.


    Guida all'User Manager

    Introduzione:
    Mi è capitato spesso di dover rispondere alle stesse domande più volte, domande che possono essere, a loro volta, riassunte in una sola: "Cosa cavolo è 'ste AJAX? E come si usa?"
    Beh, la prima cosa che mi viene in mente è il detersivo, e su come si usa... ;-P, ma, seriamente, AJAX è un acronimo, che sta per Asynchronous JavaScript and XML.

    AJAX:
    Due parole sono d'obbligo, prima di parlare su come si usa. L'idea del Web nasce dietro il paradigma della comunicazione "Richiesta-Risposta". Questo implica che i soggetti coinvolti abbiamo due diversi ruoli, così nascono i Client (i clienti, che fanno richieste) ed i Server (i servitori, colori che danno risposte). Internet nasce da questo: qualunque computer connesso alla rete è un client e può inviare richieste ad un server, ricevendo da lui una risposta.

    L'evoluzione del Web è stato il fare in modo che il Server non concluda il proprio lavoro con la prima risposta, infatti, sono così nati i multimedia "embedded" (incorporati) nella pagina, come immagini, video ed audio, caricati DOPO la risposta dal server, dietro altre richieste del client. A questo punto, già parliamo di comunicazione asincrona, cioé cicli di richiesta-risposta col server senza che la pagina di visualizzazione venga ricaricata, in background quindi.

    Il passo successivo è stato l'utilizzo di Javascript, nato come un linguaggio Client-Side (che funziona COMPLETAMENTE sul browser dell'utente, senza bisogno di interagire con il server) per aumentare le possibilità di una singola pagina HTML, che, da statico, diventava dinamico, cioè soggetto a cambiamenti, senza il bisogno di comunicare col server; ecco, javascript è stato espanso con un oggetto chiamato XMLHttpRequest.

    Ecco la magia: XML e Javascript. In parole povere, questo oggetto permette di inviare una richiesta al server e di leggere la risposta che il server ritorna, usando poi javascript per effettuare modifiche nella pagina.

    Difficile? Non mi pare fin qui.

    Utilizzo:
    L'utilizzo dell'oggetto non è immediato, grazie soprattutto alla Microsoft, che ha implementato la cosa con ActiveXObject.

    Infatti, la prima cosa che bisogna fare è istanziare l'oggetto con gli opportuni metodi (capendo se il Browser è Internet Explorer o altro).

    Il secondo passo è quello di indicare all'oggetto i dati necessari per fare la richiesta. E, qui, è abbastanza semplice: tutto quello di cui ha bisogno sono: url da richiamare, method da eseguire (GET o POST) e la query da inviare alla pagina (la query è quello che viene inviato dopo il ? i un url). Inoltre, dato che si tratta di Javascript, è necessario associare una funzione all'evento onReadyStateChange, che viene lanciato ad ogni fase del cicli Richiesta-Risposta con il server.

    Per una guida più esaustiva vi consiglio di aprire http://www.w3schools.com/XML/xml_http.asp

    Continua... (a breve spero)

  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Per chi avesse fretta c'e' sempre la Guida Ajax di HTML.it, sul sito anche ottimi script ed esempi.
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  3. #3
    ah, ma io non farò nulla di più dettagliato in AJAX di quello che ho scritto, il resto è solo un esempio pratico.

  4. #4
    L'Esempio Pratico
    L'esempio che andrò ora ad illustrare è l'implementazione di un'interfaccia per l'inserimento degli Utenti in un sito internet.

    Struttura:
    Per l'esempio userò i seguenti strumenti:

    1.Linguaggio di Scripting Server-Side:
    PHP: è un potente linguaggio Server-Side per la generazione di HTML dinamico

    2.Linguaggio di Scripting Client-Side:
    JavaScript: ne ho parlato sopra

    3.Database:
    Per il database userò MySQL 5.0.63

    4.Librerie JS utilizzate
    Mootools 1.2 Core: questa libreria implementa tutte le funzionalità AJAX e di manipolazione del DOM XHTML che possono servire, inoltre ha diverse funzioni di effetti grafici ( http://mootools.net )

    La struttura delle directory sarà molto semplice:
    codice:
    ROOT:
    - index.php: contiene la form per inserimento dei dati dell'utente
    - details.php: mostrerò i dati inseriti
    - css/
       - screen.css: Foglio di style della pagina
    - inc/
       - config.inc.php: dati di configurazione
       - db.inc.php: genera un link reference per l'interrogazione di MySQL
       - class/
          - JSON.php: file contenente la classe Services_JSON che permette di trasformare array multidimensionarli in stringhe intrepretabili come Oggetti Javascript. ( http://mike.teczno.com/JSON/JSON.phps )
    - js/
       - mootools-1.2-core.js : Libreria di JS
       - functions.form.js: Le funzioni che definirò
    - scripts/
       - actor.create.php: la pagina per l'inserimento dei dati dell'utente
    - ajax-scripts/
       - actor.check.php: pagina chiamata con AJAX che controlla se l'username scelto è già stato inserito e ritorna il risultato del controllo in un oggetto JSON
       - actor.select.php: pagina chiamata con AJAX che ritorna il contenuto della <SELECT> sotto forma di un oggetto JSON
    Due parole su JSON
    JSON sta per JavaScript Object Notation, ovvero trasformare un oggetto Javascript in una stringa di testo.

    In AJAX, è utilizzato come un formato di risposta che il server dà al client, risposta che viene subito tradotta in un oggetto JS con le sue proprietà ed è subito utilizzabile, senza dover processare delle stringhe.


    Queste è la struttura con i file e le directory che implementeranno tutte le funzionalità. Ora andrò a descrivere i file uno per uno.

  5. #5
    Il Database
    Quando si fanno le cose di fretta... Stavo dimenticando il DB, che ho chiamato User_Manager.

    Struttura:
    La struttura sarà pressapoco composta da 4 tabelle:

    1. Utente, la tabella più importante, dove andremo a salvare i dati per il nuovo utente:
    codice:
    CREATE TABLE `User_Manager`.`Utente` (
      `username` VARCHAR(100) NOT NULL,
      `password` VARCHAR(100) NOT NULL,
      `nome` VARCHAR(100) NOT NULL,
      `cognome` VARCHAR(100) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      `indirizzo` VARCHAR(255) NOT NULL,
      `cap` INT(5) NOT NULL,
      `id_citta` INT NOT NULL,
      `codiceFiscale` VARCHAR(16) NOT NULL,
      PRIMARY KEY (`username`),
      CONSTRAINT `id_citta` FOREIGN KEY `id_citta` (`id_citta`)
        REFERENCES `Citta` (`id`)
        ON DELETE CASCADE
    )
    CHARACTER SET utf8;
    Da notare, l'utente ha come Primary Key (PK) il campo username, così che ci assicuriamo che nessun utente abbia lo stesso username.
    Un'altra cosa da notare, la Foreign Key (FK) sul campo id_citta, legata al campo id della tabella Citta, con regola di DELETE CASCADE. Questo significa che cancellare una città, comporta cancellare gli utenti di quella città (non ha senso che esistano utenti in una città che non esiste)


    2. Citta, che contettà le diverse città, cittadine, paesi
    codice:
    CREATE TABLE `User_Manager`.`Citta` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `nome` VARCHAR(255) NOT NULL,
      `id_prov` INT NOT NULL,
      PRIMARY KEY (`id`),
      CONSTRAINT `id_prov` FOREIGN KEY `id_prov` (`id_prov`)
        REFERENCES `Provincia` (`id`)
        ON DELETE CASCADE
    )
    CHARACTER SET utf8;
    Da notare che qui la PK è un intero, infatti è dello stesso tipo di id_citta in modo che possano legare. Anche questa tabella ha una FK, id_prov che è legata al campo id della tabella Provincia (stesso discorso degli utenti, sull'esistenza di una città senza provincia)


    3. Provincia, che conterrà provincia e abbreviazione:
    codice:
    CREATE TABLE `User_Manager`.`Provincia` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `nome` VARCHAR(255) NOT NULL,
      `id_regione` INT NOT NULL,
      `abbr` CHAR(2) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE INDEX abbr(`abbr`),
      CONSTRAINT `id_regione` FOREIGN KEY `id_regione` (`id_regione`)
        REFERENCES `Regione` (`id`)
        ON DELETE CASCADE
    )
    CHARACTER SET utf8;
    Da notare la PK sul campo id e la FK sul campo id_regione, che lega la tabella al campo id della tabella Regione.


    4. Regione, che contiene soltanto il nome
    codice:
    CREATE TABLE `User_Manager`.`Regione` (
      `id` INT NOT NULL AUTO_INCREMENT,
      `nome` VARCHAR(255) NOT NULL,
      PRIMARY KEY (`id`)
    )
    CHARACTER SET utf8;
    Da notare, anche qui, la PK su id, e l'assenza di FK (implementiamo solo utenti italiani, quindi non ha senso continuare con le nazioni)

    Di seguito, ci saranno i Files.

  6. #6
    I File

    La form:
    Il file index.php non farà altro che contenere la form e i link ai file .js. In effetti, potrebbe anche essere solo un .html, ma ho voluto farlo comunque in PHP, per lasciare più possibilità.


    Ho lasciato layout il più scarno possibile. Il file è composto:


    Codice PHP:
    <?php
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:lang="it" >
        <head>
            <link rel="stylesheet" type="text/css" href="css/screen.css" />
            <script type="text/javascript" src="js/mootools-1.2-core-yc.js"></script>
            <script type="text/javascript" src="js/functions.form.js"></script>
        </head>
        <body>
            <form action="script/actor.create.php" method="post" id="UserForm">
                <div id="FormWrapper">
                    <h2>Registrazione Utente</h2>
                    <div>
                        <div class="floatedLeft">
                            Nome Utente:
                        </div>
                        <div class="floatedRight">
                            <div id="Result"></div><input type="text" name="username" id="username"/>
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Nome:
                        </div>
                        <div class="floatedRight">
                            <input type="text" name="nome" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Cognome:
                        </div>
                        <div class="floatedRight">
                            <input type="text" name="cognome" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Password:
                        </div>
                        <div class="floatedRight">
                            <input type="password" name="password" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Conferma Password:
                        </div>
                        <div class="floatedRight">
                            <input type="password" name="conferma" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            E-Mail:
                        </div>
                        <div class="floatedRight">
                            <input type="text" name="email" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Indirizzo:
                        </div>
                        <div class="floatedRight">
                            <input type="text" name="indirizzo" size="30" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            CAP:
                        </div>
                        <div class="floatedRight">
                            <input type="text" name="cap" size="5" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Codice Fiscale:
                        </div>
                        <div class="floatedRight">
                            <input type="text" name="codicefiscale" size="16" />
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Regione:
                        </div>
                        <div class="floatedRight">
                            <select name="regione" id="regione">
                               
                            </select>
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Provincia:
                        </div>
                        <div class="floatedRight">
                            <select name="provincia" id="provincia">
                               
                            </select>
                        </div>
                    </div>
                    <hr/>
                    <div>
                        <div class="floatedLeft">
                            Citt&agrave;:
                        </div>
                        <div class="floatedRight">
                            <select name="citta" id="citta">
                               
                            </select>
                        </div>
                    </div>
                    <hr/>
                    <div style="text-align: center;">
                        <input type="submit" value="Inserisci Utente" disabled="true"/>
                    </div>
                </div>
            </form>
        </body>
    </html>
    Come si vede ci sono tutti campi inseriti nella Tabella Utente, più, in fondo, tre select per la regione, la provincia e la città. Tutte e tre le select sono vuote all'inizio.
    Da notare un Div con id="Result" all'interno del quale verrà visualizzato il risultato del controllo sull'Username.

    Il secondo File è lo stle associato: screen.css:

    Codice PHP:
    *{
        
    margin0px;
        
    padding0px;
    }

    body {
        
    font-familyVerdanaGenevaArialHelveticasans-serif;
        
    font-size11px;
        
    background-color#aaa;
    }

    #FormWrapper{
        
    width600px;
        
    margin20px auto;
        
    padding-top10px;
        
    background-color#ddd;
        
    border1px outset #777;
    }

    .
    floatedLeft{
        
    width270px;
        
    floatleft;
        
    text-alignright;
        
    font-weightbold;
        
    height 16px;
        
    line-height16px;
    }

    .
    floatedRight{
        
    width320px;
        
    floatright;
        
    height16px;
    }

    #Result{
        
    width16px;
        
    height16px;
        
    float:right;
        
    backgroundtransparent url(../img/loading.gifno-repeat;
        
    margin-right200px;
        
    displaynone;
    }

    hr{
        
    clearboth;
        
    bordernone;
    }

    #FormWrapper div{
        
    margin-bottom15px;
    }

    h2{
        
    text-aligncenter;
        
    margin-bottom20px;
    }

    inputselect{
        
    font-size11px;
        
    height16px;
        
    line-height16px;
        
    width:150px;

    Bisogna notare che il div con id="Result" ha altezza e larghezza fissa con un immagine di background, ho usato la classica immagine per il loading, un cerchietto che gira, inoltre è in Display none, perché fino a quando non inserisco caratteri nell'input username non voglio che si veda niente.


    Collegamento con il DB
    Per il collegamento con il DB ho usato l'esempio sulla guida pratica di HTML.it su PHP e MySQL: http://php.html.it/guide/leggi/77/gu...mysql-pratica/

    File delle configurazioni config.inc.php:
    Codice PHP:
    <?php
        $host_db 
    "rasputin.local";
        
    $user_db "usermanager";
        
    $password_db "usermanager";
        
    $name_db "User_Manager";
    ?>
    File di definizione del Link Reference al DB db.inc.php:
    Codice PHP:
    <?php
        
    if(isset($host_db) && isset($user_db) && isset($password_db) && isset($name_db))
        {
            
    $db mysql_connect($host_db$user_db$password_db);
            if (
    $db == FALSE) die ("Errore nella connessione. Verificare i parametri nel file config.inc.php");
            
    mysql_select_db($name_db$db) or die ("Errore nella selezione del database. Verificare i parametri nel file config.inc.php");
        }
       
        if(!
    $db) die("Il link no &egrave; stato creato");
    ?>

  7. #7
    Ottenere i campi delle select
    La prima cosa da implementare è il file PHP actor.select.php, nella directory ajax-scripts/, questo file accetta in ingresso dei paramentri in GET e ritorna un JSON per javascript.

    Il file actor.select.php:
    Codice PHP:
    <?php
        
    include_once('../inc/config.inc.php');
        include_once(
    '../inc/db.inc.php');
        require_once(
    "../inc/class/JSON.php");
       
        
    //Se è passato il parametro GET regione, devo estrarre le Provincie con l'id_regione = a quello passato
        
    if(isset($_GET['regione']))
        {
            
    //Estraggo le provincie per l'id_regione
           
            //controllo che non mi passi niente di dannoso per il DB usando intval(), che trasforma una stringa nel numero corrispondente
            
    $reg_id intval($_GET['regione']);
            
    //La query
            
    $query "SELECT * FROM Provincia WHERE id_regione = $reg_id";
            
    $result mysql_query($query$db);
            
    //Uso questo array per salvare i dati ce verranno poi convertiti in JSON
            
    $toParseArray = array(
                
    'values' => array(-1),
                
    'texts' => array("Seleziona una Provincia")
                );
            
    //Ciclio su tutte le righe   
            
    while($row mysql_fetch_array($result))
            {
                
    //Inserisco l'ID che verrà assegnato come value della option
                
    $toParseArray['values'][] = intval($row['id']);
                
    //Inserisco i testi che verranno inseriti nelle option
                
    $toParseArray['texts'][] = $row['nome']." (".$row['abbr'].")";
            }
            
    //Istanzio la Service_JSON
            
    $json = new Services_JSON();
            
    //Creo la stringa
            
    $output $json->encode($toParseArray);
            
    //La stampo
            
    print($output);
            
    //Fine
            
    exit;
        }
        
    //Se non è stato passato la regione, controlle che sia passato il parametro GET provincia, in questo caso devo tornare
        //le città con id_prov = al paramentro passato
        
    else if(isset($_GET['provincia']))
        {
            
    //Estraggo le città per l'id_prov
           
            //controllo che non mi passi niente di dannoso per il DB usando intval(), che trasforma una stringa nel numero corrispondente
            
    $prov_id intval($_GET['provincia']);
            
    //La query
            
    $query "SELECT * FROM Citta WHERE id_prov = $prov_id";
            
    $result mysql_query($query$db);
            
    //Uso questo array per salvare i dati ce verranno poi convertiti in JSON
            
    $toParseArray = array(
                
    'values' => array(-1),
                
    'texts' => array("Seleziona una Citt&agrave;")
                );
            
    //Ciclio su tutte le righe   
            
    while($row mysql_fetch_array($result))
            {
                
    //Inserisco l'ID che verrà assegnato come value della option
                
    $toParseArray['values'][] = intval($row['id']);
                
    //Inserisco i testi che verranno inseriti nelle option
                
    $toParseArray['texts'][] = $row['nome'];
            }
            
    //Istanzio la Service_JSON
            
    $json = new Services_JSON();
            
    //Creo la stringa
            
    $output $json->encode($toParseArray);
            
    //La stampo
            
    print($output);
            
    //Fine
            
    exit;
        }
        
    //Se, invine, non è stato passato niente, stampo tutte le regioni
        
    else
        {
            
    //Esraggo tutte le regioni
            //La query
            
    $query "SELECT * FROM Regione";
            
    $result mysql_query($query$db);
            
    //Uso questo array per salvare i dati ce verranno poi convertiti in JSON
            
    $toParseArray = array(
                
    'values' => array(-1),
                
    'texts' => array("Seleziona una Regione")
                );
            
    //Ciclio su tutte le righe   
            
    while($row mysql_fetch_array($result))
            {
                
    //Inserisco l'ID che verrà assegnato come value della option
                
    $toParseArray['values'][] = intval($row['id']);
                
    //Inserisco i testi che verranno inseriti nelle option
                
    $toParseArray['texts'][] = $row['nome'];
            }
            
    //Istanzio la Service_JSON
            
    $json = new Services_JSON();
            
    //Creo la stringa
            
    $output $json->encode($toParseArray);
            
    //La stampo
            
    print($output);
            
    //Fine
            
    exit;
        }
    ?>
    Il file mi sembra ben commentato, unica nota: come prima option di ogni select inserisco una option con value="-1" e testo Selezionare una Regione, Provincia, Città.

    Ora c'è la parte di functions.form.js che va a chiamare il file actor.select.php con chiamare AJAX.

    Codice PHP:
    var callRegionecallProvinciacallCitta;
    var 
    action_select 'ajax-scripts/actor.select.php';
     
     
    /**
      * Questa funzione aggiunge all'Evento OnLoad della pagina le segueti azioni:
      */
     
    window.addEvent('load' , function(){
         
    //Istanza l'oggetto Request.JSON per il popolamento del select#citta
         
    callCitta = new Request.JSON({
             
    urlaction_select,
             
    onComplete: function(obj){
                 
    populateSelect('citta'obj);
             }
         });
        
    //Istanza l'oggetto Request.JSON per il popolamento del select#provincia
         
    callProvincia = new Request.JSON({
             
    urlaction_select,
             
    onComplete: function(obj){
                 
    populateSelect('provincia'obj);
             }
         });
        
    //Istanza l'oggetto Request.JSON per il popolamento del select#regione
         
    callRegione = new Request.JSON({
             
    urlaction_select,
             
    onComplete: function(obj){
                 
    populateSelect('regione'obj);
             }
         });
         
    /*Popolo la select delle regioni*/
        
    callRegione.get();
       
        
    /*Aggiungo gli eventi sui Select che popoleranno i successivi*/
        
    $('regione').addEvent('change', function(){
            var 
    selected this.getSelected()[0].value;
            
    callProvincia.get({
                
    'regione'selected
            
    });
        })
        $(
    'provincia').addEvent('change', function(){
            var 
    selected this.getSelected()[0].value;
            
    callCitta.get({
                
    'provincia'selected
            
    });
        })
     })
     
     
    /**
      * Questa funzione cancella gli elementi in una SELECT, poi la ripopola con gli elementi di un Oggetto JSON.
      * Struttura del JSON:
      * {"values":[-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],"texts":["Seleziona una Regione","Valle d´Aosta","Piemonte","Liguria","Lombardia","Trentino-Alto Adige","Veneto","Friuli-Venezia Giulia","Emilia-Romagna","Toscana","Marche","Umbria","Lazio","Abruzzo","Molise","Campania","Basilicata","Puglia","Calabria","Sicilia","Sardegna"]}
      * @param {String} id : l'id della select da aggiornare
      * @param {Object} jsonObj : l'oggetto JSON che la chiamata AJAX ritorna
      */
     
    function populateSelect(idjsonObj){
         var 
    select = $(id);
         
    select.empty();
         
    $A(jsonObj.values).each(function(itemindex){
             var 
    opt = new Element('option', {
                 
    'value'item
             
    }).set('html'jsonObj.texts[index]);
             
    opt.inject(select);
         });
     } 
    Bisogna fare una nota sugli oggetto Request.JSON. Questi oggetti fanno sempre le stesse azioni, quindi li ho istanziati una volta sola. In questo modo c'è un utilizzo molto minore della memoria del browser.

    Questo è quanto necessario per far funzionare le select modificabili con AJAX.

  8. #8
    Controllo del Nome Utente
    Per controllare il nome utente è necessario definire un altro file PHP da chiamare con AJAX:

    Ecco dunque actor.check.php:
    Codice PHP:
    <?php
        
    //Se passo il paramentro username faccio il controllo, altrimenti niente
        
    if(isset($_GET['username'])){
            
    //Per usare JSON ho bisogno della classe
            
    require_once("../inc/class/JSON.php");
            
    //Istanzio la Service_JSON
            
    $json = new Services_JSON();
            
    //L'username scelto è troppo corto?
            
    if(strlen($_GET['username']) < 6)
            {
                
    $ret = array('status' => false'reason' => 'Username Scelto Troppo Corto');
                
    //Creo la stringa
                
    $output $json->encode($ret);
                
    //La stampo
                
    print($output);
                
    //Fine
                
    exit;
            }
            
    //Per evitare SQL injection basta convertire i caratteri speciali (QUOTE inclusi), in modo che un nome utente tipo D'Arrigo sia evalutato correttamente
            
    $username htmlentities($_GET['username'], ENT_QUOTES'UTF-8');
            
    //Includo i file per generare il link reference al DB
            
    include_once('../inc/config.inc.php');
            include_once(
    '../inc/db.inc.php');
           
            
    //La query
            
    $query "SELECT COUNT(username) AS conto FROM Utente WHERE username LIKE '$username'";
            
    $result mysql_query($query$db);
            
    $row mysql_fetch_array($result);
            if(
    intval($row['conto']) == 0)
                
    $ret = array('status' => true'reason' => null);
            else
                
    $ret = array('status' => false'reason' => 'Username &egrave; gi&agrave; in uso');
           
            
    $output $json->encode($ret);
            
    //La stampo
            
    print($output);
            
    //Fine
            
    exit;
        }       
    ?>
    Il codice mi sembra be commentato, la struttura del ritorno è un JSON che ha due attributi: status = {true, controllo passato, o false, controllo non passato} e reason che, in caso di fallimento, indica il motivo. Ho messo come minimo numero di caratteri per l'username 6, ma è possibile modificarlo a piacimento (riga 8 dopo <?php )

    Per il front end (la parte in visione dell'Utente) è necessario modificare il foglio di stile CSS dell'elemento div#Result:
    Codice PHP:
    #Result{
        
    width16px;
        
    height16px;
        
    float:right;
        
    backgroundtransparent url(../img/loading.gifno-repeat;
        
    margin-right100px;
        
    displaynone;
    }

    #Result.checked{
        
    background#4CC417;
    }
    #Result.failed{
        
    background#E42217;

    Infine, ecco la parte del file functions.form.js che va a chiamare con AJAX il file actor.check.php:
    Codice PHP:
    var action_username 'ajax-scripts/actor.check.php';
    var 
    callUsername;

    /**
     * Al caricamento della pagina devo istanziare l'oggetto Requesto.JSON che va ad interrogare il file actor.check.php.
     * Poi aggiungo l'evento onKeyUp sull'input text che conterrà l'username
     */
    window.addEvent('load', function(){
        
    callUsername = new Request.JSON({
            
    urlaction_username,
            
    onComplete : function(obj){
                
    evalUsername(obj);
            }
        });
       
        
    /**
         * Nell'evento non farò altro che mostrare il div result, che contiene l'immagine del loading, rimuovendo le
         * altre classi che possono essere state aggiunte, e poi chiami l'oggetto Request.JSON che fa la chiamata AJAX.
         */
        
    $('username').addEvent('keyup', function(){
            $(
    'Result').setStyle('display''block');
            $(
    'Result').removeClass('failed');
            $(
    'Result').removeClass('checked');
            
    callUsername.cancel();
            
    callUsername.get({'username' this.getProperty('value')});
        })
    })

     
    /**
      * Questa è la funzione che viene chiamata al termine della richiesta AJAX, questa funzione, controlla lo status dell'oggetto,
      * poi, a seconda che il controllo sia riuscito o meno, setta la classe che visualizza uno sfondo verde (se il controllo è positivo)
      *  o rosso se il controllo è negativo. Inoltre, se il controllo è negativo, inserisce come title del div#Result la reason della richiesta.
      * @param {Object} ret: l'oggetto JSON che la chiamata ajax ottiene
      */
     
    function evalUsername(ret){
         var 
    result ret.status;
        if(
    result)
        {
            $(
    'Result').addClass('checked');
            $(
    'Result').removeClass('failed');
            $(
    'Result').removeProperty('title');
        }
        else
        {
            $(
    'Result').removeClass('checked');
            $(
    'Result').addClass('failed');
            $(
    'Result').setProperty('title'ret.reason);
        }
     } 
    Il codice è ben commentato. Unica nota, ho usato l'eveto dell'input#username (la notazione elem#qq sta ad indicare <elem id="qq">), in modo che, nel momento in cui ho inserito un carattere e tolgo il dito dal tasto, viene eseguita la funzione che, dopo aver impostato lo sfondo del loading, esegue la funzione. Proprio per questo, ho messo quell'istruzione callUsername.cancel(): potrebbe, per la lentezza della connessione, esserci ancora una richiesta pendente dal tasto precedentemente premuto e, persino, essere valutata dopo quella successiva. Per questo, devo cancellare la richiesta precedente, se non è stata eseguita, prima di lanciarne una nuova.

    --------
    Questo è quanto necessario per implementare i controlli necessari sul nome utente ed il popolamento dei campi select.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.