2010-10-30 10 views
1

J'ai un contrôleur utilisateurs, où si j'ajoute un utilisateur que je veux rediriger en fonction du type d'utilisateur un utilisateur choisit de rendre son compterediriger les conditions après avoir enregistré un record

la situation:

Table des utilisateurs

id

nom

usertype_id

Le formulaire d'ajout d'utilisateur a une boîte de sélection pour le type d'utilisateur, j'ai deux types d'utilisateurs: enseignants et étudiants (un autre tableau, modèle, contrôleur) si l'utilisateur choisit l'enseignant je souhaite rediriger vers/teachers/add/$ id si l'utilisateur choisit étudiant, je veux rediriger vers:/étudiants/ajouter/$ id

c'est ce que je atm, mais cela ne fonctionne évidemment pas

<?php 
class UsersController extends AppController { 
    var $name = 'Users'; 

    function add() { 
    if (!empty($this->data)) { 
     $this->User->create(); 
     if ($this->User->save($this->data)) { 
      $id = $this->User->id; 
      if ($this->User->usertype_id=='1') 
      { 
       $this->redirect(array('students/add/'.$id)); 
      } elseif ($this->User->usertype_id=='2') { 
       $this->redirect(array('teachers/add/'.$id)); 
      } else { 
       $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); 
      } 
     } else { 
      $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); 
     } 
    } 
    $usertypes = $this->User->Usertype->find('list'); 
    $this->set(compact('usertypes')); 
} 

} 
?> 

Répondre

2

Je suis sûr que le problème est l'hypothèse que, parce queexiste, $this->User->usertype_id doit également exister, ce qui n'est pas le cas. J'ai rencontré ce problème lorsque j'ai commencé à travailler avec CakePHP. :)

Si le type d'utilisateur a été transmis via le formulaire d'ajout, vous devez vérifier le tableau de données:

changement

if ($this->User->usertype_id=='1') 

Pour

if ($this->data['User']['usertype_id'] == '1') 

Si cela ne veut pas travail (je ne me souviens pas si $this->data est vidé après une sauvegarde réussie) alors vous devriez stocker la valeur avant la sauvegarde, comme ceci:

function add() { 
    if (!empty($this->data)) { 
     $usertype_id = $this->data['User']['usertype_id']; 
     $this->User->create(); 
     if ($this->User->save($this->data)) { 
      $id = $this->User->id; 
      if ($usertype_id == '1') { 
       $this->redirect(array('students/add/'.$id)); 
      } elseif ($usertype_id == '2') { 
       // the rest remains the same 

Addendum
Plutôt que d'utiliser la concaténation dans votre redirect, ceci semble plus propre pour moi:

$this->redirect(array('controller' => 'teachers', 'action' => 'add', $id)); 

Mais je suppose que c'est juste préférence.

Addendum 2
J'ai quelques conseils supplémentaires sur le nettoyage de votre contrôleur et déplacer toute la logique du modèle. De cette façon, vous pourrez réutiliser le code d'autres contrôleurs à l'avenir, et votre contrôleur actuel sera plus facile à lire. Je voudrais changer la méthode entière pour ressembler à ceci:

// this is in /controllers/users_controller.php 
function add() { 
    if (!empty($this->data)) { 
     $saved_user = $this->User->save_user($this->data); 
     if ($saved_user['success']) { 
      $this->redirect(array(
       'controller' => $saved_user['controller'], 
       'action' => 'add', 
       $this->User->id 
      )); 
     } 
    } 
    $this->Session->setFlash(__('The user could not be saved. Please, try again.', true)); 
    $usertypes = $this->User->Usertype->find('list'); 
    $this->set(compact('usertypes')); 
} 

// this is in your model, /models/user.php 
function save_user($data) { 
    $this->create; 
    $usertype_id = $data['User']['usertype_id']; 
    return array(
     'controller' => ($usertype_id == '2') ? 'teachers': 'students'; 
     'success' => $this->save($data), 
    ); 
} 
+0

merci, juste quelque chose que vous devez savoir je suppose. Je pense que j'ai parcouru 121324 choses différentes pour trouver la bonne façon de procéder, sans aucun résultat. Tu as fait ma journée :) – Weptunus

+0

De rien! – Stephen

Questions connexes