Yii Captcha Action随机改变颜色

时间:2014-03-12 22:27:28

标签: php arrays yii

我决定让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应用程序中不起作用?

1 个答案:

答案 0 :(得分:0)

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

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

return $color/1;

通过这种方式,我将字符串中的类型转换为数字。