Par défaut, Yii2 captcha ne comporte pas de lien/bouton « refresh » permettant de rafraîchir les images captcha. De même, lorsque l’on recharge la page de l’image captcha, celle-ci reste inchangée. Cela peut être frustrant car les images captcha sont souvent illisibles (même pour les humains).
Dans ce tutoriel, nous allons apprendre à créer un lien/bouton pour « refresh » les images captcha et également rafraîchir les images captcha à chaque fois qu’ils rechargent la page.
1. Créer CaptchaRefreshable
La première étape consiste à créer une classe CaptchaRefreshable dans le répertoire models ou commons\models si vous utilisez le modèle avancé yii2.
<?php namespace common\models; class CaptchaRefreshable extends \yii\captcha\Captcha { /** * Overrides the $template HTML */ public function init() { $refresh_a = \yii\helpers\Html::a('refresh', '#', [ 'id' => 'refresh-captcha', 'class' => 'text-small' // .text-small { font-size: 0.85em; } - include in your CSS ]); $this->template = ' <div id="verify-code" class="row"> <div class="large-3 columns">{image} ' . $refresh_a . '</div> <div class="large-6 columns">{input}</div> </div>'; parent::init(); } /** * Register the refresh JS */ public function registerClientScript() { $view = $this->getView(); $view->registerJs(" $('#refresh-captcha').on('click', function(e){ e.preventDefault(); $('#verify-code img').yiiCaptcha('refresh'); }) "); parent::registerClientScript(); } }
2. Créer CaptchaRefreshableAction
Ensuite, nous créons une classe CaptchaRefreshableAction dans le répertoire models ou commonsmodels si vous utilisez le modèle avancé yii2.
<?php namespace common\models; use Yii; class CaptchaRefreshableAction extends \yii\captcha\CaptchaAction { public function validate($input, $caseSensitive) { // Skip validation on AJAX requests, as it expires the captcha. if (Yii::$app->request->isAjax) { return true; } return parent::validate($input, $caseSensitive); } }
Autres articles intéressants
3. Ajouter des widgets à views/site/login.php
............. ............. <div class="site-login"> ............. ............. <div class="row"> <div class="col-lg-5"> <?php $form = ActiveForm::begin(['id' => 'login-form']); ?> ............. ............. <?= $form->field($model, 'verifyCode')->widget(\common\models\CaptchaRefreshable::class) ?> ............. ............. <?php ActiveForm::end(); ?> </div> </div> </div>
4. Ajouter une action au contrôleur/SiteController.php
............. ............. class SiteController extends Controller { ............. ............. public function actions() { return [ ............. ............. 'captcha' = > [ 'class' => 'common\models\CaptchaRefreshableAction', ], ............. ............. ]; } ............. ............. }
5. Ajouter une action pour rafraîchir le captcha lors du rechargement de la page
Dans les étapes 1 à 4 ci-dessus, nous avons créé un bouton/lien pour rafraîchir l’image captcha. Le problème est que lors du rechargement de la page, l’image captcha affichée ne change pas. Pour que l’image captcha change à chaque rechargement de la page, nous devons ajouter un script à la fonction de connexion dans le contrôleur / SiteController.php.
............. ............. class SiteController extends Controller { ............. ............. public function actionLogin() { $this->createAction('captcha')->getVerifyCode(true); ............. ............. } ............. ............. }