PDA

View Full Version : captcha



under22
دوشنبه 05 اسفند 1392, 13:18 عصر
میخاستم بدونم برای اضافه کردن captcha به فرمم باید چه کدی را به کنترلر و ویو مورد نظر اضافه کنم ؟

MMSHFE
دوشنبه 05 اسفند 1392, 15:02 عصر
با یک مثال توضیح میدم. فرض کنید میخواین به فرم اشتراک در خبرنامه (با ایمیل)، CAPTCHA اضافه کنید. فرضاً یک EmailModel دارین (models/EmailModel.php) به این شکل:


<?php
class EmailForm extends CFormModel
{
public $email;
function rules() {
return array(
array('email', 'email'),
);
}
}

و یک کنترلر EmailController هم هست (controllers/EmailController.php) با کد زیر:


<?php
class EmailController extends Controller
{
public function actionIndex()
{
$success = false;
$model = new EmailForm();
if(!empty($_POST['EmailForm']))
{
$model->setAttributes($_POST['EmailForm']);
if($model->validate())
{
$success = true;
// handle form here
}
}
$this->render('index', array(
'model' => $model,
'success' => $success,
));
}
}

و نهایتاً یک ویو index هم دارین (views/email/index.php) با این کد:


<?php if($success) : ?>
<p>Success!</p>
<?php endif; ?>
<?php echo CHtml::beginForm(); ?>
<p>
<?php echo CHtml::activeLabel($model, 'email'); ?>
<?php echo CHtml::activeTextField($model, 'email'); ?>
<?php echo CHtml::error($model, 'email'); ?>
</p>
<p>
<?php echo CHtml::submitButton(); ?>
</p>
<?php echo CHtml::endForm(); ?>

حالا به این مدل میخوایم یک CAPTCHA اضافه کنیم.
اول باید یک فیلد برای اعتبارسنجی CAPTCHA به مدل اضافه کنیم (همراه با Rule مناسب) :


<?php
class EmailForm extends CFormModel
{
public $verifyCode;
public $email;
function rules(){
return array(
array('email', 'email'),
array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()),
);
}
}

حالا یک متد دیگه به کنترلر باید اضافه کنید که مشخصه کننده کلاسی هست که CAPTCHA رو مدیریت میکنه:


public function actions()
{
return array(
'captcha'=>array('class'=>'CCaptchaAction'),
);
}

حالا این کد رو به ویو index بعد از قسمتی که کادر متن مربوط به ورود Email هست، اضافه کنید:


<?php if(CCaptcha::checkRequirements()&& Yii::app()->user->isGuest) : ?>
<p>
<?php echo CHtml::activeLabelEx($model, 'verifyCode'); ?>
<?php $this->widget('CCaptcha'); ?>
</p>
<p>
<?php echo CHtml::activeTextField($model, 'verifyCode'); ?>
<?php echo CHtml::error($model, 'verifyCode'); ?>
</p>
<?php endif; ?>

الآن CAPTCHA به فرم شما اضافه شده. فقط دقت کنید که اگه از accessControl توی فیلترها برای دسترسی به اکشن موردنظرتون استفاده کردین، حتماً دسترسی به CAPTCHA رو برای کاربر موردنظر در متد accessRules فراهم کنید:


public function accessRules() {
return array(
// …
array('allow',
'actions'=>array('captcha'),
'users'=>array('*'),
),
array('deny',
'users'=>array('*'),
),
);
}

برای مطالعه بیشتر:
http://www.yiiframework.com/doc/api/CCaptcha
http://www.yiiframework.com/doc/api/CCaptchaAction
http://www.yiiframework.com/doc/api/CCaptchaValidator
منبع: کتاب Yii 1.1 Application Development Cookbook فصل چهارم قسمت Adding CAPTCHA (صفحه 110)