Raccourcis : Contenu - rubriques - sous rubriques
EN FR

Pour inclure un captcha dans un formulaire jForms, vous devez utiliser la balise <captcha>.


 <captcha ref="antispam">
    <label>Vérification anti-spam</label>
 </captcha>

Choisir le type de captcha

Il existe plusieurs solutions de captcha sur le web. Jelix en propose deux mais vous pouvez en créer d'autres si vous implémentez un plugin pour jForms, que l'on appelerait un validateur.

Pour indiquer le validateur qu'il faut utiliser, vous devez indiquer le nom de ce type :

  • soit dans un attribut validator sur la balise <captcha> pour configuer un captcha spécifique
  • soit dans une option captcha de la section [forms] de la configuration de jelix, si vous souhaitez que tous les captchas de votre site aient soit du type en question

 <captcha ref="antispam" validator="simple">
    <label>Vérification anti-spam</label>
 </captcha>

ou


[forms]
captcha=simple

Pour le moment, seuls deux types de captcha sont fournis: "simple" et "recaptcha".

captcha Simple

Il affiche un simple champs texte dans lequel il faut indiquer la réponse à une question posée, affichée automatiquement par jForms.

Les questions posées et leurs réponses sont stockées dans un fichier de locales, dans le module jelix. Exemple pour le français : lib/jelix/core-modules/jelix/locales/fr_FR/captcha.UTF-8.properties. Ce fichier contient une première locale, number, qui indique le nombre de questions, et ensuite les questions et réponses numérotées. Vous pouvez redéfinir ce fichier pour ajouter ou modifier les questions et réponses. Voir le chapitre sur la redéfinition des fichiers.

Pour l'utiliser :


 <captcha ref="antispam" validator="simple">
    <label>Vérification anti-spam</label>
 </captcha>

ou


[forms]
captcha=simple

ReCatpcha

Ce type de captcha affiche le captcha "ReCaptcha" de Google. Vous devez donc avoir un compte google et y activer Recaptcha. Voir le site de ReCaptcha.

En activant un compte Recaptcha, Google vous fourni une clé et un "secret" (tous deux étant une suite de chiffres et de lettres).

Il faut les renseigner dans la section [recaptcha] de la configuration de jelix :


[recaptcha]
; sitekey and secret should be set only into localconfig.ini.php!
sitekey= ici_votre_clé_publique
secret= ici_votre_clé_privée

Attention : comme le "secret" est une information privée, il ne faut pas mettre ces informations dans le fichier mainconfig.ini.php, mais dans localconfig.ini.php, ce dernier n'étant en principe pas enregistré dans votre dépôt de sources (git ou autre).

D'autres paramètres sont possibles, pour configurer ReCaptcha, comme le theme, la taille, le type...


[recaptcha]
; sitekey and secret should be set only into localconfig.ini.php!
sitekey= ici_votre_clé_publique
secret= ici_votre_clé_privée

; see https://developers.google.com/recaptcha/docs/display to know the meaning
; of these configuration parameters.
theme=
type=
size=
tabindex=

Une fois la configuration effectuée, vous pouvez utiliser ReCaptcha, en renseignant l'attribut validator ou en le spécifiant dans la section [forms]

Pour l'utiliser :


 <captcha ref="antispam" validator="recaptcha">
    <label>Vérification anti-spam</label>
 </captcha>

ou


[forms]
captcha=recaptcha

Configurer un autre type de captcha

Vous pouvez utiliser d'autres types de captcha, mais il vous faut alors développer deux choses :

  # un widget pour jForms, pour afficher le captcha
  # une classe pour valider, coté serveur, ce qu'a saisi l'utilisateur

La première chose à faire est de choisir un nom pour le type de validateur. Prenons par exemple "moncap".

Créér le widget

Créer un widget dans plugins/formwidget/moncap_html/moncap_html.formwidget.php.

Dans la classe du widget, vous implémenterez :

  • la méthode outputMetaContent() pour faire charger les ressources JS et CSS nécessaire à l'affichage du captcha.
  • la méthode outputJs() pour générer en ligne un éventuel code JS qui initialisera le captcha
  • la méthode outputControl() pour générer le HTML

Voir comme exemple ceux pour simple et recaptcha.

Créer la classe de validation

Vous devez créer une classe dans un de vos modules, par exemple \MyApp\MonCapValidator.

Notez qu'elle doit être auto-chargeable (voir la doc sur module.xml).

Elle doit implémenter l'interface jelix\forms\Captcha\CaptchaValidatorInterface, et donc deux méthodes :

  • initOnDisplay(): méthode qui sera appelé lors de l'affichage du widget, si vous faites un $this->ctrl->initCaptcha() dans outputControl() du widget. Cette méthode peut renvoyer des données si le widget en a besoin pour l'affichage. Ces données sont stockées dans le cache des données du formulaire.
  • validate($value, $internalData), qui sera appelé par jForms pour valider la réponse de l'utilisateur. $value est la valeur saisie par l'utilisateur (ou généré par le captcha lors du submit), et $internalData sont les données qui avaient été renvoyé par initOnDisplay().

Voir pour exemple le validateur pour "simple" et le validateur pour recaptcha.

Déclarer le nouveau type de captcha

Une fois les classes créés, il faut les déclarer dans la configuration, via deux paramètres dans la section [forms] :

  • captcha.<typecaptcha>.validator pour y indiquer la classe de validation
  • captcha.<typecaptcha>.widgettype pour y indiquer le nom du widget (sans le "_html")

Pour notre exemple du dessus, cela donnera :


captcha.moncap.validator = "\MyApp\MonCapValidator"
captcha.moncap.widgettype = moncap

Enfin, vous pouvez utiliser votre captcha dans vos formulaires :


 <captcha ref="antispam" validator="moncap">
    <label>Vérification anti-spam</label>
 </captcha>

ou


[forms]
captcha=moncap