[Yii Framework] Select Many Data From CGridView

Untuk mempermudah user memodifikasi data yang jumlahnya cukup banyak, biasa nya kita menyediakan fasilitas agar user dapat memilih-milih data sekaligus. Biasanya hal ini kita lakukan dengan menyediakan sebuah tabel yang berisi data-data dan user dapat memilih data mana saja yang ingin dia gunakan seperti gambar berikut :

Disana anda dapat melihat kita menampilkan semua data dan user dapat memilih-milih data tertentu dengan cara mencentang checkbox yang terdapat disamping data tersebut…

Bagaimana cara membuatnya?? Kita dapat menggunakan CGridView untuk mempermudah pekerjaan kita melakukan hal tersebut.. Berikut step-stepnya :

Pertama-tama pada CGridView, kita harus menampilkan checkbox. Code CGridView anda yang awalnya seperti berikut :

 <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'satu-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'satusatu',
        'satudua',
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>

Ubah menjadi seperti berikut :

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'satu-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'selectableRows'=>2,
    'columns'=>array(
         array(
             'class'=>'CCheckBoxColumn',   
               'id'=>'haha',
        ),
        'satusatu',
        'satudua',
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>

Penjelasan : pada code di atas kita menambahkan sebuah kolom yang berisi checkbox dan kita beri identitas ‘id’=haha. Setelah itu kita mengizinkan checkbox tersebut untuk di pilih banyak sekaligus dengan menyertakan code      ‘selectableRows’=>2, . Kode “2” yang ada pada kode tersebut menandakan checkbox tersebut dapat dipilih banyak sekaligus. Berikut beberapa aturan pada “selectabelRows” :

  • 0 – checkbox tidak bisa dirubah (read-only mode)
  • 1 –  hanya satu row yang dapat dipilih
  • 2  atau lebih – anda dapat memilih banyak checkbox dan pada anda disediakan sebuah checkbox yang digunakan untuk melakukan “select all” data pada cgridview.
  • Tidak melakukan setting – Jika anda tidak menyetting nilai selectabelRows, checkbox dapat dipilih sesuka user. Namun user tidak disediakan tombol “select all”.

Okeh, setelah kita telah berhasil menyediakan checkbox, sekarang saatnya kita menangkap nilai checkbox tersebut..

Anggaplah saya menyediakan sebuah tombol submit dimana tombol tersebut akan menangkap nilai yang ada pada CGridView tersebut dan menampilkannya pada suatu halaman. Saya membuat kode seperti berikut :

 <?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'satu-form',
    'action'=>array('satu/viewmany'),
    'enableAjaxValidation'=>false,
)); ?>
<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'satu-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'selectableRows'=>2,
    'columns'=>array(
         array(
             'class'=>'CCheckBoxColumn',   
               'id'=>'haha',
        ),
        'satusatu',
        'satudua',
        array(
            'class'=>'CButtonColumn',
        ),
    ),
)); ?>
<?php echo CHtml::submitButton('Create'); ?>
<?php $this->endWidget(); ?>

Penjelasan : Saya memubuat sebuah form yang dapat di POST dimana setiap ditekan tombol submit, form tersebut akan mengarah pada sebuah action yang terdapat pada “SatuController” dan action “viewmany”. Untuk itu, sekarang mari kita buat fungsi “viewmany”. Pada controller anda, buatlah sebuah fungsi berikut :

 public function actionViewmany()
    {
        $vari=array();
        if(isset($_POST['haha']))
        {
            $all=$_POST['haha'];

            foreach($_POST['haha'] as $a=>$val)
            {
                $simpan=$this->loadModel($val);    
                $vari[$a]=array('satusatu'=>$simpan->satusatu,
                        'satudua'=>$simpan->satudua);
            }

              $hasil=new CArrayDataProvider($vari, array(
                'keyField'=>'satusatu',
            ));

            $this->render('viewm',array(
                'dataProvider'=>$hasil,
            ));
        }
     }

Penjelasan : pada kode di atas kita membuat sebuah fungsi viewmany yang mana pada fungsi tersebut akan menangkap nilai “haha” yang terdapat pada form sebelumnya. Ingat kan kalo pada checkbox CGridView tadi saya memberi identitas dengan nama “haha”?? Yah, nilai itulah yang saya ambil. Setelah saya tangkap baris data yang telah dipilih oleh user, sekarang saya gunakan baris data tersebut untuk di tampilkan pada suatu halaman “viewm”. Buatlah sebuah halaman “viewm” pada view tepatnya pada folder “satu” sesuai dengan nama controller. Lalu isi kode berikut pada file tersebut :

 <?php
$this->breadcrumbs=array(
    'Satus',
);

$this->menu=array(
    array('label'=>'Create Satu', 'url'=>array('create')),
    array('label'=>'Manage Satu', 'url'=>array('admin')),
);
?>
<h1>Satus</h1>

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

yah, Selesai…

Selamat mencoba…

Semoga membantu…🙂

48 Responses to [Yii Framework] Select Many Data From CGridView

  1. yeri says:

    mas, aku mau tanya kalo tabelnya bisa di custom gak?misalnya kayak merge tabel d exel gitu di row ke-n..

  2. finzaiko says:

    mantaff….terima kasih om sabit…

  3. irawan85 says:

    Nyari-nyari ke sono ke sini akhirnya nemu juga tutorial yii,terus berkarya….

  4. @yeri : mksd ny gimana ya? bisa di perjelas lagi?

  5. newbie says:

    mas, mau tanya setelah saya coba kok ada error sbb :
    Fatal error: Call to a member function search() on a non-object in
    errornya merujuk ke ‘dataProvider’=>$model->search(),

    itu kenapa ya mas?

  6. itu artinya di $model ny ga punya fungsi search di model nya mas..

  7. oz4n says:

    bagai mana kalok mau menghapus data table yang di centang gan

  8. di controllernya buat aja foreachnya menjadi seperti berikut gan :

    foreach($_POST[‘haha’] as $a=>$val)
    {
    $simpan=$this->loadModel($val);
    $simpan->delete();
    }

  9. wah gan kita ngebahas hal yang sama nih..
    sempet kebinggungan juga tapi akhirnya bisa..
    mampir kesini ya gan..
    http://teguhkristianto.wordpress.com/2012/03/05/ccheckboxcolumn-dengan-parameter-checked/

  10. Ardy says:

    Pak Sabit, bingung yang Checkbox nih. Saya ada satu field di table a namanya “check” (isinya 0 dan 1). 0 itu maksudnya belum dicheck, dan 1 sudah dicheck. Saya mau tampilkan di halaman managenya supaya saat di load halaman manage tersebut untuk bagian checkbox (nilai 1) sudah tercentang, dan kalau nilainya 0 tidak dicentang. Saya sempat baca tutor pak Teguh Kristianto dan bingung bgt, mohon pencerahannya

  11. Ardy says:

    Pak Sabit, yang diatas sudah dapat solusinya, berikutnya kalau saya mau simpan nilainya bagaimana?? saya sudah buat action seperti dibawah ini di Controller dan berhasil menyimpan nilai 1 untuk yg dicentang.

    public function actionSimpan()
    {
    if(isset($_POST[‘checkstatus’]))
    {
    foreach($_POST[‘checkstatus’] as $a=>$val)
    {
    $simpan=$this->loadModel($val);
    $simpan->check=1; //check ini adalah field dalam table a
    $simpan->save();
    }
    }
    }

    Tetapi permasalahannya saat saya hilangkan centang saya mau nilainya kembali ke 0, saya sudah coba beberapa cara tetapi masih belum berhasil. Saya harus modifikasi coding diatas seperti apa untuk bisa pecahkan masalah saya? Mohon bantuannya ya. Terima Kasih.

  12. banyak ga datanya yang ada pak? kalo ga terlalu banyak di set jadi 0 semua aja dulu trus baru di foreach yang udah tercentang pak agar nilainya jadi 1 kembali.. tapi not best solution sih sebenrnya..

  13. Ardy says:

    Ada cara lain Pak?? kalau tidak ada cara lain, cara bapak diatas bagaimana saya terapkan di bagian actionnya? Mohon Penjelasannya lagi.

  14. tarok sebelum coding set status nya gan..
    foreach(namamodel->findAll() as $ii)
    {
    $model=$this->loadModel($ii->id);
    $model->status=0;
    $model->save();
    }

  15. Ardy says:

    Kalau menggunakan cara yang bapak kasih itu untuk update semua field status menjadi 0, seandainya saya ada paging kan gak bisa dipakai, saya update yang di page 1, ngaruh ke page 2,3.. dst. Update page 2, page 1 yg tadi sudah nilai 1 kembali lagi ke 0. Ada solusi lagi?

  16. iya pak, kalo emang data ny udah banyak emang jangan pake cara yang saya sarankan.. wah gimana ya .. saya sendiri belum pernah terapkan cara seperti itu pak..

  17. rangga says:

    pak sabit..kenapa ya tampilan kolom chekbox nya lebar banget?

  18. wah, ga tau juga saya gan.. itu masalahnya di tampilan berrti..

  19. rangga says:

    iya pak sudah solved..oia pak saya pernah liat artikel pak sabit tentang bagaimana membuat filefield tidak harus diinput..tapi saya lupa link nya..bisa minta link artikel tersebut pak?

  20. saya juga lupa pak, tapi kalo filefield bisa koosng, di set aja di model nya :
    array(‘namafield’,’file’,’allowsempty’=>true)

  21. rangga says:

    di form update apabila saya tidak ingin mengganti file gambar yang ada di database gimana caranya ya mas? karena setiap saya klik save pasti attribute gambar nya menjadi kosong karena saya tidak mengganti gambar.

  22. pake hidden field aja gan ngakalinnya.. di forum Yii Indonesia dulu ada yang posting masalah ini kalo ga salah gan..

  23. emen says:

    kak Sabit, kalau kita ingin mengisi lebih dari satu tombol execute gimana? misalnya ad tombol save dan delete…

  24. coba searching aja di blog ini gan “multi submit button”. Itu cara utk buat 2 buah tombol di sebuah form..

  25. emen says:

    gan, kok ane pake filter di gridviewnya jadi kelempar ke view many y, ap gara2 ini

    beginWidget(‘CActiveForm’, array(
    ‘id’=>’satu-form’,
    ‘action’=>array(‘satu/viewmany’),//kelempar kesini terus
    ‘enableAjaxValidation’=>false,
    )); ?>

  26. emang pasti kelempar kesana terus gan kalo agan setting action nya kesana..

    • emen says:

      jadinya filternya kgk bisa kepake y gan??? soalnya dapet ane tambahin controller action admin di action view many, tetep g jalan

  27. bukan gan, agan disana kan ngarahin ke action satu/viewmany. Jadi setiap agan klik submit button akan selalu ngarah kesana terus gan..

  28. iya emang gitu gan.. kolom filter itu juga sama2 lari ke submit gan mainnya..
    kalo pagination lari nya ke halaman itu sendiri gan..

  29. brightshield says:

    Mas kalo saya pakai composite primary key bisa make cara ini? Soalnya agak bingung di loadmodel kan nanti ga cuma id doang.. Gimana ya kira-kira?

  30. saya ga pernah pake composite pake cara ini. Tapi saya pernah pake tabel html biasa.. inti nya ke dalam nya saya simpan sebuah nilai dengan hiddenfield yang nantinya bisa di tangkap ketika di POST/GET..

  31. kiki says:

    Ka, kalo mau update banyak record sekaligus pake 1 tombol gmn caranya?

  32. mksd nya gmana dik? kami pake cara di atas atau gimana?

  33. kiki says:

    udah solve ka, makasih kk😀

  34. Dolay says:

    Malem Agan-agan… Saya masih newbie di YII. yang ingin saya tanyakan gimana waktu tampilin Cgridview diawal tampil dia kosong setelah kita isi salah satu isian form di Advance search data di cgridview baru ada ?

    terimakasih sebelumnya gan.

  35. madrani says:

    kak waktu klik tombol create kan larinya ke view satu/viewmany..tapi kok tampilan halamannya nggak muncul ya.padahal udah kutambahin di controller action admin.itu kenapa ya kak?

  36. Ulla says:

    Mantap mas tutorialnya. Terima kasih banyak. Sangat membantu.
    Btw maaf nih mas klo pertanyaannya dasar banget. Ane mau nanya soal delete data tabel yg tercentang.

    Ane kan mau nambahin fitur “Delete banyak”. Nah menurut mas huraira, itu bagusnya nambahin button baru atau cukup pkai CButtonColumn aja??

    Trus yg diedit/ditambahkan di bagian2 mna saja yah mas??
    Tolong pencerahannya mas.

  37. wais says:

    kak, kok sama aku keluar ini error gitu “The system is unable to find the requested action “viewm”.

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: