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

まず、パスワードを2回保存します。この行を削除/コメントします:

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

とにかく、問題はあなたのモデルにあると思います。beforeSaveメソッドを確認してください。最初にフィールドパスワードを使用し、次にフィールドnewpassを使用してパスワードを設定するのはなぜですか?

PD。コードをクリーンアップする私はまた、おそらく2番目のコードが最初のコードの外側にあるはずであることも確認しました。

于 2012-11-29T19:28:37.353 に答える