[Yii Framework] Membuat attribute entry form yang saling terhubung ex: tabel provinsi, kabupaten,kecamata

Baru saja saya mendapat contoh code membuat entry form yang saling terhubung dari teman saya Yosua Natanael Sianturi(thanks yos sharing nya). Yah, sekalian saja saya share disini siapa tau ada yang butuh.

Misal saya punya 3 tabel pada database saya, yaitu tabel “Provinsi”, “Kabupaten”, dan “Kecamatan”. Ketiga tabel tersebut jelas saling berhubungan, dimana provinsi memiliki kabupaten, dan kabupaten memiliki kecamatan. Untuk menghindari kesalahan pengentrian, maka saya akan buat teknik pengentriannya dengan dropdownlist. Nah, masalah nya adalah bagaimana cara nya agar kita bisa menghindari kesalahan pengentrian dari sisi hubungan tabel nya. Ga mungkin kan, kalo seandainya Kota “Makassar” masuk ke dalam provinsi “Jawa Tengah”. Maka dari itu kita harus membuat form tersebut saling terhubung.

Yang akan saya buat adalah entri data pada tabel kecamatan. Pada tabel kecamatan ada informasi tentang “Provinsi” dan “Kabupaten” nya, dimana antara Provinsi dan kabupaten harus teliti. Misal, saya memilih provinsi Jawa Timur, maka pilihan yang akan di tampilkan pada attribut kabupaten adalah semua nama kabupaten pada provinsi Jawa Timur, diluar provinsi Jawa Timur tidak akan di tampilkan.

Okeh langsung saja kita bahas codingnya…

Pertama, buatlah code berikut pada controller kecamatan:

	public function actionTampilKabupaten()
	{
		$propinsi = $_GET["propinsi"];
		$sql= Kabupaten::model()->findAllByAttributes(array('propinsi'=>$propinsi));
		echo "<option>--Pilih Kabupaten--</option>";
		foreach ($sql as $i)
		{
			echo '<option value="'.$i->id.'">'.$i->kabupaten.'</option>';
		}
	}

Penjelasan : code di atas digunakan untuk memasukkan semua nilai dari tabel kabupaten yang memiliki id provinsi tertentu. Nilai yang dihasilkan dari code tersebut akan secara otomatis di masukkan ke dalam sebuah dropdownlist kabupaten yang akan kita tuju.

Lalu pada views dan _form.php nya, tambahkan code javascript berikut tepat di bawah <div class=”form”> nya

<script>
		$(document).ready(function(){
			$("#propinsi").change(function(){
				var propinsi = $("#propinsi").val();
				$.ajax({
					url: "<?php echo Yii::app()->createUrl('kecamatan/tampilkabupaten')?>",
					data: "propinsi=" + propinsi,
					success: function(data){
						$("#Kecamatan_kabupaten").html(data);
				}
			});
		});
	});
</script>

Penjelasan : code di atas digunakan untuk memanggil actionTampilKabupaten yang telah kita buat tadi guna mengambil nilai nya untuk di masukkan kedalam pilihan kabupaten. Jangan lupa, diatas ada “Kecamatan_kabupaten”, itu action tampilkabupaten tadi akan menjalankan perintahnya dan menyisipkan pilihan dan nilai ke dalam attribut “Kecamatan_kabupaten” yang merujuk pada attribut “kabupaten”.

Setelah itu, modifikasi attribut pada propinsi dan kabupaten sehingga menjadi seperti berikut:

	<div class="row">
		<?php echo $form->labelEx($model,'propinsi'); ?>
		<?php echo $form->dropDownList($model,'propinsi',
			CHtml::listData(Propinsi::model()->findAll(),
			'id', 'propinsi'),array(
			'id'=>'propinsi', 'empty'=>'--Pilih Propinsi--')); ?>

		<?php echo $form->error($model,'propinsi'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'kabupaten'); ?>
		<?php echo $form->dropDownList($model,'kabupaten', array('empty'=>'--Pilih Kabupaten--')); ?>
		<?php echo $form->error($model,'kabupaten'); ?>
	</div>

Penjelasan : Code di atas adalah kode pengaturan form pada form entry data kita. Pada attribut provinsi, dia akan menampilkan semual list propinsi yang ada pada database kita. Sedangkan kabupaten tidak akan menampilkan pilihan apa-apa, kabupaten akan muncul pilihannya jika kita sudah memilih salah satu propinsi.

Setelah melakukan step-step tersebut, anda dapat mencoba nya. Coba anda pilih salah satu propinsi dari dropdownlist propinsi. Jika apa yang anda lakukan sudah benar, maka pada dropdownlist kabupaten harus nya akan secara otomatis terisi dengan list kabupaten pada propinsi yang anda pilih tadi…

Selesai,…. Selamat mencoba..

Semoga membantu…😀

25 Responses to [Yii Framework] Membuat attribute entry form yang saling terhubung ex: tabel provinsi, kabupaten,kecamata

  1. helmynix says:

    boleh sekalian disertakan tabel provinsi, kabupaten, dan kecamatannya untuk di download? (export ke *.sql) kalau ada sekalian datanya yang lengkap seluruh indonesia🙂 terima kasih

  2. sabitzhabit says:

    wah, kalo data lengkap ga ada juga gan.. saya copas aja ya sql nya.. ni struktur tabel yang saya gunakan:

    CREATE TABLE IF NOT EXISTS `kabupaten` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `kabupaten` varchar(100) NOT NULL,
    `propinsi` int(11) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `propinsi` (`propinsi`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

    INSERT INTO `kabupaten` (`id`, `kabupaten`, `propinsi`) VALUES
    (1, ‘Palembang’, 1),
    (2, ‘Lubuk Linggau’, 1),
    (5, ‘Aceh’, 2),
    (6, ‘Bandung’, 3),
    (7, ‘Bogor’, 3);

    CREATE TABLE IF NOT EXISTS `kecamatan` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `propinsi` int(11) NOT NULL,
    `kabupaten` int(11) NOT NULL,
    `kecamatan` varchar(100) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `propinsi` (`propinsi`),
    KEY `kabupaten` (`kabupaten`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

    CREATE TABLE IF NOT EXISTS `propinsi` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `propinsi` varchar(100) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

    INSERT INTO `propinsi` (`id`, `propinsi`) VALUES
    (1, ‘Sumatera Selatan’),
    (2, ‘Aceh’),
    (3, ‘Jawa Barat’);

    ALTER TABLE `kecamatan`
    ADD CONSTRAINT `kecamatan_ibfk_1` FOREIGN KEY (`propinsi`) REFERENCES `propinsi` (`id`),
    ADD CONSTRAINT `kecamatan_ibfk_2` FOREIGN KEY (`kabupaten`) REFERENCES `kecamatan` (`id`);

    ALTER TABLE `kabupaten`
    ADD CONSTRAINT `kabupaten_ibfk_1` FOREIGN KEY (`propinsi`) REFERENCES `propinsi` (`id`);

  3. Pingback: [Yii Framework] Dropdownlist yang Terhubung « Sabitlabscode

  4. asep says:

    oya cuma tambahan aza gan jangan lupa, sepele tapi tanpa ini ga bisa jalan.hehehe

    public function accessRules()
    {
    return array(
    array(‘allow’, // allow all users to perform ‘index’ and ‘view’ actions
    ‘actions’=>array(‘index’,’view’,’TampilKabupaten’),
    ‘users’=>array(‘*’),
    ),

  5. sip. Betul skali gan..

  6. asep says:

    oya mau nanya gan, kalau misalkan idnya itu terdiri dari bbrp field isian yg saling terhubung dalam 1 model, itu gmn ya ngelempar ke nama field (attributenya)..??
    Contoh gini gan:
    Struktur dibuat beradasrkan bbrp isian tapi diambil dari satu tabel yaitu tbl_struktur itu sendiri (bukan tbl_propinsi/kabupaten).
    misal: 0102->punya satu nama struktur (misal abcdef)
    2 digitpertama=kode propinsi
    2 digitkedua=kodekabupaten
    ane pake ini cuma yang tampil kode propinsinya, kabupatennya belum bisa.

    ==>view

    $(document).ready(function(){
    $(“#codepropinsi”).change(function(){
    var propinsi = $(“#codepropinsi”).val();
    $.ajax({
    url: “createUrl(‘Struktur/tampilkabupaten’)?>”,
    data: “sendpropinsi=” + propinsi,
    success: function(data){
    $(“#idlempar”).html(data);
    }
    });
    });
    });

    labelEx($model,’id’); ?>
    findAll(array(‘order’ => ‘id’));
    $select2=CHtml::listData($model2,’id’, ‘nama’);
    echo CHtml::dropDownList(‘two’, $xxx, $select2, array(
    ‘id’=>’codepropinsi’, ’empty’=>’–Pilih Propinsi–‘)); ?>
    dropDownList(‘idlempar’,array(’empty’=>’–Pilih Kabupaten–‘)); ?>
    ?>

    ==>crontroller
    public function actionTampilKabupaten()
    {
    $propinsi = $_GET[“sendpropinsi”];
    $sql= Struktur::model()->findAllByAttributes(array(‘id’=>$propinsi);
    echo “–Pilih Kabupaten–“;
    foreach ($sql as $i)
    {
    echo ‘id.'”>’.$i->nama.”;
    }
    }

    gmn solusinya ya..?

  7. asep says:

    Oya gan utk view ini lanjutannya yg bener

    labelEx($model,’id’); ?>
    findAll(array(‘order’ => ‘id’));
    $select2=CHtml::listData($model2,’id’, ‘nama’);
    echo CHtml::dropDownList(‘two’, $xxx, $select2, array(
    ‘id’=>’codepropinsi’, ’empty’=>’–Pilih Propinsi–‘)); ?>
    dropDownList(‘idlempar’,$zzz,array(’empty’=>’–Pilih Kabupaten–‘)); ?>

  8. sebenernye saya masih kurang nangkep mksd ny gan, tapi coba lihat postingan ini dlu gan :
    https://sabitlabscode.wordpress.com/2011/12/16/yii-framework-dropdownlist-yang-terhubung-dengan-banyak-dropdownlist-lain/

    yg gitu bukan mksd ny?

  9. asep says:

    kenapa pas update malah jadi masalah ya? provinsi sama kabupaten pas update kosong gan? adakah solusinya?

  10. mksd ny ksong gmana gan?

  11. gini gan, jadi pas update, dropdownlistnya ga otomatis selected, karena itu kan pake ajax, jadi sepertinya harus di seting pas updatenya

  12. Dedy says:

    Gan saya coba script ini untuk latihan, saya test input data , untuk propinsi sumsel tidak ada masalah.. Data langsung terecord, tapi untuk propinsi jawa barat dan aceh selalu gagal pas input data .. dengan error :

    CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`latihan`.`kecamatan`, CONSTRAINT `kecamatan_ibfk_2` FOREIGN KEY (`kabupaten`) REFERENCES `kecamatan` (`id`)). The SQL statement executed was: INSERT INTO `kecamatan` (`propinsi`, `kabupaten`, `kecamatan`) VALUES (:yp0, :yp1, :yp2)

    Apa bedanya yang sumsel sama yang 2 propinsi lainnya yah ?

    Trims

  13. itu artinya belum ada foreign key dengan kecamatan yang sesuai gan.. agan kan pake relation pada database nya.. jadi pada data kecamatannya harus ada dulu data kecamatan tersebut baru agan bisa input untuk kecamatan tersebut..

  14. rickssss says:

    Mau Nanya nih

    Misalnya Saya punya Format Data Seperti :

    Lokasi —> MerkPerangkat –> Modul Perangkat

    Kalau untuk Kecamatan khan datanya hanya akan terhubung ke satu kabupaten trus ke satu propinsi..

    Gimana dengan kasus Modul Perangkat yang terhubung ke satu Merk Perangkat tapi bisa terhubung ke 2 atau lebih lokasi, gimana cara menterjemahkan ke databasenya ?

  15. kalo agan pernah belajar tentang normalisasi di database, itu pake konsep 1 to many gan.. di blog ini saya ada post tentang kasus murid dan kelas/dosen (saya lupa).. yang intinya suatu data yang bisa memiliki lebih dari 1 attribute seperti kasus agan.. coba di pelajari dulu yang itu gan..

  16. nur says:

    kak,,masalah saya sama kayak bang asep..pas update, provinsinya udah ke select,tapi kabupatennya kosong, ga langsung select otomatis,,gimana ya?mohon bantuannya kak

    • terus terang kalo masalah gini harus di akalin lagi gan..
      Jadi buat pengkodisian if(provinsi tidak kosong) maka data pada kabupaten dikasih default pilihan.. cara memberi pilihannya disediakan terlebih dahulu variabel array kosong, kemudian jika provinsi tidak ksong maka array tersbut diisi dengan nilai semua kabupaten pada provinsi tersebut. Kemudian terakhir array tsb dimasukkan ke dalam dropdownlist kabupaten nya..

  17. aray says:

    ane gagal terus nih gan,.,,:( minta file nya ny boleh ga?

  18. Kang Agus says:

    Mas Sabit saya udah coba beberapa kali setiap drop down provinsi dipilih di dropdown kabupaten gak muncul apa2, mohon pencerahannya

    • biasa nya itu ada kesalahan d javascript nya mas.. untuk kasus AJAX/javascript, mas coba install firebug extension di browser agan. Itu bisa bantu agan lihat error di javascript nya..

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: