6

私はこれを約2日間デバッグしようとしており、インターネットでこの質問に対するすべての回答を読んでいます...それでも機能しません。

私の CakePHP アプリには、 UserというモデルとFormヘルパーを使用するユーザー サインアップ フォームがあります。検証が失敗した場合、フォームには検証エラーは表示されません。

$this->User->validationErrorsに従って、ビューがレンダリングされる前に配列が適切に設定され、debug()モデルが検証されないという事実が によって検出され$this->User->save()ます。

これが私の見解です:

<?php
echo $this->Form->create('User');
echo $this->Form->input('soton_username', array('label' => 'Email address', 'after' => '@soton.ac.uk'));
echo $this->Form->input('username', array('label' => 'Choose a username'));
echo $this->Form->input('password');
echo $this->Form->input('password_confirm', array('label' => 'Password (again)', 'type' => 'password'));
echo $this->Form->input('first_name');
echo $this->Form->input('last_name');
echo $this->Form->submit('Create account');
echo $this->Form->end();
?>

これが私の行動です:

public function create() {
    if($this->request->is('post')) {
        $this->User->set($this->request->data);

        $valid = true;
        $validationErrors = array();
        $password = $this->request->data('User.password');
        $password_confirm = $this->request->data('User.password_confirm');

        if(strlen($password) < 5) {
            $validationErrors['password'][] = 'Password must be at least 5 characters long';
            $valid = false;
        }

        if($password != $password_confirm) {
            $validationErrors['password_confirm'][] ='Passwords do not match';
            $valid = false;
        }

        $this->User->data['User']['email'] = $this->request->data('User.soton_username') . '@soton.ac.uk';

        $group = $this->Group->find('first', array('conditions' => array('default' => 1)));
        if($group) {
            $gid = $group['Group']['id'];
        } else {
            $gid = 1;
        }
        $this->User->data['User']['group_id'] = $gid;

        if($this->User->validates() && $valid) {
            $this->User->save();
            $this->Session->setFlash('<a href="/users/activate/' . $this->User->data['User']['activation_id'] . '">Activate</a>');
            return $this->redirect('/users/confirm_create');
        }

        $this->User->validationErrors = array_merge($this->User->validationErrors, $validationErrors);

        if(isset($this->User->validationErrors['email'])) {
            $this->User->validationErrors['soton_username'] = $this->User->validationErrors['email'];
        }

        //debug($this->request->validationErrors);exit;
        $this->Session->setFlash('There were errors with the form.');
    }
}

soton_usernameフィールドpassword_confirmフィールドは実際にはデータベースの一部ではありませんが、検証する必要があります。

私のUserモデルには、フォームが適切な場所に挿入されると認識される$validate変数があります。required="required"

どんな助けでも大歓迎です。

4

2 に答える 2

1

User->read() を呼び出していなかったので、これが私の答えです。

Cake のコアを掘り下げたところ、エラー フィールドは form->create('model') で渡されたモデル名に基づいて自動入力されることがわかりました。

私のモデルは「ユーザー」で、私の見解では $this->form->create('Users') でした。「s」に注意してください。検証はモデルに対して行われるため、検証エラーの配列はモデル名 'User' でインデックス付けされます。フォームは create で渡された名前 'Users' を使用してエラーを検索します。

これを修正するには、form->create() で単数形のモデルを使用してください。私にとってそれは「ユーザー」です。

于 2014-07-05T00:39:51.443 に答える