J'ai mis en place une solution de Captcha pour le formulaire d'enregistrement de Virtuemart sous Joomla mais j'ai rencontré quelques problèmes quant à l'implémentation de cette solution.

Virtuemart est une solution d'e-commerce pour Joomla. De base, Joomla dispose d'un formulaire d'enregistrement assez basique. Dans le cadre de la mise en place d'une solution de vente en ligne, il convient de disposer d'un formulaire d'enregistrement un peu plus étoffé notamment pour gérer les transactions d'achat. Virtuemart propose donc une solution pour ajouter des champs au formulaire d'enregistrement.

En natif, Virtuemart ne propose pas de captcha pour protéger le formulaire d'enregistrement. Il faut glaner des informations à gauche, à droite pour s'en sortir. De toutes les manières, il faut "hacker" le code du composant Virtuemart. Le danger de changer le code de Virtuemart est de se couper des futures mises à jour de sécurité. De toute façon, si vous voulez vraiment personnaliser Virtuemart, il faut "hacker" salement le code. De ce point de vue, il est mal conçu. Il y a une très mauvaise séparation entre la gestion des vues et le code de traitement des données. En gros, pas de modèle MVC ou, du moins, pas partout.

J'en reviens au sujet initial, le Captcha. Une fois que vous aurez trouvé une bonne solution de Captcha, il reste un problème. Si vous rentrez un mauvais captcha dans votre formulaire, vous revenez à votre formulaire mais tous les champs ont été vidés! Quelle horreur de devoir retaper tous les champs...Après avoir cherché sur le Net, les forums de Virtuemart et Joomla, je n'ai trouvé aucune solution à ce problème pourtant il semble que ce problème ait été régulièrement relevé. J'ai aussi cherché de mon coté. Je me suis arraché les cheveux dessus en cherchant les contournements les plus complexes et les plus absurdes. Je ne savais plus où donner de la tête jusqu'à une vérification toute bête qui ne m'avait pas effleuré l'esprit, tellement ça me semblait basique. Le formulaire ne proposait pas comme valeur par défaut de ses champs, les valeurs déjà postées. En effet, c'est une des choses les plus basiques qu'on fait en PHP lorsqu'on apprend à utiliser les formulaires : prépremplir les champs d'un formulaire si ceux-ci ont déjà été postés!

Pour ceux qui tomberaient sur le même problème, voici la solution à mettre en place (solution qui peut être améliorée):

Editer le fichier "administrator/components/com_virtuemart/classes/ps_userfield.php".
Vers la ligne 380, chercher le code:

switch( $field->name ) {

Juste au-dessus de cette ligne, ajouter :

$pvalue = '';
if (isset($_POST[$field->name]) && !is_array($_POST[$field->name])) {
   $pvalue = htmlentities($_POST[$field->name]);
}


Je teste si $field->name is un tableau (array) parce que certains champs comme les dropdown lists renvoient un tableau comme valeur.
Vers la ligne 430, chercher le code suivant:

case 'text':
case 'emailaddress':
case 'webaddress':
   $maxlength = $field->maxlength ? 'maxlength="'.$field->maxlength.'"' : '';
        echo '<input type="text" id="'.$field->name.'_field" name="'.$field->name.'" size="'.$field->size.'" value="'. ($db->sf($field->name, true, false)?$db->sf($field->name, true, false):'') .'" class="inputbox" '.$maxlength . $readonly . ' />'."\n";
break;

et remplacer la ligne commençant par echo par le code suivant:

echo '<input type="text" id="'.$field->name.'_field" name="'.$field->name.'" size="'.$field->size.'" value="'. ($db->sf($field->name, true, false)?$db->sf($field->name, true, false):$pvalue) .'" class="inputbox" '.$maxlength . $readonly . ' />'."\n";


Voilà! Vos champs Virtuemart ne devraient plus se vider si vous ne rentrez pas le bon code. Ca améliore un peu l'expérience utilisateur !

Dans le cadre de développements spécifiques sur Joomla, je peux vous proposer des adaptations sur les extensions que vous utilisez déjà.