Datensatz Kopieren

Hallo,

ich möchte den in einem Formular angezeigten Datensatz kopieren. Also alle Werte bis auf den Primärschlüssel sollen im neuen DS gleich wie im alten sein und der kopierte DS soll im Formular auch gleich angezeigt werden, damit ihn der Benutzer manuell ändern kann.

Ich nehme an, dass man das elegant mit Yii erledigen kann. Hilft mir jemand auf die Sprünge?

Hier ist die Lösung mit einer Controller Action, die den Datensatz kopiert, speichert und zur Bearbeitung anzeigt:


public function actionCopy($id) {

  $modelOld = $this->loadModel($id);

  $modelNew = clone $modelOld;

  unset($modelNew->Id);

  $modelNew->isNewRecord = true;


  if($modelNew->save()) {

      $this->redirect(array('update','id'=>Yii::app()->db->getLastInsertId()));

  }

}

Ich glaube, ich würde es auch so machen. Nur, dass man das vielleicht ins Model legen könnte. Der Controller soll ja schlank bleiben. Außerdem würde ich noch einen else-Zweig anlegen.

In den Else Zweig sollte wahrscheinlich eine Error Meldung:


if($modelNew->save()) $this->redirect(array('update','id'=>Yii::app()->db->getLastInsertId()));

else throw new CException('Datensatz konnte nicht kopiert werden.');

Sinnvoll wäre vielleicht auch eine Meldung, wenn der DS erfolgreich kopiert worden ist.

Das einzige, woran man erkennt, dass der DS kopiert wurde, ist die neue Id (die im Formular angezeigt wird). Es kann also sein, dass der User das nicht bemerkt und glaubt, es ist nichts geschehen und noch einmal auf "kopieren" klickt …

Nein, eine Exception ist wohl nicht passend. Das Problem würde ich loggen - mit allen nötigen Informationen, die nützlich sein könnten.

Ansonsten würde ich halt diese Flash-Messages verwenden, um dem Benutzer ein passendes Feedback (Erfolg/Fehler) zu geben. Das könnte so gehen:

Das nur mal als Anregung…

Danke für diese Anregung. So habe ich es jetzt gemacht:




if($modelNew->save()) {

  Yii::app()->user->setFlash('success',"Ein neuer Datensatz wurde gespeichert und kann hier bearbeitet werden.");

  $this->redirect(array('update','id'=>Yii::app()->db->getLastInsertId()));

} else Yii::app()->user->setFlash('success',"Der Datensatz konnte nicht kopiert werden.");