Skip navigation


Sudah lama tidak mengisi blog ini karena banyak kerjaan. Oke belakangan ini gw sedang mengerjakan sebuah aplikasi menggunakan PHP Framework Yii. Framework ini cukup menyenangkan dibanding beberapa framework lain. By the way, di tulisan ini gw akan memberikan solusi gw dari sebuah permasalahan kecil yang gw hadapi.

Yii menyediakan sebuah tabel model yang kodenya digenerate. Tabel ini adalah CGridView. Tabel ini menyediakan banyak sekali fitur yang siap digenerate: pagination, column sorting, dan lain-lain. Jadi dengan menggunakannya, gw jadi tidak perlu menulis banyak kode.

Tapi satu masalah yang gw hadapi adalah bagaimana gw merefresh isi tabel ini dengan sebuah filter yang disediakan oleh sebuah Dropdown List.  Gambarnya dapat dilihat di bawah.



Kode yang menjadi permasalahan.

  • SQL
    CREATE TABLE IF NOT EXISTS `book` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` text NOT NULL,
      `status` varchar(32) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
    
    --
    -- Dumping data for table `book`
    --
    
    INSERT INTO `book` (`id`, `title`, `status`) VALUES
    (1, 'Evolutionary Bioinformatics', 'out'),
    (2, 'Digital Media Law', 'shelf'),
    (3, 'Magnetic Memory', 'order'),
    (4, 'Beginning CouchDB', 'order'),
    (5, 'Biological Database Modeling', 'shelf'),
    (6, 'Database Management System', 'out'),
    (7, 'Database Performance Tuning and Optimization', 'shelf'),
    (8, 'Databases A Beginner''s Guide', 'out');
    
  • Model
    <?php
    //protected/models/Book.php
    class Book extends CActiveRecord {
    
    }
    
  • Controller
    <?php
    //protected/controllers/TestController.php
    class TestController extends CController {
    
    	public function actionIndex(){
    		$dataProvider = new CActiveDataProvider('Book');
            $this->render('index', array('dataProvider' => $dataProvider));
    	}
    }
    
  • View
    <!-- //protected/views/index.php -->
    Filter <?php echo CHtml::dropDownList('filter', 'all', array(
        'all' => 'All',
    	'out' => 'Out',
    	'order' => 'Order',
    	'shelf' => 'Shelf',
    ));?>
    
    <?php $this->widget('zii.widgets.grid.CGridView', array(
        'dataProvider' => $dataProvider,
    ));
    ?>
    

Gw pengen supaya isi dari CGridView tersebut bisa diupdate sesuai dengan drop down list.

Pertama-tama gw edit kode di Controller untuk menambahkan kriteria tersebut. Kriteria tersebut diambl berdasarkan parameter GET. Kriteria ini nanti akan menentukan isi dari CDbCriteria yang digunakan.

<?php
//protected/controllers/TestController.php
class TestController extends CController {
	
	public function actionIndex(){
		$criteria = new CDbCriteria;
		$filter = isset($_GET['filter']) ? $_GET['filter'] : 'all';
		switch($filter){
			case 'out' :
				$criteria->addCondition("status = 'out'");
				break;
			case 'shelf':
				$criteria->addCondition("status = 'shelf'");
				break;
			case 'order':
				$criteria->addCondition("status = 'order'");
				break;
			case 'all':
			default:
				break;
		}
		$dataProvider = new CActiveDataProvider('Book', array(
			'criteria' => $criteria
		));
        $this->render('index', array('dataProvider' => $dataProvider));
	}
}

Setelah itu baru gw edit view. Pada view ini, dropdown list akan kita tambahkan fungsi AJAX yang dieksekusi ketika dropdown berganti. Pengaturan event ini menjadi mudah karena Yii sendiri menggunakan JQuery sebagai pendukung Javascriptnya.
Di viewnya tinggal dibuat.

<!-- //protected/views/index.php -->
<?php Yii::app()->clientScript->registerScript('filter-js','
    $(\'#filter\').change(function(){
        $(\'#bookgridview\').yiiGridView.update(\'bookgridview\', {
            url:\'?filter=\'+$(this).val()
        });
    });
');?>


Filter <?php echo CHtml::dropDownList('filter', 'all', array(
    'all' => 'All',
	'out' => 'Out',
	'order' => 'Order',
	'shelf' => 'Shelf',
));?>

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
	'id' => 'bookgridview'
));
?>

Done!

About these ads

12 Comments

  1. Thx tutorialnya bro petra..
    tp setelah saya coba, datanya tidak berubah…

    saya menggunakan yii versi 1.1.3

    adakah yg perlu diubah?

  2. harusnya gak ada sih,
    sudah coba di 1.1.2?

    itu saya menggunakan 1.1.2 soalnya

    kalau melihat di Changelognya 1.1.3 harusnya gak ada pengaruh *atau saya yg gak ngeliat yah*

  3. saya mau tanya, kalau misal tabel saya misal tabelA , saya joinkan di criteria pas di $dataProvider = new CActiveDataProvider …
    dengan tabelB, ntar akses data provider di CWidgetnya pake atribut apa ya? saya coba ‘tabelB.kolomB’, gak bisa :p

    atau ada usul lain kalau bukan join, tapi pakai tabelA->relasikeB->kolomB ? thanks jawabannya

    • biasanya kalau mau gitu mesti definisiin relasi dulu antar tabel…

      ato cara paling gampang pakai view ^_^

  4. gan, kalo memakai clistview gimana gan?

  5. saya juga udah coba koq ga bisa ya mas pas waktu onchange/diklik comboboxnya, datanya muncul pas wktu reload page pertama kali, sy liat di firebug no error, misalkan saya ganti $filter = isset($_GET['filter']) ? $_GET['filter'] : ‘out'; datanya jg muncul yg status ‘out’ saat pertama kali reload, kira2 dimna errornya ? thanks

  6. mas saya nyoba pake cgridview, awalny berhasil dan keluar pagination nya. tapi setelah theme nya diganti ko jadi ga keluar ya? kira2 apanya yang salah?
    mksh

  7. om, kalau misalnya mau mem-filter tabel hasil sql bisa ga?

    • bisa tapi agak repot :P

        • kiki
        • Posted Agustus 16, 2012 at 16:27
        • Permalink

        gmn caranya om? boleh request tutorialnya? toloooong ><

  8. maap om, mau nanya lagi. kalau misalnya dropdownlistnya diambil dari db gmn caranya? soalnya pas nangkep di controller kan ga mungkin pake case2 lagi..
    trus saya mau bikin 2 dropdownlist, yg kedua2nya memfilter cgridview..
    gmn caranya yah om?
    mohon pencerahannya :D

    • udah ketemu jawabannya belum?sama nih masalahnya ><


Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Logout / Ubah )

Twitter picture

You are commenting using your Twitter account. Logout / Ubah )

Facebook photo

You are commenting using your Facebook account. Logout / Ubah )

Google+ photo

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

Ikuti

Get every new post delivered to your Inbox.

Bergabunglah dengan 32 pengikut lainnya.

%d bloggers like this: