4

ユーザーがパスワードを変更できるページを作成しています。それらは2つのフィールドに入力する必要があり、変更される前に両方が一致する必要があります。その後、成功するとプロファイルページにリダイレクトされます。

これまでのところ、次のメソッドを作成しました。

public function changePassword()
{

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

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

            $this->Session->setFlash(__('Your password has been changed!'));
            $this->redirect(array('controller'=>'profiles','action'=>'view','userName'=>$user['User']['username']));
        }
        else
        {
            $this->Session->setFlash(__('Whoops! Something went wrong... try again?'));
        }
    }

}

これは次の形式です。

<?php echo $this->Form->create(); ?>

    <?php echo $this->Form->input('id',array('type'=>'hidden')); ?>

    <?php echo $this->Form->input('password1',array('type'=>'text','label'=>array('text'=>'Enter your new password'))); ?>

    <?php echo $this->Form->input('password2',array('type'=>'text','label'=>array('text'=>'Confirm your new password'))); ?>

    <button type="submit">Save</button>

<?php echo $this->Form->end(); ?>

ご覧のとおり、計画はpassword2に記載されている内容を取得し、セキュリティハッシュを使用してデータベースのパスワードフィールドに保存することです。しかし、何が起こるかというと、代わりに新しいユーザーが作成されますが、データは空白になります...ここで何が間違っているのでしょうか。そして、2つのパスワードフィールドを比較するにはどうすればよいですか...

4

4 に答える 4

1

パブリック関数の回復() {

    if ($this->request->is('post') )
    {
        $this->loadModel('AclManagement.User');
        $passwords = AuthComponent::password($this->data['User']['password']);

        $this->User->query("UPDATE users SET password = '".$passwords."' WHERE password_change = '".$this->request->data['User']['id']."' ");
        $this->Session->setFlash(__('Password Saved Sucessfully'), 'success');
        $this->redirect(array('action' => 'login'));    
    }
    else
    {
        $this->set('resettoken', $_REQUEST['id']);  
    }
}
于 2013-06-01T05:54:01.317 に答える
1

最も可能性の高い問題は、何らかの理由でフォームからコントローラー アクションに戻って ID を失うことです。ID がデータ配列に存在しない場合、cake はエントリを作成する必要があると想定します。

投稿されたデータをデバッグし、欠落していないことを確認するか、保存する前に手動で ID を割り当ててください。

$this->request->data['User']['id'] = $this->Session->read('Auth.User.id');

PS: メソッドを見ると、$user データがコントローラーから渡されないため、非表示の「id」フィールドは常に空のままです。

于 2012-04-29T16:57:38.693 に答える
0

フォームでアクション edit を指定するべきではありませんか?

    echo $this->Form->create('User', array('action' => 'edit'));
于 2012-11-29T18:59:55.490 に答える
0
$this->request->data['User']['password2'] = AuthComponent::password($this->request->data['User']['password2']);

$this->User->save($this->request->data);

フォームが認証ユーザーで送信されると、リクエストデータでid実行するsave()と、ケーキはidフィールドのために作成するのではなく、単にレコードを更新します(テーブルにこれに対してレコードが存在する場合id)。password2上記のコードは、リクエスト データ内のハッシュ パスワードで を更新するだけです。

于 2012-04-30T08:14:19.683 に答える