2014-03-12 75 views
0

我决定让Yii验证码呈现随机颜色作为背景和前景,所以我对公共方法actions进行了以下更改,其中SiteController验证码将在actionContcat视图中呈现。Yii Captcha Action随机更改颜色

class SiteController extends Controller 
{ 
    /** 
    * Declares class-based actions. 
    */ 
    public function actions() 
    { 
     return array(
      // captcha action renders the CAPTCHA image displayed on the contact page 
      'captcha'=>array(
       'class'=>'CCaptchaAction', 
       'backColor'=>$this->setRandColor('DARK'), 
       'foreColor'=>$this->setRandColor('LIGHT'), 
      ), 
      // page action renders "static" pages stored under 'protected/views/site/pages' 
      // They can be accessed via: index.php?r=site/page&view=FileName 
      'page'=>array(
       'class'=>'CViewAction', 
      ), 
     ); 
    } 
... 

在上面的代码我有做背景色和前景色键的值是一个私有方法setRandColor的回报。以下是方法代码:

/** 
    * Generate random hexadecimal color code in format 0xXXXXXX according to type param 
    * which has only two values DARK and LIGHT 
    * @param string $type 
    */ 
    private function setRandColor($type='DARK') 
    { 
     $color = '0x'; 
     $darks = array(0,1,3,4,5,6,7); 
     $lights = array(9,'A','B','C','D','E','F'); 
     if ($type == 'DARK') 
     { 
      $chooseFrom = $darks; 
     } 
     else 
     { 
      $chooseFrom = $lights; 
     }   
     for ($i = 0; $i < 6; $i++) 
     { 
      $color .= $chooseFrom[array_rand($chooseFrom)];   
     } 
     return $color;  
    } 

我已经测试setRandColor单独。即在普通的PHP脚本,我发现它可以很好地返回十六进制代码。看看下面的演示:http://codepad.viper-7.com/OcCSjL

但是,当使用上述代码时,我只是得到一个黑色的验证码图像,没有任何错误消息。我需要知道为什么这个代码在我的Yii应用程序中不起作用?

+0

请提供来自函数$ this-> setRandColor的示例输出 –

回答

0

我刚刚发现了这个问题。问题是从setRandColor方法返回的值的类型。该方法返回字符串值,而captcha数组需要十六进制值。

我通过修改setRandColor最后一行在它如下返回值来解决这个问题:

return $color/1; 

通过这种方式我从铸造字符串类型是数字。