cakephp自定义验证不会在嵌套规则中显示错误消息

时间:2010-01-07 04:55:27

标签: validation cakephp models

我正在进行自定义验证,但在无效时不会显示错误消息。 你知道问题出在哪里吗?我认为问题可能在invalidate函数中。你知道如何设置像这样的嵌套验证吗?

var $validate = array(
    'receiver' => array(
        'maxMsg' => array(
            'rule' => array('maxMsgSend'),
            //'message' => ''
            ),
        'notEmpty' => array(
            'rule' => array('notEmpty'),
            'message' => 'field must not be left empty'
            ))......

模型中的自定义验证方法:

    function maxMsgSend ( $data )
    {   
        $id = User::$auth['User']['id'];

        $count_contacts = (int)$this->Contact->find( 'count', array( 'conditions' =>array( 'and' =>array(   'Contact.contact_status_id' => '2',
                                                            'Contact.user_id' => $id)))); 

        $current_credit = (int)$this->field( '3_credit_counter', array( 'id' => $id));
        $max_allowed_messages = ($count_contacts >= $current_credit)? $current_credit: $count_contacts ; 


        if ($data>$max_allowed_messages)
        {
        $this->invalidate('maxMsg', "you can send maximum of {$max_allowed_messages} text messages.");
        }
    }

更新:如何解决它。 我将函数的内容移动到模型中的beforeValidate()。

function beforeValidate($data) {
    if (isset($this->data['User']['receiver'])) 
    {
            $id = User::$auth['User']['id'];

            $count_contacts = (int)$this->Contact->find( 'count', array( 'conditions' =>array( 'and' =>array(   'Contact.contact_status_id' => '2',
                                                                'Contact.user_id' => $id)))); 

            $current_credit = (int)$this->field( '3_credit_counter', array( 'id' => $id));
            $max_allowed_messages = ($count_contacts >= $current_credit)? $current_credit: $count_contacts ; 


            if ($data>$max_allowed_messages)
            {
                $this->invalidate('receiver', "you can send maximum of {$max_allowed_messages} text messages.");
                return false;
            }
    }
    return true;
} 

2 个答案:

答案 0 :(得分:0)

我认为如果验证失败,你的maxMsgSend函数仍然需要返回false。

答案 1 :(得分:0)

我认为问题出在你的Model :: maxMsgSend函数中。正如在面包店中写的那样(http://bakery.cakephp.org/articles/view/using-equalto-validation-to-compare-two-form-fields),为了构建自定义验证规则(他们想比较两个字段,但概念是相同的),他们写道:

  

如果值不匹配,则返回false;如果值不匹配,则返回true。

查看Model类的代码,大约一半。简而言之,您不需要在自定义验证方法中调用invalidate;如果它通过验证,你只返回true,如果没有通过验证则返回false。