Di bagian sebelumnya kita telah berhasil memodifikasi form create untuk menambahkan purchase order.
Perlu dicatat bahwa formId pada property DynamicFormWidget harus sesuai dengan id pada ActiveForm, begitu juga insertButton dan deleteButton juga harus ditambahkan classnya pada form.
Di bagian ini kita akan melakukan saving record ke dalam database.
1. Buat model class, copy paste saja dari webnya wbraganca di bagian Model, dan buat file Model.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php namespace backend\models; use Yii; use yii\helpers\ArrayHelper; class Model extends \yii\base\Model { /** * Creates and populates a set of models. * * @param string $modelClass * @param array $multipleModels * @return array */ public static function createMultiple($modelClass, $multipleModels = []) { $model = new $modelClass; $formName = $model->formName(); $post = Yii::$app->request->post($formName); $models = []; if (! empty($multipleModels)) { $keys = array_keys(ArrayHelper::map($multipleModels, 'id', 'id')); $multipleModels = array_combine($keys, $multipleModels); } if ($post && is_array($post)) { foreach ($post as $i => $item) { if (isset($item['id']) && !empty($item['id']) && isset($multipleModels[$item['id']])) { $models[] = $multipleModels[$item['id']]; } else { $models[] = new $modelClass; } } } unset($model, $formName, $post); return $models; } } |
2. Modifikasi PurchaseorderController.php di bagian actionCreate , sebelumnya pastikan dari rules ‘po_id’ pada model PurchaseOrder.php tidak required.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public function actionCreate() { $model = new PurchaseOrder(); $modelsPoItem = [new PurchaseOrderItem]; if ($model->load(Yii::$app->request->post()) && $model->save()) { $modelsPoItem = Model::createMultiple(PurchaseOrderItem::classname()); Model::loadMultiple($modelsPoItem, Yii::$app->request->post()); // validate all models $valid = $model->validate(); $valid = Model::validateMultiple($modelsPoItem) && $valid; if ($valid) { $transaction = \Yii::$app->db->beginTransaction(); try { if ($flag = $model->save(false)) { foreach ($modelsPoItem as $modelPoItem) { $modelPoItem->po_id = $model->id; if (! ($flag = $modelPoItem->save(false))) { $transaction->rollBack(); break; } } } if ($flag) { $transaction->commit(); return $this->redirect(['view', 'id' => $model->id]); } } catch (Exception $e) { $transaction->rollBack(); } } } else { return $this->render('create', [ 'model' => $model, 'modelsPoItem' => (empty($modelsPoItem)) ? [new PurchaseOrderItem] : $modelsPoItem ]); } } |
Kode tersebut sudah ada di website wbraganca, kita hanya tinggal mengganti variablenya saja.
3. Coba untuk memasukkan record ke dalam http://localhost/advanced/backend/web/index.php?r=purchaseorder/create
Akan muncul di database nilai yang kita isikan.
Tutorial ini sebagai dokumentasi dan pembelajaran pribadi sekalian belajar terjemahin bahasa Inggris, dan siapa tahu bermanfaat buat orang lain. Sumber lengkapnya diambil dari Youtube DoingITEasy Channel.
Yang di bagian ini
$modelPoItem->po_id = $model->id;
$model->id itu ngambil dari mana gan??
$model nya ambil dari Object PurchaseOrder gan. Sesuai yang diisikan di formnya. Kalau mau ngecek, di baris 7 tambahin print_r aja terus di die().
Kok Gak bisa ya di create??