5

で3ステップの登録ページを作成しようとしていますcakePHP。最初のステップはOKです。データをdbに挿入しますが、2番目のステップは機能しません。誰か助けてもらえますか?

これが私のコントローラーコードです:

<?php

App::uses('Controller', 'Controller');

class UsersController extends AppController {

public $name = 'Users';

public function beforeFilter(){
    parent::beforeFilter();
    $this->Auth->allow('signup');
}

public function login(){
    if($this->request->is('post')){
        if($this->Auth->login()){
            $this->redirect($this->Auth->redirect());   
        } else {
            $this->Session->setFlash('Invalid username or password!', 'default', array('class' => 'errormsg'));
        }
    }
}
public function logout(){
    $this->redirect($this->Auth->logout());
}
// SIGN UP ACTIONS
public function signup($step = null){
    // SET STEP VARIABLE
    $this->set('s', $step);
    // STEP 1 - REGISTER
    if(empty($step)){
        if ($this->request->is('post')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->write('regUser', $this->request->data['User']['email']);
                // $this->Session->setFlash('The user has been saved, please enter other information!',
                //                          'default', array('class' => 'okormsg'));
                $regUser = $this->User->find(   'first', array('conditions' => array(
                                                'User.username' => $this->Session->read('regUser'))));
                $id = $regUser['User']['id'];

                $this->Session->write('regUserId', $id);

                $this->redirect(array('personal-info'));
            } else {
                $this->Session->setFlash(   'There was an error, please check the fields bellow!',
                                            'default', array('class' => 'errormsg'));
            }
        }
    // STEP 2 - PERSONAL INFORMATION
    } elseif($step == 'personal-info') {
        if ($this->request->is('post')) {
            $id = $this->Session->read('regUserId');
            $this->User->id = $id;

            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('The user has been saved');
                $this->redirect(array('complete'));
            } else {
                $this->Session->setFlash('User could not be saved. Please, try again.');
            }
        }
    // STEP 3 - COMPLETE REGISTRATION
    } elseif($step == 'complete') {

    }
}
}

?>

モデルは次のとおりです。

<?php

class User extends AppModel {

public $validate = array (
    'name'=>array(
        'Please enter your name!'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter your name!'
        )
    ),
    'surname'=>array(
        'Please enter your surname!'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter your surname!'
        )
    ),
    'email'=>array(
        'Valid email'=>array(
            'rule'=>array('email'),
            'message'=>'Please enter a valid Email address!'
        ),
        'Already exists'=>array(
            'rule'=>'isUnique',
            'message'=>'This Email is already registered in our database!'
        )
    ),
    'password'=>array(
        'Not empty'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter your password!'
        ),
        'Match password'=>array(
            'rule'=>'matchPasswords',
            'message'=>'Your passwords do not match!'
        )
    ),
    'password_confirm'=>array(
        'Not empty'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please confirm your password!'
        )
    ),
    'terms'=>array(
        'Agree'=>array(
            'rule'=>'notEmpty',
            'required'=>true,
            'message'=>'You must agree to Terms and conditions!'
        )
    )
);

public function matchPasswords($data){
    if ($data['password'] == $this->data['User']['password_confirm']){
        return true;
    } else {
        $this->invalidate('password_confirm', 'Your passwords do not match!');
        return false;
    }
}
public function beforeSave(){
    if(!empty($this->data['User']['password'])) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    }
    if (empty($this->data['User']['username'])) {
        $this->data['User']['username'] = $this->data['User']['email'];
    }
    return true;
}
}

?>

そして、これがsignup.ctpのビューです

<!--  SIGN UP STEPS  -->
<!--  SIGN UP - 1 (REGISTER)  -->
<?php if(empty($s)): ?>
<div  id="register" class="container padded">
<div id="register">
        <div class="paginate active">Register</div>
        <div class="paginate">Personal Information</div>
        <div class="paginate">Complete Registration</div>
        <h1>User Registration</h1>
        <p>Welcome to user registration! You can sign up yourself and start improving your business. User registration is FREE and once you register yourself you can select apropiate business package for your company and start advertising.<br />
        <span style="color:#900">All field are required!</span></p>
    <?php
        echo $this->Form->create();
        echo $this->Form->input('name');
        echo $this->Form->input('surname');
        echo $this->Form->input('email');
        echo $this->Form->input('password');
        echo $this->Form->input('password_confirm', array('label'=>'Password Confirmation','type'=>'password'));
        echo $this->Form->input('terms', array('label'=>false, 'type'=>'checkbox'));
        ?> I accept <a href="#" class="link">Terms Of Use</a> <?
        echo $this->Form->end('Continue Registration');
    ?>
</div>
</div>
<!--  SIGN UP - 2 (PERSONAL INFO)  -->
<?php elseif($s == 'personal-info'): ?>
<div  id="register" class="container padded">
<div id="register">
        <div class="paginate">Register</div>
        <div class="paginate active">Personal Information</div>
        <div class="paginate">Complete Registration</div>
        <h1>User Registration</h1>
        <p>Welcome to user registration! You can sign up yourself and start improving your business. User registration is FREE and once you register yourself you can select apropiate business package for your company and start advertising.<br />
        <span style="color:#900">All field are required!</span></p>
    <?php
        echo $this->Form->create();
        echo $this->Form->input('phone');
        echo $this->Form->input('address');
        echo $this->Form->input('city');
        echo $this->Form->input('ptt', array('label'=>'Postal Code'));
        echo $this->Form->input('state');
        echo $this->Form->input('country');
        echo $this->Form->end('Complete Registration');
    ?>
</div>
</div>
<!--  SIGN UP - 3 (COMPLETE)  -->
<?php elseif($s == 'complete'): ?>
<div  id="register" class="container padded">
<div id="register">
        <div class="paginate">Register</div>
        <div class="paginate">Personal Information</div>
        <div class="paginate active">Complete Registration</div>
        <h1>User Registration</h1>
        <p>Welcome to user registration! You can sign up yourself and start improving your business. User registration is FREE and once you register yourself you can select apropiate business package for your company and start advertising.<br />
        <span style="color:#900">All field are required!</span></p>
</div>
</div>
<? else: ?>
<div  id="register" class="container padded">
<div id="register">
    Unknown page!
</div>
</div>
<? endif; ?>

最初のステップで言ったように、それはすべてOKで、ユーザーをDBに保存しますが、2番目のステップでは、より多くの情報を入力したいと思います。送信すると、ユーザーを保存できないというセッションフラッシュメッセージが表示されます。ユーザー情報はDBに保存されません。

助けてください!

4

3 に答える 3

6

解決策が見つかりました。検証中にエラーが発生しました。2番目のステップでは、利用規約のチェックボックスを検証しようとしました。したがって、3ステップ登録の完全なコードは次のとおりです。

ユーザーコントローラー:

<?php

App::uses('Controller', 'Controller');

class UsersController extends AppController {

public $name = 'Users';

public function beforeFilter(){
    parent::beforeFilter();
    $this->Auth->allow('signup');
}

public function login(){
    if($this->request->is('post')){
        if($this->Auth->login()){
            $this->redirect($this->Auth->redirect());   
        } else {
            $this->Session->setFlash('Invalid username or password!', 'default', array('class' => 'errormsg'));
        }
    }
}
public function logout(){
    $this->redirect($this->Auth->logout());
}
// SIGN UP ACTIONS
public function signup($step = null){
    // SET STEP VARIABLE
    $this->set('s', $step);
    // STEP 1 - REGISTER
    if(!$step){
        $this->set('r', 1);
        if ($this->request->is('post')) {
            if ($this->User->save($this->request->data)) {
                $this->Session->write('regUser', $this->request->data['User']['email']);
                // $this->Session->setFlash('The user has been saved, please enter other information!',
                //                          'default', array('class' => 'okormsg'));
                $regUser = $this->User->find(   'first', array('conditions' => array(
                                                'User.username' => $this->Session->read('regUser'))));
                $id = $regUser['User']['id'];
                $this->Session->write('regUserId', $id);
                $this->redirect(array('personal-info'));
            } else {
                $this->Session->setFlash(   'There was an error, please check the fields bellow!',
                                            'default', array('class' => 'errormsg'));
            }
        }
    // STEP 2 - PERSONAL INFORMATION
    } elseif($step == 'personal-info') {
        $id = $this->Session->read('regUserId');
        $this->User->id = $id;
        if ($this->request->is('post')) {
            if ($this->User->save($this->request->data, array('validate' => false))) {
                $this->redirect(array('complete'));
            } else {
                $this->Session->setFlash(   'User could not be saved. Please, try again.',
                                            'default', array('class' => 'errormsg'));
            }
        }
    // STEP 3 - COMPLETE REGISTRATION
    } elseif($step == 'complete') {
        // Send email function
    }
}
}

ユーザーモデル:

<?php

class User extends AppModel {

public $validate = array (
    'name'=>array(
        'Please enter your name!'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter your name!'
        )
    ),
    'surname'=>array(
        'Please enter your surname!'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter your surname!'
        )
    ),
    'email'=>array(
        'Valid email'=>array(
            'rule'=>array('email'),
            'message'=>'Please enter a valid Email address!'
        ),
        'Already exists'=>array(
            'rule'=>'isUnique',
            'message'=>'This Email is already registered in our database!'
        )
    ),
    'password'=>array(
        'Not empty'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please enter your password!'
        ),
        'Match password'=>array(
            'rule'=>'matchPasswords',
            'message'=>'Your passwords do not match!'
        )
    ),
    'password_confirm'=>array(
        'Not empty'=>array(
            'rule'=>'notEmpty',
            'message'=>'Please confirm your password!'
        )
    ),
    'terms'=>array(
        'Agree'=>array(
            'rule'=>'notEmpty',
            'required'=>true,
            'message'=>'You must agree to Terms and conditions!'
        )
    )
);
public function matchPasswords($data){
    if ($data['password'] == $this->data['User']['password_confirm']){
        return true;
    } else {
        $this->invalidate('password_confirm', 'Your passwords do not match!');
        return false;
    }
}
public function beforeSave(){
    if(!empty($this->data['User']['password'])) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    }
    if(!empty($this->data['User']['email'])){
        if (empty($this->data['User']['username'])) {
            $this->data['User']['username'] = $this->data['User']['email'];
        }
    }
}
}


?>

表示'/Users/signup.ctp'

<!--  SIGN UP STEPS  -->
<!--  SIGN UP - 1 (REGISTER)  -->
<?php if(empty($s)): ?>
<div  id="register" class="container padded">
<div id="register">
        <div class="paginate active">Register</div>
        <div class="paginate">Personal Information</div>
        <div class="paginate">Complete Registration</div>
        <h1>User Registration</h1>
        <p>Welcome to user registration! You can sign up yourself and start improving your business. User registration is FREE and once you register yourself you can select apropiate business package for your company and start advertising.<br />
        <span style="color:#900">All field are required!</span></p>
    <?php
        echo $this->Form->create();
        echo $this->Form->input('name');
        echo $this->Form->input('surname');
        echo $this->Form->input('email');
        echo $this->Form->input('password');
        echo $this->Form->input('password_confirm', array('label'=>'Password Confirmation','type'=>'password'));
        echo $this->Form->input('terms', array('label'=>false, 'type'=>'checkbox'));
        ?> I accept <a href="#" class="link">Terms Of Use</a> <?
        echo $this->Form->end('Continue Registration');
    ?>
</div>
</div>
<!--  SIGN UP - 2 (PERSONAL INFO)  -->
<?php elseif($s == 'personal-info'): ?>
<div  id="register" class="container padded">
<div id="register">
        <div class="paginate">Register</div>
        <div class="paginate active">Personal Information</div>
        <div class="paginate">Complete Registration</div>
        <h1>User Registration</h1>
        <p>This personal information are not required.<br />
    <?php
        echo $this->Form->create();
        echo $this->Form->input('phone');
        echo $this->Form->input('address');
        echo $this->Form->input('city');
        echo $this->Form->input('ptt', array('label'=>'Postal Code'));
        echo $this->Form->input('state');
        echo $this->Form->input('country');
        echo $this->Form->end('Complete Registration');
    ?>
</div>
</div>
<!--  SIGN UP - 3 (COMPLETE)  -->
<?php elseif($s == 'complete'): ?>
<div  id="register" class="container padded">
<div id="register">
        <div class="paginate">Register</div>
        <div class="paginate">Personal Information</div>
        <div class="paginate active">Complete Registration</div>
        <h1>Congratulation!</h1>
        <p>Your account has been created and <strong>Email</strong> has been send to your inbox. Please check you inbox and verify address by clicking on the link provided in mail.</p>
</div>
</div>
<? else: ?>
<div  id="register" class="container padded">
<div id="register">
    Unknown page!
</div>
</div>
<? endif; ?>

誰かがより多くのステップで登録をしたい場合、残りはまったく同じです!

于 2013-03-09T08:17:17.693 に答える
4

ステップを個々のアクションとビューに分割して、読みやすくデバッグしやすくすることを検討する必要があります。

ステップ1

この時点でユーザーアカウントを作成するので、保存して検証したら、ユーザーに自動的にログインする必要があります。そうすれば、セッションで情報を保持する必要がなくなります。これは私の経験では悪いことです。

この時点で、Model afterSave()からユーザーに電子メールを送信できます。

ステップ2

これを「プロファイル」と呼ばれるアクションに移動します。これにより、ユーザーは追加のプロファイル情報を更新できます。彼らはすでにログインしているので、あなたは簡単にユーザーを見つけて彼らのプロフィールを保存することができます。これは将来的にも再利用できます。

ステップ3

これは私が見ることができるものからの単なる「ありがとう」ページです。ビューに対して何も行わないUserControllerアクションを使用するのではなく、PagesControllerにリダイレクトして、単純なthankyou.ctpをレンダリングできます。

メールアドレスが確認されていなくても、ログインは可能です。電子メールで送信されたリンクをクリックするまで、Webサイトの特定の部分へのアクセスのみを許可します。

于 2013-03-09T11:58:08.493 に答える
1

以下のように確認$stepしてみてください。

if(!$step){

emptyarray空かどうかを確認するために使用されます。

于 2013-03-09T06:09:54.607 に答える