Kadang kita ingin mengubah isi suatu field tertentu tanpa memanfaatkan form update yang secara default akan menampilkan field lain yang tidak akan ikut ubah. Misal kita ingin mengubah field Status saja.
Cara nya sebetulnya sangat sederhana, hanya mengubah controller dan membuat view baru. Pada contoh kita ingin mengubah Status suatu dokumen yang mempunyai status Printed menjadi status lainnya.
Jika kita klik button Edit, maka akan muncul form perubahan status.
Pertama, di kontroler cuma tambah satu action baru spt ini:
public function actionStatus($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post())) {
Yii::$app->db->createCommand()->update('document_number', ['status' => $model->status], 'id='.$model->id)->execute();
return $this->redirect(['index']);
}
return $this->renderAjax('status', [
'model' => $model,
]);
}
Di controller cuma ada dua hal yaitu:
a. Menampilkan form status (di sini saya menggunakan renderAjax karena form saya tampilkan secara modal). Kalau kita mau yang biasa, ganti jadi return $this->render(‘status’, [
aja.
‘model’ => $model,
]);
b. Mengupdate tabel untuk record tertentu. Kalau di SQL seperti ini:
UPDATE `document_number`
SET `document_number`.`status` = $model->status
WHERE `document_number`.`id` = $model->id;
Di file kontroller kita terlihat Yii::$app->db->createCommand()->update(‘document_number’, [‘status’ => $model->status], ‘id=’.$model->id)->execute();
.
Ada return $this->redirect([‘index’])
itu maksudnya setelah perubahan status dilakukan screen akan ke index.php.
Lalu di bagian viewnya tambahkan file status.php dan _formStatus.php.
Kode form view status.php (sama persis dengan create.php kok) seperti ini:
<?= $this->render('_formStatus', [
'model' => $model,
]) ?>
Sedangkan _formStatus.php (dicopy dari _form.php) nya tapi ambil hanya bagian field yang akan kita ubah, seperti ini:
<?php $form = ActiveForm::begin([
'options' => ['onsubmit' => "myButton.disabled = true; return true;"
]]);
echo $form->field($model, ‘status’)->dropDownList([
‘Printed’=>‘Printed’,
‘Activated’=>‘Activate’,
‘Stored’=>‘Store’,
‘Lost’=>‘Lost’,
‘Damaged’=>‘Damage’,
‘Cancelled’=>‘Cancelled’,
],
[ ‘prompt’ => ‘Please Choose One’ ])->label(false);
?>
<?php echo Html::submitButton(' Save', ['class' => 'btn btn-info', 'name'=>'myButton']);
?>
Jadi form isinya gak ada yg lain.
Di kasus saya sih, rule dari model nya gak terpengaruh (maksudnya required atau gak suatu field). Jadi kita gak nyentul model sama sekali.
Gampang banget khan.
Itu aja…semoga berguna. Have a nice day ya.