1

ユーザー登録のバリデーションを設定したいのですが、うまくいきません。$validation 配列に電子メール、ロール、およびパスワードのフィールドしかない場合(他のフィールドは削除します)、機能し、新しいユーザーが保存されます。他のフィールドを追加しようとすると失敗し、「ユーザーを保存できませんでした。もう一度やり直してください」というエラー メッセージが表示されます。

re_password チェックだと確信しています。その検証を削除すると、機能します。ただし、re_password の検証では、パスワードが異なる場合にエラーが表示されるため、どこを見ればよいかわかりません。

これが私のユーザーテーブルです

id  |  email  |  password  |  location  | website  | role  | created |  modified

検証要件は次のとおりです。新しいユーザーを保存するには、電子メール、パスワード、役割以外をすべて削除する必要があります。

public $validate = array(
    'email' => 'email'
    ,
    'password' => array(
        'required' => array(
            'rule' => array('minLength', '8'),
            'message' => 'A password with a minimum length of 8 characters is required'
        )
    ),
    're_password' => array(
        'required' => array(
            'rule' => array('equalTo', 'password' ), 
            'message' => 'Both password fields must be filled out'
        )
    ),
    'role' => array(
        'valid' => array(
            'rule' => array('inList', array('admin', 'author')),
            'message' => 'Please enter a valid role',
            'allowEmpty' => false
        )
    ),
     'location' => array(
        'valid' => array(
            'rule' => array('notEmpty'),
            'message' => 'Please select a location'
        )
    )
);

フォームは次のとおりです(オプション配列は上にあります。表示する必要はないと考えられます)

    echo $this->Form->input('email');
    echo $this->Form->input('password');
    echo $this->Form->input('re_password', array('type'=>'password', 'label'=>'Re-Enter Password', 'value'=>'', 'autocomplete'=>'off'));
    echo $this->Form->input('location', array('options' => $options, 'label' => 'Select Nearest Location'));
    echo $this->Form->input('website',array('label'=>'Enter your website, such as www.example.com. ')); 
    echo $this->Form->input('role', array('type' => 'hidden', 'default' => 'user'));

User モデルの re_password チェック関数は次のとおりです。

function check_user_password($userid) { 
    $salt = Configure::read('Security.salt');
    $this->User->id = $userid;
    $hashed_password = $this->User->field('password');
    // check password  
    if($hashed_password == md5($data['User']['re_password'].$salt)) {  
        return true;
    } else {
        return false;
    }
}   

最後に、UsersController の add 関数です。

public function add() {  
        if ($this->request->is('post')) {  
            $this->User->create();     //create initiates a form on User/add.ctp
            if ($this->User->save($this->request->data)) {  //save the form data
                $this->Session->setFlash(__('The user has been saved'));
                $this->redirect(array('controller' => 'demos', 'action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
            }
        }
    }

他に見るべきものがあれば教えてください

4

3 に答える 3

4

あなたの re_passwords 検証ルール equalTo は、その値を実際のフィールドではなく文字列のパスワードと比較していると思います。これにはカスタム関数を使用するのが好きです。

re_passwords ルール配列を置き換えてみてください

 //'rule' => array('equalTo', 'password' ),
'rule' => array('equalToField', 'password'),

そのモデルで equalToField 関数を宣言します

function equalToField($array, $field) {
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}

**また、将来、検証ルールに問題があると思われる場合は、コントローラーアクションでこれを試してください(すべてのルールを削除するよりも高速です)

if ($this->User->save($this->request->data)) {
    ...
} else {
    debug($this->User->validationErrors);
    ...
}

これが役立つことを願っています。

于 2013-04-24T08:31:21.487 に答える
0

こんにちは、要件に合わせて次のコードを使用してください。

ユーザーモデルに独自のメソッドを配置して equalTo 関数をオーバーライドします。

function equalTo( $field=array(), $compare_field=null ) 
{
    foreach( $field as $key => $value ){
        $v1 = $value;
        $v2 = $this->data[$this->name][ $compare_field ];
        if($v1 !== $v2) {
            return FALSE;
        } else {
           continue;
        }
    }
    return TRUE;

}
于 2013-04-24T11:16:53.443 に答える
0

注意、@luboss の回答で、彼は次のように宣言しています。

function equalToField($array, $field) {
    return strcmp($this->data[$this->alias][key($array)], $this->data[$this->alias][$field]) == 0;
}

一貫性のないフィールドを比較しているため、これは機能しません。strcmp の左側のメンバーは既にハッシュされていますが、右側のメンバーはハッシュされていません。フィールドがpasswordと呼ばれるため、これは CakePHP の自動化として発生します。

これを機能させる方法は、 equalToFieldヘルパーでハッシュ関数を再利用することでした。

public function equalToField($array, $field) {
    $valueFirstOccurrence = $this->data[$this->alias][$field];
    $valueSecondOccurrence = Security::hash($this->data[$this->alias][key($array)], $type = 'sha1', $salt = true) ;
    return !strcmp($valueFirstOccurrence, $valueSecondOccurrence);
}

その他のポイント : パスワード フィールドに minLength 検証フィールドを追加することに興味がある場合は、最初にこの良い記事を読みたいと思います: minLength データ検証は、CakePHP の認証コンポーネントでは機能しません。

于 2014-01-22T11:47:00.430 に答える