Validazione remota tramite plugin (jquery validate)

MarcoGrazia

Utente Attivo
15 Dic 2009
822
19
18
60
Udine
www.stilisticamente.com
Salve a tutti scrivo questo snippet anche se più che altro sarà un vademecum per tutti coloro che si sono sbattuti sia sulla scarna documentazione ufficiale, che sulla pochezza degli esempi.

Prima di tutti vediamo di cosa parliamo: validare un form è spesso cosa ostica, specialmente se pieno di campi di qualsiasi tipo.
In questi giorni sto costruendo una pagina con un forma altamente complesso, che prevede pure la presenza di un CAPTCHA.
Per rendere il tutto più organico e semplice mi sono avvalso di un plugin di jquery abbastanza conosciuto, ma purtroppo non molto documentato.

Avevo bisogno di un sistema che rispondesse in remoto e quindi mi sono avvalso del metodo remote di questo plugin:

Ora nella documentazione online si legge: (tradotta dall'inglese)
opzioni
Tipo: oggetto
Per l'URL della risorsa da richiedere per la convalida lato server (String) o le opzioni per personalizzare completamente la richiesta, vedere jQuery.ajaxper i dettagli.

Queste opzioni estendono in profondità le impostazioni predefinite ( dataType:"json", data:{nameOfTheElement:valueOfTheElement}). Qualsiasi opzione fornita sovrascriverà le impostazioni predefinite.


La risorsa lato server viene chiamata tramite jQuery.ajax (XMLHttpRequest) e ottiene una coppia chiave/valore corrispondente al nome dell'elemento convalidato e al suo valore come parametro GET. La risposta serverside deve essere una stringa JSON che deve essere "true"per gli elementi validi, e può essere "false", undefined o null per gli elementi non validi, usando il messaggio di errore predefinito. Se la risposta lato server è una stringa, ad es. "Il nome Pietro123 è già presente provane un altro", questa stringa verrà visualizzata come messaggio di errore personalizzato al posto di quello predefinito.
Da cui si comprende che la risposta deve essere: true, per passare il test, oppure false, null, undefined per una risposta negativa che non passa il test, o anche una frase di testo che verrà riportata come promemoria con il test fallito.

Tutto bene? Non proprio e qui cominciano i guai, perché non c'è un esempio di come deve essere mandata la risposta, sì c'è scritto in formato JSON, ma codificata come?
Ci sono due esempi lato client, ma non ci sono di molto aiuto.

Ho cercato in rete e alla fine la risposta è venuta sia dal blog di jquery, sia dal sito di un altro blogger che faceva degli esempi lato server. Ed è presto detto!

La risposta deve sì essere codificata in json, ma in modo strano se vogliamo, io dopo tante prove ho risolto così:
PHP:
// ometto il codice di verifica e controllo e inserisco solo ciò che importa per rispondere.
if ($risposta === true) echo json_encode(true);
else echo json_encode('Risposta sbagliata, ritenta!');
Come si vede il formato è particolare e la risposta all'analizzatore del browser appare proprio così:
"The answer is wrong, please try again."
Come una stringa, con tanto di virgolette, anche se generata come json, e solo così funziona.

Un poco di codice non guasta mai a questo punto.

Lato client:
JavaScript:
$('#form').validate({
  onkeyup: false, 
  rules: {
    captcha: {
      url: 'verifica.php',
      data: {
        captcha: function(){ return $('#captcha').val()}, 
        lingua: 'it'
      },
      type: 'post',
      dataType: 'json'
  }
});
menzione a parte merita la funzione onkeyup: false che impedisce di fare una chiamata ajax ogni volta che si digita un tasto, la chiamata avverrà solo quando si lascia il campo controllato. Questo eviterà di sovraccaricare il serve con tante chiamate inutili.

In remoto invece il file è questo:
PHP:
$torna = false;  //  se il passo successivo fallisce, la risposta è già impostata a false.
if (filter_has_var(INPUT_POST, 'captcha') && filter_has_var(INPUT_POST, 'lingua')) {
  $risposta = filter_array(INPUT_POST, 'captcha', FILTER_CALLBACK, ['options' => 'Verifica::verificaStringa']);  // Omesso il codice di verifica per facilità, ognuno fa le verifiche che vuole. ;)
  $risposta = Captcha::getRisposta($risposta, $_POST['lingua']);
  if ($risposta === true) $torna = true;
  else $torna = ('Risposta sbagliata, ritenta!';
}
echo json_encode($torna);
Ovviamente il file remoto è semplificato al massimo, non c'è un controllo sulla risposta, sarebbe troppo complesso ed esula da questo discorso, spero solo di essere riuscito ad aiutare qualcuno.
 
Discussioni simili
Autore Titolo Forum Risposte Data
D Form validazione Javascript 2
A Mantenere la validazione reindirizzandoci su un secondo sito WEb. (ASP.NET) ASP.NET 0
E Validazione campi form passati da link Programmazione 0
K Come eliminare attributi regex per validazione con javascript Javascript 0
MarcoGrazia [Javascript] Regex per la validazione di un numero di telefono. Javascript 2
MarcoGrazia Validazione forum con jquery.validate jQuery 2
K [PHP] Validazione email e password PHP 1
Samuele Ronzani [PHP] Validazione e invio campi form. PHP 7
G validazione form con div tipo alert jQuery 0
I Libreria di validazione e sanitizzazione PHP 0
G Validazione indirizzo mail PHP 1
M Validazione documenti HTML5 HTML e CSS 0
asevenx validazione W3C con errore utf-8 HTML e CSS 3
P Campo select e validazione conjs Javascript 0
radioButton Problemi validazione con jQuery validation jQuery 0
novello88 Validazione modulo non funziona Javascript 1
C Css id univoco e validazione w3c HTML e CSS 1
radioButton validazione input tipo radio Javascript 2
H Problema validazione CAPTCHA PHP 20
P problemi di validazione asincronizzazione dati PHP 7
asevenx errore da risolvere per validazione W3C HTML e CSS 3
S Validazione W3C HTML e CSS 1
E Validazione dei caratteri di una stringa con preg_match PHP 0
criric Validazione form php ajax Snippet PHP 4
D Validazione password javascript non fuziona Javascript 7
D Come creare validazione form istantanea?? Javascript 1
N Validazione form e select dinamica Javascript 5
A Problema validazione w3c HTML e CSS 2
A Validazione w3c warnings HTML e CSS 1
S Form PHP e validazione con ritorno di parametro PHP 0
P problema validazione form con ajax e jquery Ajax 0
D Problema nella validazione di un form con JQUERY ed AjAX jQuery 4
A Problema di validazione W3C HTML e CSS 1
JellyBelly Strutturare un database di tipo questionario - gestione della validazione PHP 5
S Validazione xhtml (onload - embed) HTML e CSS 0
M Symfony2 validazione ajax PHP 0
S Validazione css lightbox2 HTML e CSS 4
S Validazione css lightbox2 CMS (Content Management System) 0
S Validazione javascript Javascript 28
C problema link con ul e li e validazione pagina HTML e CSS 6
M Livevalidation: applicare validazione solo se si sceglie una option di una select. Javascript 0
renoir09 wordpress, validazione, segno "&" WordPress 0
renoir09 wordpress e validazione WordPress 6
E Variabile Superglobale $_REQUEST e Validazione Input Forum Utente PHP 1
G problema con plugin validazione form jquery jQuery 0
G validazione w3c del mio sito web HTML e CSS 3
F Validazione w3c con ip NON pubblico HTML e CSS 2
neo996sps Errore validazione su index PHP 2
S Zend_Validate_Regex: Problema validazione PHP 7
SolidSnake4 Errore validazione feed rss Apache 6

Discussioni simili