Bonjour,
je suis entrain de faire un systeme d'inscription, mais j'ai un problème que j'ai dû mal à saisir.
je m'explique, lors de l'inscription l'internaute entre le pseudo d'un parrain, je fais une recherche find pourvoir si le parrain saisi existe, si c'est le cas l'inscription se poursuivre quand tout est ok les données s'enregistrent dans la base, mon problème est que avec le find du parrain les données s'enregistrent mais le redirect ne marche pas même en cas d'erreur.
voici mon code.

public function register(){
  $this->loadModel('Transaction');

  if($this->request->is('post')){
//debug($this->Session->read());
  $d=$this->request->data;
        //debug($d);die();
  if(!empty($d["User"]["parrain"])){

  $user=$this->User->find('first',array('conditions'=>array('username'=>$d["User"]["parrain"])));

          if($user != array()){
         // $this->redirect('/users/login');

           $parrain_name=$user['User']['name'];
           $parrain_id=$user['User']['id'];

             if(!empty($d['User']['phone'])){
            $phone=$d['User']['phone'];
            $tel1=substr($phone,0,5);
        $number=array('00228','00229','00225','00226','00223');
        if(in_array($tel1, $number)){
         if(strlen($phone)=='13'){
          if($phone == $d['User']['confirmphone']){
             if($d['User']['password'] == $d['User']['confirmpass']){
                 if(!empty($d['User']['password'])){
                          $d['User']['password']= Security::hash($d['User']['password'],null,true);
                         }
                      if(!empty($d['User']['country'])){ 
                        if(!empty($d['User']['ville'])){ 
                          $transaction=$this->Transaction->find('first',array('conditions'=>array('Transaction.username'=>$d['User']['name'])));
                          //debug($transaction);
                          $codeTrans=$transaction['Transaction']['code_ger'];
                          $etatTrans=$transaction['Transaction']['etat'];
                          if($d['User']['code']==$codeTrans){
                            if($etatTrans=='0'){
                            if(!empty($d['User']['role'])){
         if($d['User']['cgu']=='1'){

      $username= $this->enleve($d['User']['username']);
      $name= $d['User']['name'];
  if($this->User->save(array('role'=>$d['User']['role'],'username'=>$d['User']['username'],'name'=>$name,'email'=>$d['User']['email'],'password'=>$d['User']['password'],'phone'=>$d['User']['phone'],
            'parrain_id'=>'1','cgu'=>$d['User']['cgu'],'ville'=>$d['User']['ville'] ,'country'=>$d['User']['country']))){

      $this->Session->setFlash("Votre compte a été crée.","notif");
      $this->redirect('/users/login');

   }else{  
            $this->Session->setFlash("Inscription imposible, veuillez réessayer.","notif"); 
          $this->redirect($this->referer());
        }

      }else{
          $this->Session->setFlash("Veuillez accepter les conditions générales d'utilisation.","notif"); 
        $this->redirect($this->referer());
        }

        }else{ 
          $this->Session->setFlash("Veuillez sélectionner votre pack.","notif");
          $this->redirect($this->referer());
        }

        }else{ 
          $this->Session->setFlash("Votre code d'activation a été déjà utilisé.","notif");
          $this->redirect($this->referer());
        }

        }else{ 
          $this->Session->setFlash("le code d'activation saisir n'est pas valide.","notif");
          $this->redirect($this->referer());
        }

         }else{
            $this->Session->setFlash("Veuillez saisir votre ville.","notif"); 
          $this->redirect($this->referer());

        }
         }else{ 
          $this->Session->setFlash("Veuillez préciser votre pays.","notif");
          $this->redirect($this->referer());

        }

        }else{ 
            $this->Session->setFlash("Les mots de passe ne sont pas identiques.","notif");
          $this->redirect($this->referer());

        }

        }else{ 
          $this->Session->setFlash("Les numéros de téléphone ne sont pas identiques.","notif");
          $this->redirect($this->referer());

        }

        }else{
            $this->Session->setFlash("Veuillez vérifier votre numéro de téléphone.","notif"); 
          $this->redirect($this->referer());

        }

        }else{ 
          $this->Session->setFlash("Veuillez saisir un numéro de téléphone valide.","notif");
          $this->redirect($this->referer());

        }

        }else{
          $this->Session->setFlash("Veuillez saisir votre numéro de téléphone.","notif");
          $this->redirect($this->referer());
        }
    }else{ 
        $this->Session->setFlash("Le nom de parrain que vous avez précisez n'existe pas.","notif");
        $this->redirect($this->referer());
     }

  }
}

}

Merci pour vos retours et explications.

3 réponses


Bonsoir.
Est-ce que tu as entendu parlé du système de validation pour les formulaires ?
CakePHP 2.x Cookbook » Validation des Données.
Car là ton code est inbuvable, déja qu'il est difficile de s'y retrouver dans tes boucles de conditions, si en plus tu fais des vérifications sur chaque champ du formulaire manuellement alors que le système de validation des données de formulaires est justement créé pour éviter ça, nous aurons du mal à t'aider.

Salut,

HS : si tu n'as pas accès à un système de validation pour les formulaires, comme intégré dans CakePHP, tu peux éviter d'imbriquer tout les tests en faisant l'inverse de la validation et en annulant la requête, comme ceci :

// au lieu de faire ça :

if (premier_test()) {
    if (second_test()) {
        // si tout fonctionne
    } else {
        // si le second test rate
    }
} else {
    // si le premier test rate
}

// tu peux plutôt faire ça :

if (!premier_test()) {
    // si le premier test rate
    // il faut penser à arrêter la requête (avec un return foo ou un throw Exception avec la majorité des frameworks)
}

if (!second_test()) {
    // si le second test rate
    // pareil ici, il faut arrêter la requête
}

// si tout fonctionne

je ne sais pas si ces ce que tu demandes mais je penses pour la redirection il faut ajouter un return soit ceci:

return $this->redirect($this->referer());

avant chaque appel de redirection