Parce qu'a force d'avoir des tests à effectuer en live sur vos pages avec prototype, vous avez surement créé un "RequestHandler(.php)", je veux dire par là : un fichier spécialement fait pour traiter les requetes Ajax.
La situation
Sur ce fichier donc, vous envoyez les tests avec Ajax.Request par exemple, vous obtennez le résultat, vous avisez en fonction du résultat retourné de votre fonction onSuccess:
Le problème
Le mieux serait de donner un exemple :
Vous avez un formulaire, qui vérifie onBlur sur le champ pseudo que le pseudo tapé n'existe pas dans la base de donnée. On appelle donc Ajax.Request('/RequestHandler.php', method: 'post', postBody: action=verifPseudo&pseudo=pseudo.value); plus un callback onSuccess: par exemple, qui avertira l'internaute par innerHTML qu'il y a un soucis.
Jusqu'ici pas de soucis, l'user peut ignorer le message, notre bon PHP vérifiera encore à la validation. Et c'est bien là que ça commence à devenir ennuyeux :
pourquoi retaper le code PHP qui vérifie l'existence du pseudo dans la bdd ?
Dans notre cas, ça n'est pas important vu que le code tiens tranquillement sur une ligne, mais dans d'autres cas, serait-ce vraiment justifié de faire ainsi ?
La solution (j'ai pas trouvé mieux en tous cas)
L'idée serait donc de faire comme Ajax.Request (et Ajax.Updater), et d'envoyer la requete en post (ou get) à notre RequestHandler. Évidemment on en fera une fonction, vu que le code correspondant en php est (un peu) long :
<?php
function sendData($url, $method, $data){
$pUrl = parse_url($url);
$port = ($pUrl['port']) ? $pUrl['port'] : 80;
$sock = fsockopen($pUrl['scheme'].$pUrl['host'], $port, $errno, $errstr, 10);
if(!$sock)
die("$errstr ($errno)\n");
fwrite($sock, strtoupper($method)." ".$pUrl['path']." HTTP/1.0\r\n");
fwrite($sock, "Host: ".$pUrl['host']."\r\n");
fwrite($sock, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($sock, "Content-length: ".strlen($data)."\r\n");
fwrite($sock, "Accept: */*\r\n");
fwrite($sock, "\r\n");
fwrite($sock, $data."\r\n");
fwrite($sock, "\r\n");
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";
while (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
return $body;
}
?>
- $url devrait être exprimé comme ceci : unmei.domtomconnection.com/headers/RequestHandler.php
- Le format de $data est le suivant 'variable1='.urlencode($_POST['variable1']).'&var2='.urlencode($_GET['var2'])
- N'oubliez pas que si vous faites une requête sur un serveur sécurisé, le port n'est plus 80 mais 443
- Dans ce cas, on utilise un timeout de 10s pour la connexion
- Le mieux serait de faire disparaitre le paramètre $url et le rendre interne à la fonction (ou utiliser une var globale valable pour cette fonction et les requests Ajax)
Donc vous faites une requete sur votre RequestHandler.php comme vous l'avez fait avec Ajax, et vous faites ce qu'il y a à faire en fonction du résultat.
(comment ça "inutile" ??)