CSqlDataProvider, Si Penampil Data Query Kompleks

16 Nov 2012
Bagi pemain di ranah website terutama wilayah web app, data retrieving dari database memang suatu hal pokok yang mungkin dikatakan suatu keharusan. Mungkin jika query masih standar, kita dapat memanfaatkan ActiveRecord. Tapi seiring dengan kompleksitas suatu web app dan query callback, suatu ActiveRecord bisa jadi kurang bermanfaat. Nah, solusi yang mungkin dilakukan adalah dengan menggunakan  CSqlDataProvider. CSqlDataProvider sendiri sudah mendukung pagination sehingga kita ga perlu report-report membuat kelas paging. Selain itu, CSqlDataProvider enak digabungin dengan CGridView atau CListView. Sangat menyederhanakan pembuatan kode, bukan. Tertarik bagaimana membuatnya?Ikuti triknya disini!
Buatlah controller baru dengan action index, kemudian isi dengan:
public function actionIndexList() {  
  $dataProvider = new DBlog('search');
  $dataProvider->attributes=$_GET['DBlog'];
  $this->render('admin',array(
   'model'=>$dataProvider,
  ));
 }
Untuk Modelnya extends dari CFormModel, karena ga pakai ActiveRecord.

class DBlog extends CFormModel
{
 public $id;
 public $title;
 public $content;
 public $url;

 public function rules()
 {
  return array(
   array('id,title,content,url','safe','on'=>'search')
  );
 }
 
 public function attributeLabels()
 {
  return array(
   'id' => 'ID',
   'title' => 'Title',
   'content' => 'Content',
   'url' => 'Url',
  );
 }

 public function search()
 {
  $criteria=$this->searchCriteria();
  $sql = 'SELECT * FROM blog';
  $count = Yii::app()->db->createCommand('SELECT COUNT(*) FROM blog')->queryScalar();
  $dataProvider=new CSqlDataProvider($sql,array(
    'totalItemCount'=>$count,
    'keyField'=>'id',
    'pagination'=>array('pageSize'=>20),
    'sort'=>array(
     'attributes'=>array(
      'id','title','content','url',
     ),
    ),
   )
  );
  return $dataProvider;
 }
 
}
Dengan pembuatan model seperti di atas, layout admin.php tidak akan berubah. Namun perlu di garisbawahi bahwa CGridView menjadi tidak searchable karena data provider tersebut tidak menyediakan mekanisme pencarian. Jika memang akan mengimplementasikan sendiri, kalian dapat membuat fungsi kriteria layaknya CDbCriteria secara manual.

No comments:

Post a Comment