2013-03-09 21 views
5

私は3つのステップの登録ページをh cakePHPで作成しようとしています。 最初の手順はOKですが、データはdbに挿入されますが、2番目の手順は機能しません。誰か助けてもらえますか?ここで CakePHP 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(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; 
} 
} 

?> 

そして、ここで私が言ったように

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

のでsignup.ctpための図である。ここ

は私のコントローラのコードです最初のステップはすべてOKですが、DBにユーザーを保存しますが、2番目のステップでは詳細情報を追加したいと思います。ユーザが保存することができないセッションフラッシュメッセージは、2番目のユーザ情報がDBに保存されないことを意味します。

助けてください!

+1

動作していないことを教えてください。データがDBに保存されていませんか? –

+0

最初のステップでは保存しますが、2番目にはDBに保存しません。 –

+0

あなたが持っている問題を明確にすることができますか? 2番目のステップは機能していないと言いますが、どのような意味では機能していませんか? – David

答えて

6

検出された溶液。検証中にエラーが発生しました。 2番目のステップで、利用規約のチェックボックスを検証しようとしました。だからここ3 STEP登録完全なコードです:

ユーザコントローラ:

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

USERモデル:

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


?> 

VIEW '/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; ?> 

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

1

$stepを以下のようにチェックしてみてください。

if(!$step){ 

emptyarrayが空であるかどうかをチェックするために使用されます。

+0

それはうまく動作します、私はすべての3ページが正しく表示されますが、私は2番目を提出しようとすると、私にエラーを与えています。 –

+0

@ user2150848このエラーは? –

+0

ユーザーを保存できませんでした。もう一度やり直してください。 成功していない場合はセッションフラッシュです。 –

4

個々のアクションとビューにステップを分けて、読み込み/デバッグを簡単に簡単に行うことを検討する必要があります。あなたはこの時点でユーザーアカウントが作成されますので

ステップ1

、あなたは自動的に一度保存され、検証されたユーザでログインする必要があります。その後、私の経験では悪いセッションの情報を維持する必要はありません。

メールは、モデルafterSave(から、この時点でユーザーに送信することができます)

ステップ2

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

ステップ3

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

ログインがまだ自分のメールアドレスが確認されていなくても発生することがあります。メールで送信されたリンクをクリックするまで、ウェブサイトの特定の部分へのアクセスのみを許可します。