[Yii Framework] Insert Banyak Data dengan Jappendo
May 28, 2012 16 Comments
Menanggapi request seorang teman yang ingin menginput banyak data sekaligus pada suatu tabel dengan menggunakan JAppendo. Dengan kasus misal input tabel dosen dan mahasiswa. Dimana dia ingin menginput beberapa data mahasiswa, mahasiswa diinput satu persatu, tetapi dosen hanya sekali terisi. Dimana semua nama mahasiswa tadi akan memiliki dosen yang telah diinput satu kali tadi. Sama seperti tutor tentang jappendo sebelumnya, kita definisikan dulu view di Jappendo yang kita miliki :
<table class="appendo-gii" id="<?php echo $id ?>"> <thead> <tr> <th>Nama Mahasiswa</th><th>Kelas</th> </tr> </thead> <tbody> <?php if (count($model) == 0): ?> <tr> <td><?php echo CHtml::textField('nama[]','',array('style'=>'width:190px')); ?></td> <td><?php echo CHtml::textField('kelas[]','',array('style'=>'width:190px')); ?></td> </tr> <?php else: ?> <?php //for($i = 0; $i < count($model); ++$i): foreach ($model as $value){ ?> <tr> <td><?php echo CHtml::textField('nama[]',$value->dosis,array('style'=>'width:90px')); ?></td> <td><?php echo CHtml::textField('kelas[]',$value->jumlah,array('style'=>'width:90px')); ?></td> </tr> <?php } ?> <tr> <td><?php echo CHtml::textField('nama[]','',array('style'=>'width:90px')); ?></td> <td><?php echo CHtml::textField('kelas[]','',array('style'=>'width:90px')); ?></td> </tr> <?php endif; ?> </tbody> </table>
Nah, pada kasus di atas saya umpamakan ada field: dosen, mahasiswa dan kelas. Di jappendo di atas hanya disimpan field mahasiswa dan kelas. Tapi di tidak ada field dosen..
Dimana field dosen, kita akan menambahkan field dosen di luar jappendo. Dimana nantinya user tinggal menginput field dosen 1 kali, dan mahasiswa bisa berkali-kali sesuai jumlah mahasiswa yang diinput. Setelah itu semua mahasiswa yang kita input tadinya akan memiliki nama dosen sesuai dengan yang sudah kita input sebelumnya.
Untuk membuat alur seperti itu, di form tempat kita input nanti masukkan code seperti berikut :
<div class="form"> <?php $form=$this->beginWidget('CActiveForm', array( 'enableAjaxValidation'=>false, )); ?> <p class="note">Fields with <span class="required">*</span> are required.</p> <?php echo $form->errorSummary($model); ?> <div class="row"> <?php echo $form->labelEx($model,'diagnosa'); ?> <?php echo $form->textField($model,'diagnosa',array('size'=>60,'maxlength'=>255)); ?> <?php echo $form->error($model,'diagnosa'); ?> </div> <div class="row"> <?php $this->widget('application.extensions.appendo.JAppendo',array( 'id' => 'repeateEnum', 'model' => $model, 'viewName' => 'namaViewJappendo', 'labelDel' => 'Remove Row', )); ?> </div> <div class="row buttons"> <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?> </div> <?php $this->endWidget(); ?> </div>
Kemudian setelah itu kita setting pada controller agar alur nya dapat sesuai dengan yang kita inginkan..
public function actionCreate() { $model=new Mahasiswa; if(isset($_POST['Mahasiswa'])) { $total = count($_POST['nama']); for ($i = 0; $i <= $total; $i++) { if(isset($_POST['nama'][$i])) { $model2 = new Mahasiswa; $model2->dosen =$_POST['Mahasiswa']['dosen']; $model2->nama=$_POST['nama'][$i]; $model2->kelas=$_POST['kelas'][$i]; $model2->save(); } } $this->redirect(array('admin')); } $this->render('create',array( 'model'=>$model, )); }
Pada code di atas kita memasukkan data mahasiswa dengan memasukkan masing-masing field yang ada pada jappendo.. Tetapi untuk field dosen kita ambil dari inputan dosen yang telah ada bukan di jappendo melainkan di form tersebut dan hanya diinput satu kali..
Selesai..
Selamat mencoba.. Semoga membantu..
kak di bagian ini “if (count($model) == 0)” kgk kedetect,
di controllernya
$model=new Mahasiswa;
mksd ny g ke detect gimana gan?
dia langsung ke elsenya kak, jadinnya pas
dosis,array(‘style’=>’width:90px’)); ?>
errornya Trying to get property of non-object
mungkin nilai $model nya ada yang terganti gan.. jadi nilai bukan lagi “new Mahasiswa”. Jadinya nilai nya lebih dari 0..
maksudnya gmn gan? msh blom ngerti, maklum newbi
coba di cek lagi gan model nya. Mungkin agan ada salah karena model nya ketimpa nilai yang lain sehingga dia jadi lebih dari 1 nilai nya..
mas, bisa dijelasin lagi untuk pembuatan view di jappendo nya, kok di baris yang ini
dosis,array(‘style’=>’width:90px’)); ?>
jumlah,array(‘style’=>’width:90px’)); ?>
ane salah, katanya “define non-object…”
trus ane lihat di postingan yang sebelumnya, parameter kondisinya kok beda2
sekarang jika count($model) == 0
sebelumnya jika ($model->mahasiswa == null)
bedanya apa ya mas? maaf ane newbe…
waduh telat gabung nih ane, gan masalah yg ane dapet sama kayak abang fajar di atas.
dosis,array(‘style’=>’width:90px’)); ?>//dosis itu apa nama variable gan??
jumlah,array(‘style’=>’width:90px’)); ?>//jumlah itu apa nama variable gan??
$model ane udah dicek tapi kayaknya gpp deh
Semoga masih dibales.tengkyu gan
itu error karena data yang di lempar ga ada gan… ikutin yang ini aja gan… kalo yang lama ngecek apakah ada isi nya si field mahasiswa. Kalo yang ini dia ngitung dulu total data yang di lempar, kalo jumlah nya nol dia ga masuk ke dalam kondisi if nya gan…
menarik sekali. tapi saya coba saya dapat error begini kenapa ya?
CDbCommand gagal menjalankan statementSQL: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`akunting`.`jurnal`, CONSTRAINT `fk_jurnal_produk1` FOREIGN KEY (`kode_produk`) REFERENCES `produk` (`kode`) ON DELETE NO ACTION ON UPDATE NO ACTION). The SQL statement executed was: INSERT INTO `jurnal` (`no***`, `ta****`, `ko***`, `d****`, `k****`, `ko****`, `ko*******`,`ko******`, `ket********`) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7, :yp8)
trims sebelumnya
o ya controller saya seperti ini:
public function actionCreate()
{
$model=new Jurnal;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST[‘Jurnal’]))
{
$total = count($_POST[‘ko*****’]);
for ($i = 0; $i findBySQL(“select max(nomor) as nomor from j****”)->nomor;
$model2->nomor = $nomor_akhir+1;
$model2->tanggal = $_POST[‘J****’][‘tanggal’];
$model2->ko*****=$_POST[‘ko****’][$i];
$model2->d****=$_POST[‘d****’][$i];
$model2->k*****=$_POST[‘k*****’][$i];
$model2->k*****=$_POST[‘k****’][$i];
$model2->k******=$_POST[‘k*****’][$i];
$model2->k*******=$_POST[‘k********’][$i];
$model2->ket*******=$_POST[‘ket******’][$i];
$model2->save();
}
}
//$model->attributes=$_POST[‘Jurnal’];
$this->redirect(array(‘admin’));
}
$this->render(‘create’,array(
‘model’=>$model,
));
}
itu karena foreign key nya ga ada data nya di tabel master nya gan..
kalo untuk actionUpdatenya gimana bit?? biar bisa ngeload data pada jappendonya langsung
saya udah pernah posting itu gan.. coba di cari aja..
Kunjungi Juga Farifam.com untuk tutorial dan forum Yii Framework yang lebih lengkap dan direspon lebih cepat dari di blog ini..
Pingback: [Yii Framework] Update Data Table/ Grid Form With JQrelCopy | Sabitlabscode
Gan kenapa saya tidak bisa simpan datanya ke dalam database?
Mohon pencerahannya ya gan