4

ユーザーがアカウントのメールアドレスとパスワードを変更できるページを書いています。コントローラのアクションとビューは次のとおりです。

# UsersController.php
public function edit() {
    if($this->request->is('post')) {
        if($this->User->save($this->request->data)) {
            $this->Session->setFlash('Your account has been updated.');
            $this->redirect(array('action' => 'edit'));
        }

        $this->Session->setFlash('There was a problem saving your account settings. Please try again.');
    }

    // Auto populate form fields
    if(!$this->request->data) {
        $this->request->data = $this->User->find('first', array(
            'conditions' => array('User.id' => $this->Auth->user('id'))
        ));
    }
}

# edit.ctp
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('currentPassword', array('between' => 'You must enter your password in order to make changes', 'type' => 'password', 'value' => '', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('email'); ?>
<?php echo $this->Form->input('password', array('type' => 'password', 'between' => 'Must be atleast 6 characters', 'value' => '', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('confirmPassword', array('type' => 'password', 'value' => '', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->end('Save changes'); ?>

ここで、変更を加えるために、ユーザーに現在のパスワードを入力させたいと思います。これを機能させるには、検証チェックを実行して、入力したパスワードがcurrentPasswordデータベースにあるパスワードと一致することを確認する必要があります。User私のモデルの検証ルールの1つはこれです:

'currentPassword' => array(
    'custom' => array(
        'rule' => 'validateCurrentPassword',
        'message' => 'Incorrect password. Make sure you\'re using your current password.'
    )
),

および呼び出される関連関数:

public function validateCurrentPassword($data) {
    debug($data);
    return false;
}

これまでのところ良いですが、いくつかの本当に奇妙な振る舞いがあります。Cakeは、2ページの読み込み後にのみこのフィールドを検証するようです。たとえば、間違った値を入力して[変更を保存]を押すと、ページが更新されますが、検証エラーは表示されません。別の間違った値を入力すると、検証エラーが発生します。何らかの理由で、検証を行うためにフォームを2回送信する必要があります。

誰かがこれがなぜであるかを理解できますか?

4

2 に答える 2

2

$this->request->is('post')falseフォームを初めて送信するときと、true2回目に送信するときです。ファイルを見ると、コントローラーアクションをベイク処理すると、これがアクションlib/Cake/Console/Templates/default/actions/controller_actions.ctpに使用されるコードであることがわかります。edit

if ($this->request->is('post') || $this->request->is('put')) {

上記のコードを使用すると、最初のフォーム送信が処理されます(が処理されるため$this->request->is('put')true

FormHelperクラスのcreateメソッド(にある)を見lib/Cake/View/Helper/FormHelper.phpて、フォームがPUTと見なされる場合とPOSTと見なされる場合を確認します。

于 2013-02-12T04:53:46.150 に答える
0

ajax呼び出しを使用して、データベースからパスワードを取得できます。ユーザーがパスワードフィールドの横のフィールドに入力したら、jqueryまたはjavascriptでイベントを発生させて、ユーザーが入力したパスワードとajax応答から取得したパスワードが同じであるかどうかを確認します。ただし、ユーザーに正しいパスワードを入力するためのアラートまたはメッセージが表示されない場合は、

于 2013-02-13T15:15:04.757 に答える