Ich habe ein relativ einfaches Eingabemodell mit nur fünf Feldern:
- id
- type (welcher Datentyp dieser Eintrag ist)
- Menge (wie viele von welcher Art auch immer es ist)
- Einheit (die Einheit des Typs)
- Datum (die Uhrzeit, zu der der Eintrag vorgenommen wurde)
- user_id (die Kennung des Benutzers, der die
Also, nichts Ausgefallenes. Jetzt kann ein einzelnes Formular mehrere Einträge haben (sowohl bereits vorhandene als auch neu erstellte), das Formular wird über Ajax-Aufrufe erweitert.
Wenn ich das Formular abschicke $this->data
sieht so aus:
Array
(
[Entry] => Array
(
[date] => 2011-01-07
[0] => Array
(
[id] => 1
[type] => Eat
[amount] => 1 Steak, one baked potatoe
[unit] => lunch
[time] => Array
(
[hour] => 13
[min] => 31
)
)
[1] => Array
(
[type] => weight
[amount] => 78.5
[unit] => KG
[time] => Array
(
[hour] => 22
[min] => 22
)
)
)
)
Der erste Eintrag in $this->data['Entry']['date']
ist das Datum, das für ALLE Einträge verwendet werden soll. Und da auch die user_id fehlt, habe ich eine "beforeSave" Funktion im Eintragsmodell erstellt. Diese sieht wie folgt aus:
function beforeSave() {
App::import('Component','Session');
$this->Session = new SessionComponent();
if (isset($this->data) && isset($this->data['Entry'])) {
$date = $this->data['Entry']['date'];
unset($this->data['Entry']['date']);
foreach ($this->data['Entry'] as $n => $entry) {
if (is_array($entry)) {
$this->data['Entry'][$n]['date'] = $date . ' ' . $entry['time']['hour'] . ':' . $entry['time']['min'] . ':00';
$this->data['Entry'][$n]['user_id'] = $this->Session->read('Auth.User.id');
}
}
debug($this->data);
}
return true;
}
Ich entferne das Datum, füge es zusammen mit dem Zeiteintrag des Benutzers ein, wodurch ein mysql datetime-Eintrag entsteht, und füge die user_id des angemeldeten Benutzers hinzu. Eigentlich ganz einfach. Das resultierende Array (wie es von der letzten debug()
) sieht folgendermaßen aus:
Array
(
[Entry] => Array
(
[0] => Array
(
[id] => 1
[type] => Eat
[amount] => 1 Steak, 1 baked potatoe
[unit] => lunch
[time] => Array
(
[hour] => 09
[min] => 31
)
[date] => 2011-01-07 09:31:00
[user_id] => 2
)
[1] => Array
(
[type] => Weight
[amount] => 78.5
[unit] => KG
[time] => Array
(
[hour] => 22
[min] => 22
)
[date] => 2011-01-07 22:22:00
[user_id] => 2
)
)
)
So sieht es genau so aus, wie ich es haben möchte, und es sollte leicht zu speichern sein. Aber wenn ich $this->Entry->saveAll($this->data['Entry']
), um alle Einträge zu speichern, funktioniert es nicht nur nicht, sondern wenn ich Debug $this->data
direkt nach der saveAll-Funktion sieht es genauso aus wie vor der saveAll-Funktion - das Datum ist wieder im Array, die Einträge haben keinen date- oder user_id-Eintrag.
Ich kann sehen, dass beforeSave aufgerufen wird, ich kann sehen, dass es Änderungen $this->data
aber irgendwo zwischen dem Ende von beforeSave und der Verwendung von "saveAll" gehen alle meine Änderungen verloren und $this->data
wird in seinen ursprünglichen Zustand zurückversetzt. Es findet also keine Speicherung statt.