2013-03-19 13 views
1

Donc j'apprends CakePHP, et j'essaye juste de construire un tas d'applications de base que je peux construire en PHP direct pour apprendre comment fonctionne CakePHP. En ce moment, je travaille sur un système de gestion des commandes de base - Les utilisateurs peuvent avoir plusieurs commandes et commandes appartiennent à un utilisateur. J'ai la base de données configurée et CakePHP est configuré correctement (la page de démarrage montre tout le vert pour chaque sujet comme le fuseau horaire par défaut et la connexion à la base de données, à l'exception du DebugKit que je n'ai pas installé). J'ai aussi une « liste des utilisateurs » page:Mettre à jour un enregistrement dans CakePHP

enter image description here

Le problème que je suis en cours d'exécution dans, comme vous pouvez réellement voir dans la capture d'écran ci-dessus, est quand je suis en train de modifier un utilisateur existant sur/utilisateurs/edit_user:

enter image description here

J'essaie de sauvegarder les modifications pour l'utilisateur, et I (1) utiliser $this->Form->hidden(...) pour l'ID et (2) définir la clé primaire à la clé primaire de la table le modèle avec public $primaryKey = 'ID';

Chaque fois que j'essaie de faire cela, il insère simplement un nouvel enregistrement au lieu de mettre à jour l'enregistrement existant, et je pensais que le problème serait résolu en identifiant mon PK et en ajoutant l'ID à soumettre, mais je dois être Il manque quelque chose.

Voici le code pour les pages concernées:

Modèle

<?php 
/** 
* app/Model/User.php 
* 
*/ 
class User extends AppModel 
{ 
    public $name = 'User'; 
    public $primaryKey = 'ID'; 

    // <hasMany> 
    public $hasMany = array(
          'Order' => array('dependent' => true) 
         ); 
} 

?> 

Contrôleur

<?php 
/** 
* app/Controller/UsersController.php 
* 
*/ 
class UsersController extends AppController 
{ 
    //public $scaffold; 

    /* Validation */ 
    public $validate = array(
      'username' => array(
        'required' => true, 
        'allowEmpty' => false, 
        'loginRule1' => array(
         'rule' => 'alphaNumeric', 
         'message' => "Usernames must be alphanumeric!" 
             ), 
        'loginRule2' => array(
         'rule' => array('minLength', 4), 
         'message' => 'Usernames must be at least 4 characters.' 
             ), 
           ), 
      'password' => array(
        'required' => true, 
        'allowEmpty' => false, 
        'passwordRule1' => array(
         'rule' => array('minLength', 4), 
         'message' => 'Passwords must be between 4 and 8 characters.' 
              ), 
        'passwordRule2' => array(
         'rule' => array('maxLength', 8), 
         'message' => 'Passwords must be between 4 and 8 characters.' 
              ) 
           ) 
      ); 


    /* Actions */ 

    public function index() 
    { 
     // Grab all users 
     $users = $this->User->find('all'); 

     // Set/Send users to View 
     $this->set('users', $users); 
    } 

    public function new_user() 
    { 
     /* Has any Form data been POST'd? */ 
     if ($this->request->is('post')) 
     { 
      // Save User data to the DB 
      $this->User->save($this->request->data); 

      $this->redirect('/users'); 
     } 
    } 

    /* 
     Accessing Args: 
      (1) Direct URL Routing Method 
       --> ... 
      (2) Named Params Method 
       --> CakeRequest['named']['[name]'] 
    */ 
    public function edit_user($id = null) 
    { 
     $id = $this->request['named']['currentID']; 

     // Display the current data of the user 
     if (!empty($id)) 
     { 
      $userInfo = $this->User->find('all', 
        array('conditions' => array('User.ID' => $id))); 

      $this->set('userData', $userInfo); 
     } 
     else 
      $this->set('error', '$id is empty!'); 

     /* Has any Form data been POST'd? */ 
     if ($this->request->is('post')) 
     { 
      // Save User data to the DB 
      $this->User->save($this->request->data); 

      $this->redirect('/users'); 
     } 
    } 
} 

?> 

Voir/Users/edit_user.ctp

<div class="row-fluid"> 

    <div class-"span12"></div> 
    <div class="span12"></div> 

    <div class="span8 offset2"> 

     <?php 
      echo "Hidden ID Field Value: " . $userData[0]['User']['ID']; 
      echo "<hr>"; 



      echo $this->Form->create('User'); 
      echo $this->Form->input('username'); 
       echo " Current Name: " . 
        $userData[0]['User']['username']; 
      echo $this->Form->input('password'); 
       echo " Current password: " . 
        $userData[0]['User']['password']; 

      // Hidden ID field to make save ~ an UDATE 
      echo $this->Form->hidden('User', 
        array('ID' => $userData[0]['User']['ID'], 
          'type' => 'hidden')); 

      echo $this->Form->end('Save'); 

     ?> 
    </div> 

</div> 

Quelqu'un voit ce que Je suis n Ce faisant, je vais éditer/METTRE À JOUR un enregistrement existant au lieu d'INSÉRER un nouveau? Merci pour votre temps!

+1

Je ne sais pas si cela ferait une différence ... mais quand j'utilise un champ de saisie ID pour quelque chose comme ça, j'ai tendance à utiliser quelque chose comme ceci: 'echo $ this-> Form-> input ('id', array ('type' => 'hidden')); ' – summea

+1

C'était tout! Merci d'avoir corrigé mon erreur n00b. :) –

Répondre

4

Le problème a probablement à voir avec le type d'élément Form utilisé ici; Je suggère d'essayer quelque chose comme ceci dans votre fichier /View/Users/edit_user.ctp:

// Hidden ID field to make save an UPDATE 
echo $this->Form->input('id', array('type' => 'hidden')); 

Plus d'informations sur les modifications d'économie se trouve dans le CakePHP blog tutorial.

4

Vous n'avez pas besoin de répercuter les valeurs dans le formulaire, CakePHP est plus intelligent que cela. Pour ce faire, à la place:

<?php 
class UsersController { 

    public function edit($id) { 
     if ($this->request->is('post')) { 
      if ($this->User->save($this->request->data)) { 
       $this->Session->setFlash('User successfully saved.'); 
       $this->redirect(array('action' => 'index')); 
      } 
     } 
     else { 
      $this->request->data = $this->User->findById($id); 
     } 
    } 
} 

Et puis créez un formulaire dans votre point de vue en tant que tel:

<?php 
    echo $this->Form->create('User'); 
    echo $this->Form->input('User.name'); 
    // and any other fields 
    echo $this->Form->input('User.id', array('type' => 'hidden')); 
    echo $this->Form->end('Save user'); 
?> 

CakePHP remplit automatiquement les champs de formulaire avec des valeurs basées sur ce qui est en $this->request->data.

Le Blog Tutorial sur le livre de recettes CakePHP est un bon point de départ pour se familiariser avec le cadre et ses concepts.

Questions connexes