2009-08-13 19 views
0

In meiner CakePHP App habe ich ein Option-Modell.Bearbeiten und speichern Sie mehrere Datensätze in CakePHP

In meiner Option/Indexansicht zeige ich 2 Optionen mit Eingängen und Optionsfelder an. Ich möchte beide aktualisieren, aber ich bekomme ein seltsames Verhalten.

Die Option, die ich ändere, wird nicht gespeichert und stattdessen wird eine neue Option mit dem neuen Wert eingefügt.

Hier ist meine Ansicht

<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(); ?> 

Und mein Controller:

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()); 
} 

Vor Posting hier verbrachte ich zwei Stunden Antworten googeln und experimentieren. Ich weiß, über saveAll() und ich habe diese Lösungen ausprobiert:

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

Ich habe meinen Code wurde Tweaking diese Muster zu passen, aber ich habe keine Ergebnisse (oszillierend zwischen ‚nicht funktioniert‘ und ‚nicht funktioniert und Ich bekomme eine Extra-Aufnahme '), also habe ich beschlossen, meinen Originalcode zu posten.

Können Sie helfen, indem Sie den richtigen Weg angeben? Davis

Antwort

1

Das Problem war mit den Daten in der DB. Die netten Leute auf dem CakePHP-IRC-Kanal haben meine Aufmerksamkeit auf die Tatsache gelenkt, dass in den meisten Datenbanken ID = 0 gleich 'neuer Rekord' ist. Aus irgendeinem Grund hatte ich eine Option mit der ID 0, so dass bei der Aktualisierung der mysql-Abfrage tatsächlich ein neuer Datensatz erstellt wurde. Die IDs geändert, Problem behoben.

0

Das Hauptproblem mit Ihrem Code, den ich sehe, ist, dass Ihre Felder, sowohl das Radio und die Eingabe, mit nur einem ID-Wert als erster Parameter gebaut werden. Der richtige "Kuchen-Weg" zum Erstellen eines Feldes ist, dass der erste Parameter Model.fieldname ist, in Ihrem Fall glaube ich, dass es $ form-> input ('Option.id', array()) wäre?>

Wenn Sie den von Ihrem Code generierten HTML-Code untersuchen, sehen Sie, dass der Feldname Daten [ID] ist, und es sollte Daten [Option] [ID] sein, wenn Sie $ this-> Daten ['Option'] in Ihrem durchlaufen möchten Regler.

Versuchen Sie, Ihren Code so zu ändern, dass er Model.fieldname als ersten Parameter enthält, und dann sollten die Daten korrekt an Ihren Controller übergeben werden.

+0

Der erste Parameter ist nicht die ID, sondern ein Array-Index, der auf das N-te Element des Ergebnis-Arrays zeigt. Auch die generierten Eingabefelder sind vollkommen korrekt (data [Option] [id]). Danke trotzdem für den Vorschlag, aber es trifft nicht zu. – nutsmuggler

Verwandte Themen