CakePHP: в любом случае, чтобы сказать, почему Model-> validates () возвращает false? - PullRequest
0 голосов
/ 21 апреля 2011

Если Model-> validates () возвращает false, есть ли простой способ узнать почему?

Я пытаюсь сохранить некоторые данные, но они не сохранятся. Оказывается, это тоже не валидация. Если я отключу проверку, это сохранит. Я должен подтвердить это, хотя, но я не могу сказать, почему это не подтверждает?

Я использовал этот код:

if($this->User->create($user) && !$this->User->validates())
{
    debug($user);
}

Так что, если он не проверяется, он говорит мне, что это за данные.

Распечатывает это:

Array
(
    [User] => Array
        (
            [first_name] => Tim
            [last_name] => Zahn
            [phone] => 8833323235
            [email] => t@z.com
            [password] => ert
        )

    [Confirm] => Array
        (
            [email] => t@z.com
            [password] => ert
        )

)

Похоже, он должен пройти проверку.

Также, если необходимо, я также могу опубликовать свой источник модели.

Обновление:

Вот модель. Я использую многовариантное поведение . Я попытался использовать наборы проверки по умолчанию и зарегистрировать:

class User extends AppModel
{
    var $actsAs = array('Multivalidatable');

    var $hasOne = 'WishList';
    var $hasMany = array(
        'Address' => array(
            'conditions' => array('NOT' => array('Address.deleted' => '1')),
            'order' => array('Address.is_billing DESC')
        )
    );

    var $validate = array(
        'first_name' => array(
            'rule' => 'notEmpty'
        ),
        'last_name' => array(
            'rule' => 'notEmpty'
        ),
        'password' => array(
            'passRule1' => array(
                'rule' => 'notEmpty',
                'message' => 'Please enter a password'
            ),
            'passRule2' => array(
                'rule' => array('identicalFieldValues', 'password'),
                'message' => 'Passwords do not match'
            )
        ),
        'email' => array(
            'emailRule1' => array(
                'rule' => 'email',
                'message' => 'You must specify a valid email address'
            ),
            'emailRule3' => array(
                'rule' => array('identicalFieldValues', 'email'),
                'message' => 'Emails do not match'
            )
        )
    );

    var $validationSets = array(
        'register' => array(
            'first_name' => array(
                'rule' => 'notEmpty'
            ),
            'last_name' => array(
                'rule' => 'notEmpty'
            ),
            'password' => array(
                'passRule1' => array(
                    'rule' => 'notEmpty',
                    'message' => 'Please enter a password'
                ),
                'passRule2' => array(
                    'rule' => array('identicalFieldValues', 'password'),
                    'message' => 'Passwords do not match'
                )
            ),
            'email' => array(
                'emailRule1' => array(
                    'rule' => 'email',
                    'message' => 'You must specify a valid email address'
                ),
                'emailRule2' => array(
                    'rule' => 'isUnique',
                    'message' => 'That email address is already in our system'
                ),
                'emailRule3' => array(
                    'rule' => array('identicalFieldValues', 'email'),
                    'message' => 'Emails do not match'
                )
            )
        ),
        'billing' => array(
            'email' => array(
                'emailRule1' => array(
                    'rule' => 'email',
                    'message' => 'You must specify a valid email address'
                ),
                'emailRule3' => array(
                    'rule' => array('identicalFieldValues', 'email'),
                    'message' => 'Emails do not match'
                )
            )
        )
    );

    public function beforeValidate()
    {
        parent::beforeValidate();

        // if password is empty reset from hash to empty string
        if (isset($this->data['User']['password']) && $this->data['User']['password'] == Security::hash('', null, true)) {
                $this->data['User']['password'] = '';
        }
        return true;
    }

    function identicalFieldValues($field=array(), $compare_field=null)
    {
        foreach ($field as $key => $value)
        {
            $v1 = $value;
            $v2 = $this->data["Confirm"][$compare_field];
            if ($compare_field == 'password' && $v2 != '')
            {
                $v2 = Security::hash($v2, null, true);
            }
            if ($v1 !== $v2)
            {
                return false;
            } 
            else
            {
                continue;
            }
        }
        return true;
    }

}

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Я бы начал с чего-то вроде этого:

if($this->User->create($user) && !$this->User->validates())
{
    debug($user);
    debug($this->User->validationErrors);
}

Это должно точно сказать, какое поле или поля не проходят проверку и почему.

1 голос
/ 22 апреля 2011

У вас есть сообщение, настроенное при проверке, чтобы оно могло сказать вам, где оно терпит неудачу, например:

'password' => array(
  'rule' => array('minLength', '8'),
  'message' => 'Mimimum 8 characters long'
),

Кроме того, если у вас включен режим AUTH, возможно, он шифрует пароль.

Кроме того, вы должны подтвердить, ДО того, как вы попытаетесь создать / сохранить.

...