CakePHP 3步注册

CakePHP 3步注册,php,cakephp,cakephp-2.0,cakephp-2.1,Php,Cakephp,Cakephp 2.0,Cakephp 2.1,我正在尝试用hcakePHP创建一个三步注册页面。 第一步可以,它将数据插入db中,但第二步不起作用。有人能帮忙吗 这是我的控制器代码: <?php App::uses('Controller', 'Controller'); class UsersController extends AppController { public $name = 'Users'; public function beforeFilter(){ parent::beforeFilter();

我正在尝试用h
cakePHP
创建一个三步注册页面。 第一步可以,它将数据插入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') {

    }
}
}

?>

模型如下:

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

登记
个人信息
完全注册
用户注册
欢迎用户注册!你可以自己注册,开始改善你的业务。用户注册是免费的,一旦您自己注册,您就可以为您的公司选择一个鸦片业务包并开始广告宣传。
所有字段都是必需的

我接受 登记 个人信息 完全注册 用户注册 欢迎用户注册!你可以自己注册,开始改善你的业务。用户注册是免费的,一旦您自己注册,您就可以为您的公司选择一个鸦片业务包并开始广告宣传。
所有字段都是必需的

登记 个人信息 完全注册 用户注册 欢迎用户注册!你可以自己注册,开始改善你的业务。用户注册是免费的,一旦您自己注册,您就可以为您的公司选择一个鸦片业务包并开始广告宣传。
所有字段都是必需的

未知页面!
所以,正如我在第一步中所说的,它可以将用户保存在DB中,但在第二步中,我想输入更多信息,当我提交时,它会显示会话闪存消息,用户无法保存,这意味着第二个用户信息不会保存在DB中


请帮忙

尝试按如下方式检查
$step

if(!$step){

empty
用于检查
数组是否为空。

找到了解决方案。验证时出错。在第二步中,它尝试验证使用条款复选框。下面是三步注册的完整代码:

用户控制器:

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

查看“/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; ?>

登记
个人信息
完全注册
用户注册
欢迎用户注册!你可以自己注册,开始改善你的业务。用户注册是免费的,一旦您自己注册,您就可以为您的公司选择一个鸦片业务包并开始广告宣传。
所有字段都是必需的

我接受 登记 个人信息 完全注册 用户注册 不需要此个人信息。
登记 个人信息 完全注册 祝贺你! 您的帐户已创建,电子邮件已发送到您的收件箱。请检查您的收件箱,并通过单击邮件中提供的链接验证地址

未知页面!

如果有人想注册更多的步骤,其余的步骤都一样

> P>你应该考虑将步骤分解为单独的动作和视图,以使事情更简单、更容易读/调试。

步骤1

由于此时将创建用户帐户,因此保存并验证后应自动登录该用户。然后,您不必在会话中保留信息,这在我的经验中是不好的

此时可以从Model afterSave()向用户发送电子邮件

步骤2

我会将此移动到一个名为“profile”的操作,该操作允许用户更新其附加的概要信息。由于他们已经登录,您可以轻松找到()用户并保存他们的个人资料。这也可以在将来重复使用

步骤3

这只是我看到的“谢谢”页面。您可以重定向到PagesController并呈现一个简单的thankyou.ctp,而不是使用对视图不起任何作用的用户控制器操作


即使他们的电子邮件地址未经验证,仍然可以登录。您只允许访问网站的某些部分,直到他们单击通过电子邮件发送给他们的链接

你能告诉我什么不起作用吗?数据是否未保存在DB中?是的,第一步是保存,但第二步不是保存在DB中。您能否澄清您遇到的问题?您说第二步不起作用,在什么意义上它不起作用?好的,在第一部分输入数据后,它会很好地保存在DB中,并重定向到其他页面并显示该页面的视图,当我输入更多信息并单击“提交”时,它会给我一个错误“用户无法保存”。请再试一次。数据库中没有任何更改。这很好,我正确显示了所有3个页面,但当我尝试第二次提交时,它给我一个错误。无法保存用户。请再试一次。如果不成功,那就是会话flash。
<!--  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; ?>