Загрузка записи модели, редактирование и сохранение ее из контроллера - PullRequest
0 голосов
/ 01 ноября 2011

Я пытаюсь изменить статус зарегистрированного пользователя на странице активации пользователя с помощью CakePHP 2.Страница активации содержит хешированную строку, которая находится в этой таблице пользователей:

id    username    email            password                  active    key
1     bill        me@domain.com    4u2iu4hk24(hashed str)    0         2ol3p(hashed str)

Процедура активации работает с URL-адресом, подобным следующему:

http://url.com/users/activate/2ol3pth3i89txc2zd6tg3

Все, что я делаю, это чтобыключ хеширования, найдите зарегистрированного пользователя с этим key, загрузите его, удалите ключ хеширования и измените статус active на 1.Я делаю эту процедуру в этом Controller методе:

public function activate ($code = false) {
    if (!empty ($code)) {
        $this->User->findByActivationKey($code); // magic find instead of $this->User->find('contidions', array('User.activation_key' => $code));
        if (!empty($user)) {
            $this->User->set(array (
                'activation_key' => '0',
                'active' => 1
            ));
            if ($this->User->save()) {
                $this->render('activation_successful');
            } else {
                // here is always where I get with this code
                $this->render('activation_fail');
            }
        } else {
            $this->render('activation_fail');
        }
    }
}

Все идет хорошо, но $this->User->save() не будет работать.

Использование debug($this->User->invalidFields()); вернет эту ошибку:

app/Controller/UsersController.php (line 64)
Array
(
[password] => Array
    (
        [0] => Password must contain <span5</span> chars min and <span>20</span> chars max message.
        [1] => Password must contain <span5</span> chars min and <span>20</span> chars max message.
    )

)

Очевидно, ошибка от Модели, но почему упоминается password?

<?php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
    public $name = 'User';
    var $validate = array (
        'username' => array (
            'MustBeCompiled' => array (
                'rule' => 'notEmpty',
                'message' => 'Error message'
            )
        ), 
        'password' => array (
            'not_empty' => array (
                'rule' => 'notEmpty',
                'message' => 'Password cannot be empty message.'
            ),
            'between' => array (
                'rule' => array ('between', 5, 20),
                'message' => 'Password must contain <span5</span> chars min and <span>20</span> chars max message.'
            )
        ),
        'email' => array (
            'valid_email' => array (
                'rule' => 'email',
                'message' => 'Mail invalid message.'
            ),
            'existing_email' => array (
                'rule' => 'isUnique',
                'message' => 'Mail in use message.'
            )
        )
    );

    function beforeSave ($options = array()) {
        // the way to hash the password
        if (!empty ($this->data[$this->alias]['password'])) {
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
            return true;
        }
    }
}
?>

Может быть, проблема может быть в beforeSave()?Где я не прав?

1 Ответ

0 голосов
/ 02 ноября 2011

Вы не передаете идентификатор модели, и я предполагаю, что у вас есть правила проверки, поэтому запись не будет сохранена. отладка ($ this-> User-> invalidFields ()) после сохранения ().

И все это должно быть сделано в модели, что-то вроде User :: verify ($ code) и генерировать исключение, если пользователь / токен не найден. Помните: крошечные контроллеры, толстые модели. Модели также проще тестировать.

...