Section: Captcha
^ Créer un fichier jforms 1.1 | Éditeur HTML » |
− Table des matières
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
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()
dansoutputControl()
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é parinitOnDisplay()
.
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 validationcaptcha.<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