[Yii Framework] Multi File Upload

Pada suatu kasus kita ingin membuat sebuah fungsi untuk mengupload beberapa file sekaligus.. Beruntung pada Yii sudah menyediakan sebuah control “CMultiFileUpload” yang dapat kita gunakan dengan cukup sederhana..

Untuk menggunakan control ini, masukkan code berikut pada tampilan anda:

<?php
    $this->widget('CMultiFileUpload', array(
         'name' => 'namaAttribute',
         'accept' => 'jpeg|jpg|gif|png|pdf|doc|docx|xlx|xlsx|zip|rar',
         'duplicate' => 'Duplicate file!',
         'denied' => 'Type file yang diizinkan adalah jpeg,jpg,gif,png,pdf,doc,docx,xlx,xlsx,zip,rar',
     ));
?>

jangan lupa memasukkan code berikut pada form anda saat pendeklarasian form:

<?php $form=$this->beginWidget('CActiveForm', array(
    'enableAjaxValidation'=>true,
    'htmlOptions' => array('enctype'=>'multipart/form-data'),
)); ?>

Anda lihat bukan pada ‘htmlOptions’ terdapat code yang kita gunakan untuk mengizinkan penguploadan suatu file..

Lalu untuk menyimpan file tersebut secara bersamaan, gunakan code berikut pada controller:

         $dariPc = CUploadedFile::getInstancesByName('namaAttribute');
           if(isset($dariPc) && count($dariPc) > 0) 
            {
                foreach ($dariPc as $i=>$ii) 
                {
                        $ii->saveAs(Yii::app()->basePath.'/../filenya/'.$namafile);
                        // kode di atas digunakan untuk menyimpan data ke dalam aplikasi, variabel $namafile saya anggap
                       //  sudah anda buat..
                }
            }

Selesai..

Selamat mencoba.. Semoga membantu.. 🙂

Advertisements

[Yii Framework] Mengatasi Masalah Composite Primary Key

Menjawab sebuah pertanyaan di blog ini mengenai masalah pembangunan sebuah aplikasi yang memiliki composite primary key. Ada apa dengan composite key pada Yii? Generate code yang ada pada Yii tidak memungkinkan untuk menggenarate code yang tabel nya memiliki composite key. Lalu bagaimana cara mengatasinya? Ada 2 cara:

1. Anda rubah tabel anda hanya memiliki 1 buah Primary key dg field baru dan menjadikan 2 field composite sebelumnya menjadi Unique.

2. Anda tidak merubah tabel anda, tetapi membuat code CRUD pada Yii secara manual (tentunya anda harus memodifikasi bagian-bagian code anda)

Jika menggunakan opsi pertama, anda dapat menggenerate code nya seperti biasa dengan menggunakan Gii. Lalu bagaimana dengan opsi kedua? ya.. mari kita bahas..

Untuk menggenerate model pada Yii, anda tetap dapat mengenerate code anda. Tetapi untuk controller dan view, kita harus membuatnya manual. Tetapi kita akan mengikuti pola code hasil generate yii pada tabel yang tanpa composite key. Okeh, kita bahas dahulu untuk controller. Buatlah sebuah controller sesuai nama model anda pada folder Controllers pada aplikasi anda. Buat sama persis dengan code controller pada code controller lain hasil generate gii.. Lalu lihat pada fungsi loadModel yang tadinya seperti ini:

public function loadModel($id)
 {
   $model=NamaModel::model()->findByPk((int)$id);
   if($model===null)
     throw new CHttpException(404,'The requested page does not exist.');
   return $model;
 }

rubah menjadi seperti ini:

public function loadModel($id,$id2)
 {
    $model=NamaModel::model()->findByAttributes(array('namaAttribute1'=>$id,'namaAttribute2'=>$id2));
    if($model===null)
        throw new CHttpException(404,'The requested page does not exist.');
    return $model;
 }

Penjelasan : karena kita memiliki composite key yang artinya terdapat 2 buah field atau lebih sebagai identitas unik suatu data, maka kita membuat parameternya juga sesuai dengan field tersebut. Saya asumsikan composite key kita terdiri dari 2 field, untuk itu kita membutuhkan 2 buah parameter pada code tersebut untuk itu kita menggunakan findByAttributes bukan findByPk lagi..

Lalu karena itu, tentu untuk action view, update, dan delete kita harus membuat 2 buah parameter untuk itu. Juga untuk setiap link yang mengarahkan kita ke tabel yang memiliki composite, kita harus sediakan 2 buah parameter disana. Silahkan rubah code actionView anda yang tadinya seperti berikut :

public function actionView($id)
 {
   $this->render('view',array(
     'model'=>$this->loadModel($id),
    ));
 }

menjadi seperti berikut :

public function actionView($id,$id2)
 {
   $this->render('view',array(
     'model'=>$this->loadModel($id,$id2),
    ));
 }

Code actionUpdate yang tadinya seperti ini :

public function actionUpdate($id)
 {
    $model=$this->loadModel($id);
    if(isset($_POST['NamaModel']))
    {
       $model->attributes=$_POST['NamaModel'];
       if($model->save())
          $this->redirect(array('view','id'=>$model->id));
    }
    $this->render('update',array(
       'model'=>$model,
    ));
 }

Menjadi seperti berikut :

public function actionUpdate($id,$id2)
 {
    $model=$this->loadModel($id,$id2);
    if(isset($_POST['NamaModel']))
    {
       $model->attributes=$_POST['NamaModel'];
       if($model->save())
          $this->redirect(array('view','id'=>$model->id,'id2'=>$model->id2));
    }
    $this->render('update',array(
       'model'=>$model,
    ));
 }

Dan actionDelete yang tadinya seperti berikut:

public function actionDelete($id)
 {
    if(Yii::app()->request->isPostRequest)
    {
       $this->loadModel($id)->delete();
       if(!isset($_GET['ajax']))
          $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
    else
       throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
 }

menjadi seperti berikut :

public function actionDelete($id,$id2)
 {
    if(Yii::app()->request->isPostRequest)
    {
       $this->loadModel($id,$id2)->delete();
       if(!isset($_GET['ajax']))
          $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
    else
       throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
 }

Selesai, setelah itu kita tinggal mengedit bagian view kita. Berikut contoh untuk mengarahkan pada halaman update dan view..

echo CHtml::link("Update",array('namaController/update','id1'=>$id1,'id2'=>$id2));
echo CHtml::link("View",array('namaController/view','id1'=>$id1,'id2'=>$id2));

Begitu juga dengan menu-menu yang ada pada tampilan anda.. semuanya harus anda modifikasi sesuai dengan action anda..

Selesai.. Selamat mencoba..

Semoga membantu.. 🙂

[Yii Framework] ‘”php.exe”‘ is not recognized as an internal or external command, operable program or batch file.

Sudah cukup sering saya ditanya by email oleh beberapa orang yang menemui pesan error di atas saat ingin menggunakan Yii Framework. Sebenarnya penyelesaian dari permasalahan di atas sudah banyak bertebaran di internet, tapi ga ada salahnya saya share lagi mungkin bisa membantu teman-teman yang ingin memulai menggunakan Yii Framework 🙂

Yang akan saya jelaskan adalah penyelesaian error di atas untuk user pengguna Windows OS. Jadi intinya error di atas dihasilkan akibat tidak dikenalinya php.exe pada server komputer anda saat akan menjalankan fungsi generate aplikasi baru. Untuk mengatasi masalah ini, cukup lakukan langkah-langkah berikut :

buka windows explorer anda, pada “computer” click kanan, lalu pilih properties->Advanced System Setting->Environtment variabels. Lalu di System variable, pada PATH,  masukkan path dari php.exe agan yang sudah terinstal di komputer anda…

Dimana php.exe anda?? jelas masing-masing komputer berbeda, tapi kalo anda menggunakan wamp server, biasanya di C:\wamp\bin\php\php x.x.x\php.exe. Untuk server yang lain? silahkan anda cari ya di direktori anda.. kan sudah ada fitur untuk pencarian cepat..

 

Sekian.. selamat  mencoba…

Semoga membantu.. 🙂

[Yii Framework] Membuat CGridView Sort dan Filter dari Model yang Berelasi

Pada Yii Framework, mungkin bukan hal yang sulit untuk membuat sebuah tabel yang menampilkan data dari suatu tabel yang sudah dilengkapi fasilitas “sort” dan “search”. Yah, anda cukup menggunakan fasilitas generate code dari Gii dan itu akan langsung dibuat secara otomatis oleh gii. Bagaimana jika anda ingin membaut sebuah data yang diambil dari lebih dari 1 tabel kemudian menampilkannya dengan fasilitas “sort” dan “search” ??  Untuk kasus ini, kita harus bekerja lebih keras.. kita dapat melakukannya dengan menggunakan cdbcriteria yang sedikit kita manipulasi..  Mari kita bahas…

Misal saya ingin menampilkan data dari tabel “A” dan tabel “B”. Oh iya, perlu anda ketahui tutorial ini menampilkan data untuk tabel yang berelasi. Untuk itu, pastikan pada model tersebut sudah terdapat relasi antara tabel A dan tabel B, sehingga pada model akan ada code seperti berikut :

public function relations()
{
   return array(
       'namaRelasi' => array(self::BELONGS_TO, 'B', 'id_B'),
   );
 }

Setelah itu, definisikan attribute-attribute yang ingin kita ambil dari tabel B pada model A
misal :

public $attribute1,$attribbute2;

Nah, sekarang kita buat sebuah fungsi untuk menampilkan semua data pada tabel A dan tabel B yang sudah disertai fungsi untuk memfilter saat “search” dan mengurutkan saat “sort” :

Buatlah sebuah fungsi seperti berikut :

public function search2()
 {
     $criteria=new CDbCriteria;
     $criteria->select='
       t.id, 
       t.attribute0, 
       namarelasi.attribute1, 
       namarelasi.attribute2';

       $criteria->with=array('namarelasi');
       $criteria->compare('id',$this->id);
       $criteria->compare('attribute0',$this->attribute0,true);
       $criteria->compare('namarelasi.attribute1',$this->attribute1,true);
       $criteria->compare('namarelasi.attribute2',$this->attribute2,true);

       return new CActiveDataProvider(get_class($this), array(
         'criteria'=>$criteria,
         'sort'=>array(
           'attributes'=>array(
              'attribute1'=>array(
                 'asc'=>'namarelasi.attribute1',
                 'desc'=>'namarelasi.attribute1 DESC',
              ),
              'attribute2'=>array(
                 'asc'=>'namarelasi.attribute2',
                 'desc'=>'namarelasi.attribute2 DESC',
              ),
              '*',
          ),
        ),
    ));
 }

Penjelasan : Pada code di atas, pertama-tama kita mendefinisikan nama fungsi. Lalu kita definisikan attribute apa saja yang dapat kita tampilkan. Lalu kita definisikan tabel apa yang kita ambil, tetapi ingat kita mendefinisikan tabel apa yang akan kita ambil bukan dari nama tabel nya.. tetapi dari nama relasinya. Karena itu lah sebelumnya saya sudah mewajibkan untuk mendefinisikan relasi pada pada model yang akan di relasikan..

Setelah mendefinisikan relasi, barulah saya mendefiniskan attribute untuk melakukan filter, lalu definisikan juga attribute-attribute untuk mendefinisikan variabel yang akan di “sort”…

Nah, setelah itu jangan lupa definsikan pada function rules model tersebut seperti berikut :

public function rules()
 {
    return array(
        array('id, attribute0, attribute1, attribute2', 'safe', 'on'=>'search2'),
        );
 }

Rules di atas dimaksudkan agar attribute yang di filter/sort pada CGRidView dapat tertangkap oleh action..

Setelah itu anda dapat menampilkan isi dari tabel anda dengan memanggil fungsi tersebut pada controller anda :

public function actionAdmin()
 {
    $model=new A('search2');
    $model->unsetAttributes(); 
    if(isset($_GET['A']))
       $model->attributes=$_GET['A'];
    $this->render('admin',array(
       'model'=>$model,
     ));
 }

Nah, kemudian pada CGridView jangan lupa arahkan data nya kepada nilai fungsi tsb :

$this->widget('zii.widgets.grid.CGridView', array(
   'id'=>'user-grid',
   'dataProvider'=>$model->search2(),
   'filter'=>$model,
   'columns'=>array(
      'id',
      'attribute0',
      'attribute1',
      'attribute2',
    ),
));

Selesai..
Selamat mencoba..
Semoga membantu.. 🙂

[Yii Framework] Filter Pada CGridView dengan Dropdownlist

Pada beberapa kasus kita ingin menambahkan filter pada Cgridview dengan menggunakan dropdownlist.. Mungkin maksudnya agar user tidak kesulitan dalam mengetik.. Berikut caranya :

 

Misal anda punya CGridView seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'jenis-jadwal-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
         array(
          'name'=>'namaKolom',
          'type'=>'raw',
          'value'=>'$data->namaKolom',
        ),
         array(
           'class'=>'CButtonColumn',
         ),
     ),
));

 
Pada CGridview di atas akan mengahasilkan sebuah cgridview dengan filter yang dapat kita ketik sendiri. Nah, untuk mengubah filternya menjadi dropdownlist, ubahlah code di atas menjadi seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'jenis-jadwal-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
         array(
          'name'=>'namaKolom',
          'type'=>'raw',
          'value'=>'$data->namaKolom',
          'filter'=>Chtml::listData(NamaModel::model()->findAll(),'id','tulisan'),
        ),
         array(
           'class'=>'CButtonColumn',
         ),
     ),
));

Penjelasan : yah, anda cukup menambahkan field filter di dalam kolom tersebut dimana isinya adalah list data yang akan di tampilkan pada dropdownlist.. Pada contoh di atas saya mengambil data dari suatu model untuk option-option pada dropdownlist nya…

 

Selesai..

Selamat mencoba…

Semoga membantu… 🙂

%d bloggers like this: