1

我查看了各种方法,以及关于这个主题的各种问题,但没有运气。在我的例子中,控制器代码“出现”工作,并且消息闪烁“您的更改已保存”,但密码数据库字段未更改。有什么我想念的吗?

控制器代码

public function changepass($id = null) {
    $this->layout = 'profile_page';
    //$this->request->data['User']['id'] = $this->Session->read('Auth.User.id');

    $user = $this->User->find('first', array( 
        'conditions' => array('User.id' => $this->Auth->user('id'))
    ));     // 'User.id' => $id
    $this->set('user',$user);


    if ($this->request->is('post') || $this->request->is('put'))
    {   
        $this->User->saveField('password', AuthComponent::password($this->request->data['User']['newpass']));
        // $this->User->saveField('password', $this->data['User']['password']);
        // $this->data['User']['password']= $this->request->data['User']['newpass'];

        if ($this->User->save($this->request->data))
        {   
            $this->Session->setFlash(__('Your password has been changed!'));
            $this->redirect(array('controller'=>'articles','action'=>'index'));
        }
        else
        {
            $this->Session->setFlash(__('Whoops! Something went wrong... try again?'));
            $this->redirect(array('controller'=>'users','action'=>'changepass'));
        }
    }
    $this->request->data = $this->User->read(null, $id);
    unset($this->request->data['User']['password']); // tried commenting out
}

模型

public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
        if (isset($this->data[$this->alias]['newpass'])) {
            $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['newpass']);
        }
    }
    return true;
}

当然后来我会检查现有的密码,并确认新的密码检查,但我需要让现有的密码更新基本方法正常工作。

非常感谢您对此有所了解,

我想我已经猜到了。首先,我的主要问题是——在我看来,我会把 echo $this->Form->create('User', array('action' => 'edit')); -- 当然将操作更改为“changepass”

新控制器代码:

    public function changepass ($id = null) {
    $this->layout = 'profile_page';
    $this->User->id = $id;
    if (!$this->User->exists()) {
        throw new NotFoundException(__('Invalid user'));
    }
            //debug($this->request->data);

    if ($this->request->is('post') || $this->request->is('put')) {
        $this->data['User']['password']= $this->request->data['User']['newpass'];
        if ($this->User->save($this->request->data)) {
            $this->Session->setFlash(__('Your password changes have been saved'));
             $this->redirect(array('controller' => 'articles', 'action' => 'index'));
        } else {
            $this->Session->setFlash(__('The profile could not be saved. Please, try again.'));
         }
    } else {
                if ($this->Auth->user('id')!= $id) {
        $this->Session->setFlash('You are not allowed that operation!');
        $this->redirect(array('controller' => 'articles', 'action' => 'index'));
        }

        $this->request->data = $this->User->read(null, $id);  
        debug($this->request->data);
        unset($this->request->data['User']['password']);
    }
}

模型 - 根据 eboletaire 的建议整理

    public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']); 
    }
    if (isset($this->data[$this->alias]['newpass'])) {
        $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['newpass']);
    }

return true;
}  
4

2 回答 2

3
if ($this->request->is('post') || $this->request->is('put')) {
    $this->data['User']['password']= $this->request->data['User']['newpass'];
    if ($this->User->save($this->request->data)) {

应该

if ($this->request->is('post') || $this->request->is('put')) {
    $this->data['User']['id'] = $id;
    $this->data['User']['password']= $this->request->data['User']['newpass'];
    if ($this->User->save($this->data)) {

注意$this->datavs $this->request->data

于 2012-11-29T23:17:26.070 回答
1

首先,您要保存两次密码。删除/评论这一行:

$this->User->saveField('password', AuthComponent::password($this->request->data['User']['newpass']));

无论如何,我认为问题出在你的模型上。查看您的 beforeSave 方法。为什么要先用字段密码设置密码,然后再用字段 newpass 设置密码???

PD。清理你的代码我还看到第二个 if 应该在第一个之外。

于 2012-11-29T19:28:37.353 回答