Пользовательская проверка cakephp не отображает сообщение об ошибке во вложенном правиле - PullRequest
0 голосов
/ 07 января 2010

Я делаю пользовательскую проверку, но она не отображает сообщение об ошибке при недействительности. ты знаешь где проблема? Я думаю, что проблема может быть в недействительной функции. Вы знаете, как настроить его для вложенной проверки, как эта?

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 голосов
/ 07 января 2010

Я думаю, что проблема в вашей функции Model :: maxMsgSend. Как написано в пекарне, (http://bakery.cakephp.org/articles/view/using-equalto-validation-to-compare-two-form-fields), для создания собственного правила проверки (они хотят сравнить два поля, но концепции совпадают), они пишут:

Я возвращаю false, если значения не совпадают, и true, если они совпадают.

Проверьте их код для класса Model, примерно на полпути вниз. Короче говоря, вам не нужно вызывать invalidate из пользовательского метода проверки; вы просто возвращаете true, если он проходит проверку, и false, если он не проходит проверку.

0 голосов
/ 07 января 2010

Я думаю, что ваша функция maxMsgSend все еще должна возвращать false, если проверка не пройдена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...