Yii Framework 开发教程(20) UI 组件 Captcha示例

jerry Yii 2015年11月24日 收藏

Captcha(全自动区分计算机和人类的图灵测试-Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA)俗称验证码,是一种区分用户是计算机的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

Yii Framework提供了类CCaptcha和CCaptchaAction用于支持验证码,要注意的是这个功能需要有PHP GD扩展支持,可以通过Yii的Requirements应用来查询:

201212126001

如果显示Warning,可以通过安装GD扩展库,并修改PHP.ini打开该功能。

CCaptcha也提供方法CCaptcha::checkRequirements() 来检测GD库是否安装。

通过修改Yii Framework 开发教程(16) UI 组件 StarRating示例 为其添加Captcha功能,只有输入的验证码正确时,用户评分才有效,避免机器自动评分。

首先是修改DataModel,添加一个属性verifyCode 用来存放用户输入的验证码,并给其添加CCaptchaValidator验证。

  1. class DataModel extends CFormModel
  2. {
  3. public $rating;
  4. public $verifyCode;
  5.  
  6. public function rules()
  7. {
  8.  
  9. return array(
  10. array('rating,verifyCode',  'safe'),
  11. array('verifyCode','captcha',
  12. 'allowEmpty'=>!CCaptcha::checkRequirements()),
  13. );
  14.  
  15. }
  16. }

然后修改SiteController,添加actions方法,Captcha组件缺省使用CCaptchaAction,其缺省ID为captcha。

  1. public function actions()
  2. {
  3. return array(
  4. 'captcha'=>array(
  5. 'class' => 'CCaptchaAction',
  6. ));
  7. }

下面就可以在View中添加Captcha组件了:

  1. <div class="form">
  2. <?php $form=$this->beginWidget('CActiveForm'); ?>
  3.  
  4.     <?php echo $form->errorSummary($model); ?>
  5.  
  6.     <?php if(CCaptcha::checkRequirements()): ?>
  7.     <?php $this->widget('CStarRating',array(
  8.      'model'=>$model,
  9.      'attribute'=>'rating',
  10.      'name'=>'rating',
  11.      'value'=>3,
  12.     )); ?>
  13.  
  14.     <p />
  15.    <?php  echo $form->label($model,'verifyCode') ?>
  16.    <p />
  17.    <?php $this->widget('CCaptcha'); ?>
  18.    <p />
  19.    <?php  echo $form->textField($model,'verifyCode') ?>
  20.  
  21.     <div class="row submit">
  22.         <?php echo CHtml::submitButton('Submit'); ?>
  23.     </div>
  24.  <?php endif ?>
  25. <?php $this->endWidget(); ?>
  26. </div><!-- form -->

201212126002.png.jpg

下载地址