首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CakePHP 3步注册

CakePHP 3步注册
EN

Stack Overflow用户
提问于 2013-03-09 14:06:29
回答 3查看 8.7K关注 0票数 5

我正在尝试创建一个3步注册页面与cakePHP。第一步是正常的,它在数据库中插入数据,但第二步不起作用。有人能帮帮忙吗?

下面是我的控制器代码:

代码语言:javascript
复制
<?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') {

    }
}
}

?>

以下是模型:

代码语言:javascript
复制
<?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的视图

代码语言:javascript
复制
<!--  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; ?>

所以,就像我在第一步说的那样,一切正常,它将用户保存在数据库中,但在第二步,我想放入更多信息,当我提交时,它显示会话闪光消息,用户无法保存,所以这意味着第二个用户信息不会保存在数据库中。

请帮帮我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-09 16:17:18

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

用户控制器:

代码语言:javascript
复制
<?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
    }
}
}

用户模型:

代码语言:javascript
复制
<?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‘

代码语言:javascript
复制
<!--  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; ?>

如果有人想注册更多的步骤,剩下的都是一样的!

票数 6
EN

Stack Overflow用户

发布于 2013-03-09 19:58:08

您应该考虑将这些步骤拆分成单独的操作和视图,以使操作更简单、更易于阅读/调试。

步骤1

由于您将在此时创建用户帐户,因此一旦保存并验证,您应该自动登录该用户。这样你就不必在会话中持久化信息了,这在我的经验中是不好的。

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

步骤2

我会把它移到一个名为" profile“的操作上,它允许用户更新他们的附加配置文件信息。由于他们已经登录,您可以轻松地找到()该用户并保存他们的配置文件。这也可以在将来重用。

步骤3

这只是我所能看到的“谢谢”页面。您可以重定向到PagesController并呈现一个简单的thankyou.ctp,而不是使用User Controller操作,后者对视图没有任何作用。

即使他们的电子邮件地址没有经过验证,仍然可以进行登录。在他们点击电子邮件中发送给他们的链接之前,您只允许访问网站的某些部分。

票数 4
EN

Stack Overflow用户

发布于 2013-03-09 14:09:55

尝试检查$step,如下所示。

代码语言:javascript
复制
if(!$step){

empty用于检查array是否为空。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15307835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档