2009-08-13 6 views
0

Dans mon application cakephp j'ai un modèle Option.Modifier et enregistrer plusieurs enregistrements dans cakephp

Dans mon affichage option/index, j'affiche 2 options avec des entrées et des champs de boutons radio. Je veux mettre à jour les deux, mais j'ai un comportement étrange.

L'option que je modifie n'est pas enregistrée et une nouvelle option est insérée avec la nouvelle valeur.

Voici mon avis

<h2 class='page-title' id='manage-options'>Opzioni</h2> 
<?php echo $form->create(null, array('action'=>'index')); ?> 
<table> 
    <tr> 
    <td><?= $options[0]['Option']['name']?></td> 
    <td><?= $form->radio( 
        $options[0]['Option']['id'], 
        array( 
         '1' => 'Sì', 
         '0' => 'No'), 
       array('default'=> $options[0]['Option']['value'], 'legend'=>false) 
    );?> 
     </td> 
    </tr> 
    <tr> 
     <td><?= $options[1]['Option']['name']?></td> 
    <td><?= $form->input($options[1]['Option']['id'],array('label'=>false,'value' => $options[1]['Option']['value']))?></td> 
    </tr>          
</table>  
<?php echo $form->submit('Salva'); ?> 
<?php echo $form->end(); ?> 

Et mon contrôleur:

function index() { 
    if (!empty($this->data)) { 
     foreach($this->data['Option'] as $id => $value) : 
      $this->Option->id = $id;  
      $feedback = $this->Option->read(); 
      $this->Option->saveField('value', $value); 
     endforeach;   
     $this->Session->setFlash('Opzioni aggiornate'); 
    } 
    $this->Option->recursive = 0; 
    $this->set('options', $this->paginate()); 
} 

Avant de poster ici, j'ai passé deux heures googler pour trouver des réponses et des expériences. Je sais saveAll() et j'ai essayé ces solutions:

http://planetcakephp.org/aggregator/items/2172-cakephp-multi-record-forms http://teknoid.wordpress.com/2008/10/27/editing-multiple-records-with-saveall/

J'ai été peaufinage mon code pour adapter ces modèles, mais je suis arrivé aucun résultat (oscillant entre « ne fonctionne pas » et « ne fonctionne pas et J'ai un enregistrement supplémentaire '), j'ai donc décidé de poster mon code original.

Pouvez-vous aider, en indiquant la meilleure façon de le faire? Cheeers, Davide

Répondre

1

Le problème résidait dans les données de la base de données. Les gens aimables sur le canal IRC cakephp ont attiré mon attention sur le fait que dans la plupart des bases de données, ID = 0 équivaut à un "nouvel enregistrement". Pour une raison quelconque, j'avais une option avec l'ID 0, donc lors de la mise à jour de la requête mysql sous-jacente effectivement créé un nouvel enregistrement. Modifié les ID, problème résolu.

0

Le principal problème avec votre code que je vois est que vos champs, la radio et l'entrée, sont construits avec seulement une valeur d'ID comme premier paramètre. La "méthode du gâteau" correcte de la construction d'un champ est d'avoir le premier paramètre Model.fieldname, dans mon cas je crois que ce serait $ form-> input ('Option.id', array())?>

Si vous inspectez le code html généré par votre code, vous verrez le nom du champ est data [id], et il devrait être data [Option] [id] si vous voulez parcourir $ this-> data ['Option'] dans votre manette. Essayez de modifier votre code pour inclure le Model.fieldname en tant que premier paramètre, puis les données doivent être soumises correctement à votre contrôleur.

+0

Le premier paramètre n'est pas l'ID, il s'agit d'un index de tableau pointant vers le Nième élément du tableau de résultats. De plus, les champs d'entrée générés sont parfaitement corrects (data [Option] [id]). Merci quand même pour la suggestion mais ça ne s'applique pas. – nutsmuggler

Questions connexes