CakePHP 3步注册

Mil*_*tin 5 php cakephp cakephp-2.0 cakephp-2.1

我正在尝试创建一个3步注册页面cakePHP.第一步是OK,它在db中插入数据,但第二步不起作用.有人可以帮忙吗?

这是我的控制器代码:

<?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') {

    }
}
}

?>
Run Code Online (Sandbox Code Playgroud)

这是模型:

<?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;
}
}

?>
Run Code Online (Sandbox Code Playgroud)

这是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; ?>
Run Code Online (Sandbox Code Playgroud)

所以正如我在第一步说的那样一切正常,它将用户保存在数据库中,但第二步我想提供更多信息,当我提交时显示会话flash消息,用户无法保存,这意味着第二步用户信息未保存在DB中.

请帮忙!

Mil*_*tin 6

找到解决方案 验证时出错.第二步,它尝试验证使用条款复选框.这里是3 STEP REGISTRATION的完整代码:

用户控制器:

<?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
    }
}
}
Run Code Online (Sandbox Code Playgroud)

用户模型:

<?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'];
        }
    }
}
}


?>
Run Code Online (Sandbox Code Playgroud)

查看'/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; ?>
Run Code Online (Sandbox Code Playgroud)

如果有人想通过更多步骤进行注册,其余的就是一样!