我决定让Yii验证码为背景和前景渲染随机颜色,所以我对actions
中的公共方法SiteController
进行了以下更改,其中验证码将在其中呈现actionContcat
查看。
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',
),
);
}
...
在上面的代码中,我将backColor和foreColor键值作为私有方法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 :(得分:0)
我刚刚发现了这个问题。问题是setRandColor
方法返回值的类型。该方法返回字符串值,而验证码数组则需要十六进制值。
我通过修改setRandColor
的最后一行来解决这个问题,它返回的值如下:
return $color/1;
通过这种方式,我将字符串中的类型转换为数字。