3.3 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			3.3 KiB
		
	
	
	
	
	
	
	
How to Add Captcha Widget
In order to add the Yii 2 captcha widget you need to:
- Override the Form class you wish to add the captcha rule to
- Override the view where the form is rendering
- Add captcha action to a controller
- Configure Module and Application
Override the Form
For the sake of the example, we are going to override the Da\User\Form\RecoveryForm class:
namespace app\forms;
class RecoveryForm extends Da\User\Form\RecoveryForm {
    
    public $captcha;
    
    public function rules() {
    
        $rules = parent::rules();
        
        $rules[] = ['captcha', 'required'];
        $rules[] = ['captcha', 'captcha'];
        
        return $rules;
    }
}
Overriding the View
Create a new file and name it request.php and add it in @app/views/user/recovery. Add the captcha widget to it:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\captcha\Captcha;
/**
 * @var yii\web\View $this
 * @var yii\widgets\ActiveForm $form
 * @var \Da\User\Form\RecoveryForm $model
 */
$this->title = Yii::t('usuario', 'Recover your password');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="row">
    <div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title"><?= Html::encode($this->title) ?></h3>
            </div>
            <div class="panel-body">
                <?php $form = ActiveForm::begin(
                    [
                        'id' => $model->formName(),
                        'enableAjaxValidation' => true,
                        'enableClientValidation' => false,
                    ]
                ); ?>
                <?= $form->field($model, 'email')->textInput(['autofocus' => true]) ?>
                
                <?= $form->field($model, 'captcha')
                    ->widget(Captcha::className(), ['captchaAction' => ['/site/captcha']]) ?>
                <?= Html::submitButton(Yii::t('usuario', 'Continue'), ['class' => 'btn btn-primary btn-block']) ?><br>
                <?php ActiveForm::end(); ?>
            </div>
        </div>
    </div>
</div>
Add Captcha Action to a Controller
namespace app\controllers;
class RecoveryController extends \yii\web\Controller
{
    // ...
    
    public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
        ];
    }
    
    // ...
}
Configure Module and Application
Finally, we have to configure the module and the application to ensure is using our form and our view:
// ... 
'modules' => [
    'user' => [
        'class' => Da\User\Module::class,
        'classMap' => [
            'RecoveryForm' => 'app\forms\RecoveryForm'
        ], 
        'controllerMap' => [
            'recovery' => [
                 'class' => '\app\controllers\RecoveryController' 
             ]
        ]
    ]
], 
// ...
'components' => [
    'view' => [
        'theme' => [
            'pathMap' => [
                '@Da/User/resources/views' => '@app/views/user'
            ]
        ]
    ]
]
© 2amigos 2013-2017