Tags

, , , , ,

Terinspirasi dari PM yang masuk ke inbox, akhirnya ane putuskan untuk membuat ekstensi ini.
Ekstensi ini adalah enkapsulasi dari beberapa proses yang agak panjang dan membosankan kalau dilakukan berulang-ulang –ane tipe programer manja, gak mau melakukan hal yang sama lebih dari sekali :D-. Secara sederhana proses yang dilakukan oleh ekstensi ini adalah

  • Menyimpan file upload ke suatu folder (ditentukan oleh parameter uploadPath).
  • Membuat baris/record di database yang berisi informasi file.
  • Dari record tersebut kita dapat menampilkan atau mendownload file yang suda disimpan tersebut.

Instalasi

Jalankan

php composer.phar require mdmsoft/yii2-upload-file "*"

Untuk yang sudah menggunakan yii2 versi stable, jalankan ini

php composer.phar require mdmsoft/yii2-upload-file "dev-master"

Atau tambahkan di composer.json

"mdmsoft/yii2-upload-file": "dev-master"

Setelah selesai, jalankan prosedur db migration

yii migrate --migrationPath=@mdm/upload/migrations

Konfigurasi

Di config, tambahkan kode berikut

return [
    ...
    'controllerMap' => [
        'file' => 'mdm\upload\FileController', // use to show or download file
    ],
];

Untuk yang memakai template advanced, kode tersebut dapat diletakkan di common agar dapat diakses dari frontend maupun backend.

Penggunaan di Aplikasi

Inti dari ekstensi ini adalah behavior mdm\\upload\\UploadBehavior. Untuk menggunakannya, attach behavior ini ke model.

public function behaviors()
{
    return [
        ...
        [
            'class' => 'mdm\upload\UploadBehavior',
            'attribute' => 'file_foto', // required, use to receive input file
            'savedAttribute' => 'foto_id', // optional, use to link model with saved file.
            'uploadPath' => '@common/upload', // saved directory. default to '@runtime/upload'
        ],
    ];
}

Yang harus diperhatikan adalah, attribute file_foto tidak boleh ada di model, sedangkan attribute foto_id harus ada. Atribute foto_id digunakan untuk menampung file id file yang disimpan.
Setelah itu di kontroler, ubah kodenya seperti ini

public function actionCreate()
{
    // ...
    if($model->load(Yii::$app->request->post()) && $model->validate()){
        if($model->saveUploadedFile() !== false){
            $model->save();
            // ...
        }
        // ...
    }
    return $this->render('create',['model'=>$model]);
}

Di view

<?= $form->field($model,'file_foto')->fileInput(); ?>
// attribute 'file_foto' dari behavior


// untuk menampilkan
<?= Html::img(['/file','id'=>$model->foto_id]) ?>

Untuk pertanyaan silakan komen di sini. Bisa juga lewat gtalk misbahuldmunir@gmail.com :D.
Source di github.

Advertisements