Kode Transaksi [_____________]
Tgl Transakasi [_____________]
Detil Transaksi
------------------------------------------------------------------
Kode Barang [______________] Quantity [________] [+]
------------------------------------------------------------------
1. Kode ABC 10 [x]
2. Kode BBB 20 [x]
3. Kode CCC 30 [x]
------------------------------------------------------------------
Form entri detil transaksi hanya 1 macam, saat kode dan quantity dimasukkan lalu ditekan tombol plus, maka data barang akan masuk sebagai baris pada tabel. Baris di tabel detil transaksi masing-masing dilengkapi tombol silang, jika diklik maka detil barang akan dihapus. Viewnya ketambahan:
...
<?php echo $form->textField($model,'TglTrans'); ?>
</div>
<hr>
<div class="inline-row">
<?php echo CHtml::activeLabelEx($modelDetail,'KdBarang'); ?>
<?php echo CHtml::activeTextField($modelDetail,'KdBarang'); ?>
</div>
<div class="inline-row">
<?php echo CHtml::activeLabelEx($modelDetail,'Jumlah'); ?>
<?php echo CHtml::activeTextField($modelDetail,'Jumlah'); ?>
</div>
<div class="inline-row">
<?php echo CHtml::button('+', array('id'=>'add-detail')); ?>
</div>
<table id="tabel-detail">
<thead>
<tr><td>Kode</td><td>Quantity</td></tr>
</thead>
<tbody>
</tbody>
</table>
<?php $this->endWidget(); ?>
...
<?php Yii::app()->clientScript->registerScript('tambah-detail-transaksi', '
var i = 0;
$("#add-detail").click(function() {
var kode = $("#txt-kode-barang").val();
var jumlah = $("#txt-jumlah").val();
var hiddenInput = "<input type=\"hidden\" name=\"TransDetail[" + i + "][KdBarang]\" value=\" + kode + \">";
hiddenInput += "<input type=\"hidden\" name=\"TransDetail[" + i + "][Jumlah]\" value=\" + jumlah + \">";
$("#tabel-detail > body").append("<tr><td>" + kode + "</td><td>" + jumlah + hiddenInput + "</td></tr>");
i++;
});
'); ?>
untuk simpannya, terdiri dari 2 bagian, persiapan data yg mo disimpan di kontroller, lalu proses simpanya di model.
Jadi Kontrollernya kurang lebih begini:
$theader = new TransHeader;
$tHeader->attributes = $_POST['TransHeader'];
$listDetail = array();
foreach ($_POST['TransDetail'] as $index=>$detail) {
$tdetail = new TransDetail;
$tdetail->attributes = $detail;
array_push($listDetail, $tdetail);
}
$theader->details = $listDetail;
if ($theader->saveAll()) {
//berhasil
} else {
//gagal simpan, perlu repopulate form, silahkan jadikan latihan
}
lalu model TransHeader perlu ditambahi method saveAll() untuk simpan seluruh data (header+detail), karena proses simpan TransHeader dan TransDetail kan atomic (harus berhasil semua atau gagal semua jika gagal salah satu).
contoh:
public function saveAll() {
$transact = $this->dbConnection->beginTransaction();
$green = $this->save(); //simpan header
if ($green) {
foreach ($this->details as $tdetail) { //simpan detail satu persatu
$tdetail->KdTrans = $this->KdTrans;
$green = $green && $tdetail->save();
}
}
if ($green) {
$transact->commit();
return true;
} else {
$transact->rollback();
return false;
}
}
ya kurang lebih begitu lah.
Catatan kode2 di atas hanya konsep, bukan untuk dijiplak mentah2, tolong pahami alurnya dulu, lalu kembangkan sesuai kebutuhan (tambahan datepicker untuk tanggal, try catch exception saat saveAll, autocomplete kode + nama barang, dsb).
Pada tahap kedua datanya masih ada di client, belum berangkat ke server.
Jika diklik tombol tambah -> maka datanya akan masuk ke tabel (untuk presentasi) sekaligus dibuatkan hidden field (untuk submit nanti setelah memilih semua).
gpp, pak. Gak-paham itu penyakit, obatnya bertanya
deklarasi dan load semua variabel yg ada view selalu melalui controllernya. Misalnya nama viewnya view/trans/master_detail.php, maka di controllernya ditambahin kode untuk inisialisasi variabel jika halaman dipanggil menggunakan GET, contoh modifikasi:
$theader = new TransHeader;
$tdetail = new TransDetail;
if (Yii::app()->request->isPost()) {
//bagian proses submit
$tHeader->attributes = $_POST['TransHeader'];
$listDetail = array();
foreach ($_POST['TransDetail'] as $index=>$detail) {
$tdetail = new TransDetail;
$tdetail->attributes = $detail;
array_push($listDetail, $tdetail);
}
//dst
}
$this->render('trans/master_detail', array(
'model'=>$trans,
'modeldetail'=>$transDetail,
));