2013-03-09 30 views
5

Sto tentando di creare una pagina di registrazione in 3 passaggi con cakePHP. Il primo passaggio è OK, inserisce i dati in db ma il secondo passaggio non funziona. Qualcuno può aiutare per favore?Registrazione CakePHP 3 step

Ecco il mio codice di controllo:

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

    } 
} 
} 

?> 

Ecco il modello:

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

?> 

E qui è la vista per 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; ?> 

Così come ho detto su il primo passo è tutto OK, salva l'utente in DB ma al secondo passaggio vorrei inserire più informazioni e quando invio lo visualizza il messaggio flash Session che l'utente non può essere salvato, quindi significa che le seconde informazioni dell'utente non vengono salvate nel DB.

Si prega di aiuto!

+1

puoi dire cosa non funziona? i dati non vengono salvati nel DB? –

+0

Sì, nel primo passaggio viene salvato ma in secondo luogo non viene salvato nel DB. –

+0

Potresti chiarire il problema che stai riscontrando? Tu dici che il secondo passo non funziona, in che senso non sta funzionando? – David

risposta

6

Soluzione trovata. C'è stato un errore nella convalida. Al secondo passaggio ha provato a convalidare la casella di controllo Condizioni d'uso. Quindi, ecco il codice completo di 3 fase di registrazione:

dell'utente del controller:

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

modello di utente:

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

Se qualcuno vuole effettuare la registrazione con più passaggi, il resto è lo stesso!

1

provare a verificare $step come di seguito.

if(!$step){ 

empty viene utilizzata per verificare se array è vuota oppure no.

+0

Funziona bene, ho tutte e 3 le pagine visualizzate correttamente ma quando provo a inviare il secondo mi dà un errore. –

+0

@ user2150848 quale errore.? –

+0

L'utente non può essere salvato. Per favore, riprova. Questa è la sessione flash se non è riuscita. –

4

È consigliabile suddividere i passaggi in singole azioni e viste per semplificare e semplificare la lettura/il debug.

Fase 1

Dal momento che si crea l'account utente, a questo punto, è necessario accedere automaticamente l'utente una volta salvato e validato. Quindi non è necessario mantenere le informazioni nella sessione, il che è negativo nella mia esperienza.

Una e-mail può essere inviata all'utente, a questo punto da modello AfterSave()

Fase 2

vorrei spostare questo ad un'azione chiamata "profilo", che consente all'utente di aggiornare il proprio ulteriori informazioni sul profilo. Poiché sono già registrati, puoi facilmente trovare() l'utente e salvare il loro profilo. Questo può essere riutilizzato anche in futuro.

Fase 3

Questa è solo la pagina "grazie" da quello che posso vedere. Puoi reindirizzare a PagesController e rendere un semplice thankyou.ctp piuttosto che usare l'azione User Controller che non fa nulla per la vista.

Il login può ancora verificarsi anche se il loro indirizzo email non è verificato. Consentirebbe solo l'accesso a determinate parti del sito Web fino a quando non avrà fatto clic sul collegamento inviato a loro in un messaggio di posta elettronica.