2 model 1 form… pada yii framework…

Pada beberapa kasus, terkadang ada masalah dimana kita harus menginput nilai dari 2 buah model/table dalam satu form. Tentu saja hal ini dapat kita lakukan dengan mudah di Yii framework. Berikut cara nya :

Pada postingan saya kali ini, saya akan asumsikan kita memiliki 2 buah table di dalam satu database, misal table “satu” dan table “dua”. Saya asumsikan nilai Primary key pada table “dua” adalah sama dengan nilai Primary key pada tabel “satu”. Dan nama attribute Primary Key nya adalah “id”.

Pertama-tama, kita harus membuat model pada masing-masing tabel yang ingin dimasukkan(tentu hal ini bisa kita lakukan dengan menggunakan gii untuk mempermudah :D). Setelah itu akan ada dua buah model, yaitu model “Satu” dan model “Dua”. Lalu dengan menggunakan gii, anda buat sebuah code operasi CRUD dengan menggunakan CRUD generator yg ada dalam fitur gii(ingat cukup salah satu CRUD saja, misal CRUD utk model “Satu” atau CRUD untuk model “Dua”). Dalam postingan ini saya akan membuat CRUD untuk model “Satu”.
Setelah itu akan terbentuk sebuah controller dari model “Satu” pada protected/controller, silahkan anda buka controller tersebut. Coba lihat function “actionCreate()”, anda akan melihat code seperti berikut:

		$model=new Satu;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Satu']))
		{
			$model->attributes=$_POST['Satu'];
			if($model->save())
				$this->redirect(array('view','id'=>$model->id));
		}

		$this->render('create',array(
			'model'=>$model,
		));

Nah, silahkan rubah code tersebut menjadi seperti berikut:

$model=new Satu;
		$model2=new Dua;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Satu'],$_POST['Dua']))
		{
			$model->attributes=$_POST['Satu'];
			$model2->attributes=$_POST['Dua'];

		        $valid=$model->validate();
		        $valid=$model2->validate() && $valid;

			if($valid)
			{
				if($model->save(false))  
				{  
					$model2->duasatu = $model->satusatu;  
					$model2->save(false);
					$this->redirect(array('view','id'=>$model->satusatu));
				}
			}	
		}

		$this->render('create',array(
			'model'=>$model,
			'model2'=>$model2,
		));

Penjelasan:

($model2=new Dua; ) ini maksud ny kita mendeklarasikan sebuah model baru yang kita ambil dari model “Dua”.

 $valid=$model->validate();
 $valid=$model2->validate() && $valid;

	if($valid)
	{
		if($model->save(false))  
		{  
			$model2->id = $model->id;  
			$model2->save(false);
			$this->redirect(array('view','id'=>$model->id));
		}
	}

Nah, $valid adalah sebuah variabel yang digunakan untuk mengecek apakah nilai yang di input oleh user di dalam form sudah memenuhi syarat dari validasi yang sudah kita tentukan. Sedangkan pernyataan yang ada di dalama “if($model->save(false))” berguna untuk melakukan penyamaan nilai Primary Key pada table “dua” sesuai dengan Primary Key pada table “satu”. Maksud dari “$model2->save(false)” adalah nilai dari model tersebut akan disimpan dalam database tanpa melakukan validasi terlebih dahulu, kenapa? karena hal tersebut sudah dilakukan pada “$valid”. Dan setelah disimpan ke dalam database, aplikasi akan langsung di arahkan ke tampilan view dari data yang sudah di masukkan tadi.. hal itu terlihat dari code “$this->redirect(array(‘view’,’id’=>$model->id));”.
Nah, sampai disini kita telah selesai membuat operasi untuk menyimpan data dari dua model yang berbeda, sekarang tinggal kita buat tampilan dari fungsi tersebut…

Membuat tampilan sendiri tidak bisa sembarangan, kita harus pastikan nilai yang ada pada tampilan harus terhubung ke model yang ada di controller tadi. Okeh, pertama-tama buka views dari operasi create yang ada pada “protected/satu/create.php”, lalu temukan code seperti beriktu: “renderPartial(‘_form’, array(‘model’=>$model)); ?>”. Setelah anda temukan, tambahkan sedikit code yang memanggil model “Dua”, sehingga akan menjadi seperti berikut:
“<!–?php echo $this->renderPartial(‘_form’, array(‘model’=>$model,’model2’=>$model2)); ?>”
Nah, model2 yang di tambahkan disana adalah nilai dari model2 yang sudah kita deklarasikan pada controller, sehingga kita bisa menghubungkan form dengan model “Dua”. Setelah itu, silahkan buka “protected/satu/_form.php”, di dalam nya mungkin akan tersedia beberapa tag html yang berguna sebagai inputan yang menampung nilai-nilai yang di masukkan user. Hanya saja disana hanya terdapat nilai inputan untuk model “Satu” saja. Nah, anda dapat menambahkan tag html untuk menampung nilai pada model “Dua” dengan cara menambahkan tag seperti berikut:

	<div class="row">
		<!--?php echo $form->labelEx($model2,'duadua'); ?>
		textField($model2,'duadua',array('size'=>30,'maxlength'=>30)); ?>
		error($model2,'duadua'); ?>
	</div>

Nah, disana anda bisa melihat pada masing-masing tag diberi $model2 yang artinya tag html tersebut dimiliki oleh model “Dua”. Sedangkan “duadua” adalah nama dari attribut pada table “Dua”.

Selesai, anda dapat mencoba melakukan operasi “Create” pada form itu….

Selamat mencoba…. semoga membantu…😀

68 Responses to 2 model 1 form… pada yii framework…

  1. Pingback: [view] 2 model 1 form… pada yii framework… « Sabitlabscode

  2. SkyLine says:

    gan saya mau tanya itu model 2 nya kalau kita ingin menambahkan lg isa gak?
    jadi model 2 nya bisa lebih dari 1, di form tsb.itu bagaimana ya?
    seperti multimodel form di extension yii,cm saya masih kurang puas krn tidak bisa custumize T.T
    tq gan

  3. sabitzhabit says:

    bisa gan, agan tambahin aja model yang mau agan pake. Dan jangan lupa di view ny juga di edit gan…😀

  4. gan tahu CTreeView? nah gan ane pengen buat kayak gitu tapi yang ada button di samping textnya misalnya

    + ROOT [Add child] [Delete Root]

    nah kayak gini bagaimana ya gan? kemarin gagal buat CTreeView nya. hehee😀 . makasih gan, sebelumnya ! (rin)

  5. sabitzhabit says:

    oh, udah pernah buat sistem pakar kek gtu gan.. itu terhubung ke database gan.. nanti ane buat postingan khusus gan.. cz skrg lagi ngerjain skripsi.. mepet mau seminar, hehe..

    btw, ni yg id “rin” di forum ny yii ya? hoho salam kenal gan..

    • Novi Indra says:

      gmn mas, postingan tentang ini.?? ane tgg

      • wah, sory banget nih.. saya udah lama banget lupa..
        sekarang saya lagi sibuk juga mbak, saya kasih clue nya aja ya.
        mbak jadiin aja nilai2 pada tree nya itu jadi sebuah link yang ngirim parameter id dia sendiri, kemudian parameter itu lah yang di pasang untuk jadi field induk nya..

        kalo mau lebih cantik, saat di klik, dia muncul dialog aja.. jadi nanti pake AJAX mbak..

  6. heeee😀. salam kenal juga fan!

  7. angel says:

    “Saya asumsikan nilai Primary key pada table “dua” adalah sama dengan nilai Primary key pada tabel “satu” ” -> bukan foreign key????
    jadi kalo misal q punya tabel hp n tipe jadi id type masuk jd foreign key di tabel hp nya. tp tabel hp itu jg punya id sendiri.
    soalna q mau bikin form yang modelnya join 2 tabel kaya gitu….
    caranya sama ga???
    tq

  8. sabitzhabit says:

    oh, ga.. yang saya mksd beda kasus. Misal tabel yang hubungannya 1 to 1. Tapi klo mau seperti contoh kasus yang anda paparkan di atas, primary key di tabel 2 menjadi foreign key di tabel 1. Untuk msalah hp dan tipe, baiknya dibuat terpisah antara form input untuk tabel hp dan tabel tipe. Tapi di tabel hp ny ada sebuah dropdownlist yang isinya memilih dari tabel tipe tadi…

  9. angel says:

    oh….
    ok….
    tq tq….

  10. emp4tbelas says:

    gan ane mau nanya nih, kira kira bisa ga ya, satu textField dalam sebuah form, itu di simpen ke dua tabel dalamsatu submit

    contoh

    $form->textField($model,’name’);
    => disimpan ke tabel A dan tabel B

  11. sabitzhabit says:

    bisa gan, di atur aja di controllernya misal :
    $model1=new Tabel1;
    $model2=new Tabel2;
    $model1->namaAttribute=$_POST[‘namatext’];
    $model2->namaAttribute=$_POST[‘namatext’];

  12. fachrizal says:

    wah ini yang ane cari tp masih agak beda, tabel yang saya punya tu 1 ke banyak gan ,,, gmana ya gan ????

    mohon solusinya gan ,,, ane tanya di kaskus juga gan ,,, ni linknya gan >

    http://www.kaskus.us/showthread.php?p=590767087&posted=1#post590767087

  13. kokoadi says:

    Saya mau tanya bagaimana caranya bikin edit datanya pada kasus anda dengan pasing parameter dari pk tabelnya?
    Bagaimana membikin aktif radiobutton dari fieldnya.
    Trims atas bantuannya.

  14. imronimss says:

    gan mw tanya, kalo kasus ane.. tabel nya : riwayat pendidikan dosen dan riwayat pekerjaan dosen
    nah ane mw jadiin satu form input, field yang sama dari keduanya adalah id_dosen yang merupakan foreign key ke tabel dosen…..
    nah gmn cara buat ngesave nya sedangkan primary key dari kedua tabel berbeda……

  15. di save dengan cara biasa aja gan.. primary key buat auto increment aja.. cuma foreign key nya aja yang harus di pastiin sama gan..

  16. adi says:

    kok coba tutorial di atas yang kluar cuma halaman kosong ya?salah dimananya ya?

  17. di coba di pelajri dulu gan dari awal.. ini masih dasar soalnya gan..

  18. mugi wiguna says:

    mas sabit mau nanya
    $model2->duasatu = $model->satusatu;
    $model2->save(false);
    $this->redirect(array(‘view’,’id’=>$model->satusatu));
    nah yang duasatu sama satusatu itu nama apanya ?

  19. itu field/attribute ny mbak..

  20. mugi wiguna says:

    udah ngikutin yang di atas ko hasilnya gini ya

    Fatal error: Call to a member function getErrors() on a non-object in E:\xampp\htdocs\yiimugi\framework\web\helpers\CHtml.php on line 1592

  21. Ricko says:

    mas, klo otomatis update, datanya masuk kedua tabel tanpa melalui form,..
    gimana ya gan?mohon batuan gan..

  22. mugi wiguna says:

    pas buat di update gimana yah ?
    error nya disini
    “$model=$this->loadModel($id);”

  23. asepmylocal says:

    kalo update bermasalah gan
    get_class() expects parameter 1 to be object, null given

  24. devan says:

    Om code saya gini
    public function actionCreate()
    {
    $model=new transaksi;
    $model2=new Customer;
    if(isset($_POST[‘transaksi’],$_Post[‘Customer’]))
    {
    $model->attributes=$_POST[‘transaksi’];
    $model2->attributes=$_POST[‘Customer’];
    $valid=$model->validate();
    $valid=$model2->validate() && $valid;
    if($valid)
    {
    if($model->save())
    {
    $model2->Customer= $model->transaksi;
    $model2->save();
    $this->redirect(array(‘view’,’id’=>$model->No_Order));
    }
    }
    }
    $this->render(‘create’,array(
    ‘model’=>$model,
    ‘model2’=>$model2,
    ));
    }
    tp ga kesimpe k database nya malah rendering di form za jd blank
    truz errorSummary nya jg jd ga fungsi…..
    tolong bantuan nya

  25. @asep : ada fungsi yang agan panggil parameter nya kelebihan/kekurangan.
    @devan : kemungkinan dia ga lolos saat pengkodisian “if(isset($_POST[‘transaksi’],$_Post[‘Customer’]))” kyak nya transaksi itu “t” nya pake huruf besar mngkin..

  26. AIMAGU says:

    Gan, ane mau tanya… untuk proses updatenya gmn ya? bisa berikan contohnya agan Sabit Huraira… .

  27. Adi Topandi says:

    Mas saya ccoba tutori di atas kok keluar error gne ?

    Fatal error: Call to a member function isAttributeRequired() on a non-object in D:\xampp\htdocs\yii\framework\web\helpers\CHtml.php on line 1237

    itu kira2 kenpa yah?

  28. wah, baru liat jga yg gitu. pake framework versi brapa mas?

  29. devan says:

    mas, klo bentuk di form nya gmna ya,, klo pengen dari 1 textfield langsung k 2 tabel???

    • agan tangkep dlu nilai nya di controller misal $_POST[‘namaTextField’] terus di lempar ke dua buah tabel/model sekaligus:

      $model->attribute1=$_POST[‘namaTextField’];
      $model2->attribute1=$_POST[‘namaTextField’];

  30. Dibyo says:

    Hallo mas ketemu lagi,,,
    Mas saya udah oke untuk createnya jika mau di update gimana ya mas???
    mas adakah extension untuk 2 model seperti ini??? thanks mas sabit..

    • ga ada extensionnya gan.. cuma perlu diakalin aja sih..

      • dibyo says:

        Bener cuman diakalin akhirnya bisa mas sabit.
        Mas Sabit OOT ya..
        Mas sabit kan pernah membuat gantt chart dengan dojo,
        Nah, saya baru stuck untuk bagaimana membuat jadwal kerja shift satpam yang berkesinambungan jika berubah bulan. Apakah menggunakan table temp terlebih dahulu ataukah pakai store procedure atau pake event trigger/transaction di yii..?

      • pake biasa aja ga gan? memang kenapa harus pake table temp nya gan? (mungkin saya yang kurang paham kasusnya). Tapi kalo saya pribadi kalo yang model shift/jadwal lebih prefer pake kalender seperti full calendar gan.. gantt chart peruntukan lebih ke timeline/deadline project..

      • dibyo says:

        Mungkin saya pake fullcalendar dan disitu aq pasang checkbox untuk hasilnya nanti diposting ke table semua. Semoga saja bisa … malah saya browsing2 ada yg pake Metode Decision Tree untuk membuat jadwal shift sebuah karyawan di sebuah perusahaan. paper dosen sih mas. Pesimis duluan saya…😦

      • saya agak bingung kalo penggunaan decision tree di penjadwalan gitu (mungkin saya belum terlalu paham kasus nya). Decision tree cocok untuk hal2 yang ada hirarki nya seperti bagan organisasi.. Kalo mau buat chart seperti ini, coba cari aja di google chart gan… disitu uda ada..

      • dibyo says:

        terimakasih mas Sabit sudah berbincang2.. dibalik kesusahan, terdapat kemudahan. Semoga saja😀

      • dibyo says:

        Mas sabit, punya tutorial yg berhubungan dengan transaction???

      • ga punya juga gan..

  31. Lutfi Achmad says:

    maaf bang, table kedua saya adalah berisi gambar, kalo saya nampilin di form view,
    widget(‘zii.widgets.CDetailView’, array(
    ‘data’=>$model,$model2, //hasilpercobaan saya yang salah, bagaimana seharusnya, terima kasih

    ———————————

  32. mksd nya gimana gan? saya kurang nangkep apa yang dtanya?

  33. dini says:

    mas kalo insert role trus masuk di table user sm tabel di rbac gmn ya?

  34. Ipoel Gaara says:

    Permisi gan.. Klo misal nyimpannya dari 1 textfield gimana??
    Cara diatas kan nyimpan dari 2 textfield ke dalam 2 tabel..
    Mohon bantuannya..

  35. dewi says:

    kalo: saya punya tabel, berita, buku, komentar, dan gimana cara nya agar saya bisa menghubunkan tabel komentar pada 2 tabel tersebut…,

    • ditambahkan 2 buah field di tabel komentar. 1 field untuk meyimpan informasi apakah dia terhubung ke buku/komentar dan 1 field lagi untuk tahu komentar/buku mana yang terhubung dengan dia.

  36. dellisa says:

    gan mau tanya (newbie ni)
    kasusnya hmpr sama cuma sy tapi punya 3 tabel (siswa, jurusan, siswajurusan).
    ketika sy create tabel siswa, nanti ada field yg isinya memilih jurusan(dengan dropdownlist).
    di tabel siswajurusan isinya ada id_siswajurusan, id_jurusan, id_siswa.
    biar bisa nampilin dropdownlist-ny itu gimana? soalny dropdownlistnya ambil dari tabel jurusan,
    terus supaya id_jurusannya juga tersimpan ke tabel siswajurusan?

  37. mas.. mau tanya..
    kalau buat user identity itu bisa pake 2 model jga ngga yaa ?
    buat validasi login user dan admin..🙂

  38. Firman Alif says:

    mas mau tanya, klo misalkan disalah satu tablenya ga ada primary key cuma buat detail aja itu gimana ya codingnya, saya udah coba cara diatas ga bisa
    makasih mas

  39. mashar01 says:

    mas, mau tanya saya punya tabel Barang
    Tabel_Barang
    Id_barang
    kd_barang
    nama_barang
    nama_barang1
    keterangan

    bagaimana caranya ketika save Field nama_barang1 otomatis keinput sama dengan nama_barang. Tks

  40. ub Nezad says:

    mas mau nanya, kalau untuk update nya bagaimna ya ??

  41. mas mau minta tolong ni..buat manggil form dr form 1 ke form 2,3,4 dan sterusnya gimana ya?
    sukron,

  42. Irmawati Ma'idah says:

    Kak mau tanya, bisa nggak inputan satu tabel tapi dari beberapa form, menggunakan gii kan defaultnya jadi satu tampilan saja, tapi saya maunya menjadi 3 tampilan inputan.

  43. anindya says:

    mas gimana ya melempar nilai ke satu field aja yang ada di tabel yang lain tp juga menggunakan validasi?
    contohnya: saya mempunyai 2 tabel=> tabel status dan tabel sn
    tabel status punya field id_status, id_office, id_spare, status
    tabl sn punya field id_sn, id_office, id_spare, id_status, serial_number

    permasalahannya saya ingin mengisi filed id_status yg ada di tabel sn pada saat create status
    dengan kondisi jika id_office dan id_spare di tabel status dan tabel sn sama

    tolong bantuannya ya mas….

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: