Hello I want to say sorry in advance because I am not a english native speaker but I will do my best explaining the issue that I have , I have a registration form based in multiple steps, I have a issue dealing with some data which is stored in the session, I'll explain the navigation flow below:
1.- (First step) The user register himself and click the submit button, If the submit is success set the data in the session using a method in my current model and redirect to the next page (another method in my current class)
2.- (Second step) The user set his address, e-mail and phonen number (which is optional) and click the submit button If the submit is success set the data in the session using a method in my current model and redirect the user to the next page. (Other method)
3.- (The third step) THE ISSUE IS HERE At this point I printed the all the data in the session variable of course the phone fild is empty because I did not fill it in the previous page, when I back to the previos page (User adress) in order to set a phone number and press the submit button, I store the post data in the session again (overwrite only the array in the session which belongs to this step), after press the submit, my app redirecme to this step again (Third step),
when I retrieve the data in the session (I have a method in my model to do this), I can not see the phone number that I set the prevevious page :S , but I can see the this data (phone number) Only when I refresh my current page.
I already checked all the data flow but I cannot understand why I have this data behavior, does someone can give me a hand?
Array(
[usuario] => Array // Data stored in the First Step
(
[usr_nombre] => Name
[usr_paterno] => Middle Name
[usr_materno] => Surename
[usr_curp] => curp
[usr_rfc] => rfc
[usr_email] => fake@mail.com
[usr_acepta] => 1
)
[direccion] => Array // Data stored in the second step
(
[usr_tel] => <-- Phone number is empty, which is ok because is an optional field and it was not set in the previous screen
[usr_dir] => direccion
[usr_colonia] => colonia
[usr_codigo] => 55130
[usr_pais] => 147
[usr_region] => 2410
[usr_ciudad] => municipio
)
[cursos] => Array // Third step
(
[crs_1] => 1
))
My code with some explanation
if (!isset($_SESSION)){
session_cache_limiter('private_no_expire');
session_start();
}
class Registro extends Controllers
{
/** First Step
Show user form
*/
public function usuario(){
$mdlReg = Models::load('Registro'); // Model
$data = $mdlReg->getSession('all'); // Retrieve all the data stored in the session
if($this->post && $this->post['add']) // The add key comes fron a hidden field in my form
{
$res = $mdlReg->verificar_datos($this->post['usuario'], 'usuario'); // Validate all data types and empty fields (If everything it's ok this will return true)
if($res['status'] == TRUE){
$mdlReg->setSession('usuario', $this->post['usuario']); //Set the array data called usuario() in to the session using a method in the model
ClassGoUrl::go($this -> getUrl('ac').'direccion'); //Redirect to the next step (direccion method)
exit;
}
}
/*
Check if the data of this form exist in the session, if do not exist then fill the values with
the post values (In case the submit validation fails in order to avoid the user to fill all the form again)
*/
$reg_direccion = $mdlReg->getSession('direccion');
$reg_direccion = $reg_direccion?$reg_direccion:$this->post['direccion'];
$form = new ClassForm('usuario');
$form->values($reg_usuario); // This method Fill the form field in the current step form
// ..................... My form here
}
/** Second Step
Show address & contact form
*/
public function direccion(){
$mdlReg = Models::load('Registro');
$data = $mdlReg->getSession('usuario');
// If the data wich come from the first Step (in the session) does not exist redirect to the (First Step)
if(empty($data)) ClassGoUrl::go($this -> getUrl('ac').'usuario');
if($this->post && $this->post['update']) // The update key comes fron a hidden field in my form
{
$res = $mdlReg->verificar_datos($this->post['direccion'], 'direccion'); // Validate all data types and empty fields (If everything it's ok this will returntrue)
if($res['status'] == TRUE){
$mdlReg->setSession('direccion', $this->post['direccion']); // add the array 'direcction' to the session
ClassGoUrl::go($this -> getUrl('ac').'curso'); // Redirect to the next step (curso method)
exit;
}
}
/*
Check if the data of this form exist in the session, if do not exist then fill the values with
the post values (In case the submit validation fails in order to avoid the user to fill all the form again)
*/
$reg_direccion = $mdlReg->getSession('direccion'); // Gte the data of teh curren step from the session
$reg_direccion = $reg_direccion?$reg_direccion:$this->post['direccion']; // Set the values to the form elements (from session or from the post)
$form = new ClassForm('completar');
$form->values($reg_direccion); // This method Fill the form field in the current step form
//.......... My form here
}
public function curso(){
$mdlReg = Models::load('Registro');
$data = $mdlReg->getSession('direccion');
print_r($_SESSION);
/* !!!! THE ISSUE IS HERE !!!!!!!!!
After fill the previus form (direccion method) I leave the phone number empty (its an optional fild), at this point I print all the data in my
session array everithing its ok, but when I go back to the previos step, in order to fill my phone number (some people can do that)
I set the phone numbrer and click the submit in order to stored the data in the session (in the direccion method whith is going to redirectme to this
method again)
when I see the data in the session array , the phone number is not there until I refresh the page (in this method)
*/
// If the data wich come from the Second Step (in the session) does not exist redirect to the (second step)
if(empty($data)) ClassGoUrl::go($this -> getUrl('ac').'direccion');
if($this->post && $this->post['addUserCurso'] == 1) // The addUserCurso key comes fron a hidden field in my form
{
$res = $mdlReg->verificar_datos($this->post['cursos'], 'cursos');
if($res['status'] == TRUE){
$mdlReg->setSession('cursos', $this->post['cursos']); //Set the array data called 'curso' in to the session using a method in the model
ClassGoUrl::go($this -> getUrl('ac').'resumen'); // Go to next Step
exit;
}
};
$form = new ClassForm('Curso');
// .......... My form here
}