无法使Yii Model自定义规则起作用

时间:2014-05-24 20:02:45

标签: php yii

在我正在处理的表单中,我有我想要验证的规则集。 费率应该是一个浮点数。 价格应为包含,.

的数字

这是我到目前为止所拥有的

public function rules()
{
    array('rate','type', 'type'=>'float', 'on' => 'loan-calculator'),

    // EPriceValidator is a custom validation class
    array('price', 'site.common.components.validate.EPriceValidator'),
}

site.common.components.validate.EPriceValidator 我有这个

class EPriceValidator extends CRegularExpressionValidator
{
        public $pattern = '/[^0-9,.]/';
}

当我改变

array('price', 'site.common.components.validate.EPriceValidator'),

array('price', 'match', 'not' => true, 'pattern' => '/[^0-9,.]/'),

在动态验证时效果很好。但我宁愿把它放到一个班级,这样我就可以通过我的网站重复使用它。

array('rate','type', 'type'=>'float', 'on' => 'loan-calculator'),
另一方面,上面的代码根本不起作用。知道如何解决这两个问题吗?或者我做错了什么?感谢

1 个答案:

答案 0 :(得分:1)

尝试这样的事情

class EPriceValidator extends CValidator
{

    //Regular Expressions for numbers
    private $pattern = '/[^0-9,.]/';

     //Default error messages 
     private $err_msg = '{attribute} is an invalid.';

    /**
     * Validates the attribute of the object.
     * If there is any error, the error message is added to the object.
     * @param CModel $object the object being validated
     * @param string $attribute the attribute being validated
     */
    protected function validateAttribute($object,$attribute)
    {
        $pattern = $this->pattern;

        // extract the attribute value from it's model object
        $value = $object->$attribute;

        if(!preg_match($pattern, $value))
        {
            $this->addError($object, $attribute, $this->err_msg);
        }
    }

    /**
     * Implementing Client Validation
     *
     * Returns the JavaScript needed for performing client-side validation.
     * @param CModel $object the data object being validated
     * @param string $attribute the name of the attribute to be validated.
     * @return string the client-side validation script.
     * @see CActiveForm::enableClientValidation
     */
    public function clientValidateAttribute($object,$attribute)
    {

        // check the strength parameter used in the validation rule of our model
        $pattern = $this->pattern; 

        //replace {attribute} with correct label
        $params['{attribute}']=$object->getAttributeLabel($attribute);
        $error_message = strtr($this->err_msg,$params);

        return "
        if(value.match(".$pattern.")) {
            messages.push(".CJSON::encode($error_message).");
        }
        ";
    }
}

validateAttribute()函数会覆盖用于服务器端验证的CValidator类函数。并且clientValidateAttribute()函数会覆盖用于客户端验证的CValidator类函数。

了解更多信息read this