Anyeong chingu :)
Sekarang saya akan membahas tentang bagaimana membuat
upload file dalam format pdf pada surat masuk (tapi bisa juga untuk upload
gambar, tinggal mengganti type-nya saja).
Step 1.
Masuk ke /protected/models/suratMasuk.php lalu ketik
seperti di bawah ini.
public function rules()
{
//
NOTE: you should only define rules for those attributes that
//
will receive user inputs.
return
array(
array('tgl_masuk,
no_surat_masuk, perihal, lampiran, kepada, upload, dari, keterangan',
'required'),
array('no_surat_masuk,
perihal', 'length', 'max'=>30),
array('lampiran',
'length', 'max'=>10),
array('kepada,
dari', 'length', 'max'=>40),
array('upload',
'file', 'types'=>'pdf','maxSize'=>1024*1024*5, 'on'=>'insert'),
//
The following rule is used by search().
//
@todo Please remove those attributes that should not be searched.
array('no,
tgl_masuk, no_surat_masuk, perihal, lampiran, kepada, upload, dari,
keterangan', 'safe', 'on'=>'search'),
);
}
Nah yang perlu diperhatikan adalah “array('upload',
'file', 'types'=>'pdf','maxSize'=>1024*1024*5, 'on'=>'insert'),” yang maksudnya field upload ini akan diisi
oleh file dengan tipe pdf (kalo mau tipe png, jpg, gif juga bisa, tinggal
diganti aja), dan ukuran maksimalnya adalah 5 Mb.
Untuk mengeset 5 Mb ini, kita perlu mengubah
konfigurasinya di folder C:/xampp/php/php.ini
Ctrl + F lalu ketik ‘post_max_size’ nah disitu kita ganti
menjadi ‘post_max_size = 5M’
Step 2.
Buka /protected/controllers/SuratMasukController.php dan
masukkan source code berikut :
*pada actionCreate
public function actionCreate()
{
$model=new
SuratMasuk;
//
Uncomment the following line if AJAX validation is needed
//
$this->performAjaxValidation($model);
if(isset($_POST['SuratMasuk']))
{
$cekfile
= $model->upload=CUploadedFile::getInstance($model,'upload');
$model->attributes=$_POST['SuratMasuk'];
$model->upload=CUploadedFile::getInstance($model,'upload');
if($model->save())
{
if(!empty($cekfile))
{
$model->upload->saveAs(Yii::app()->basePath.'/../upload_file/'.$model->upload->getName());
}
}
$this->redirect(array('view','id'=>$model->no));
}
$this->render('create',array(
'model'=>$model,
));
}
Maksud code di atas, saat action create akan dicek dulu
apakah field upload sudah terisi atau belum, jika belum maka gambar akan
tersimpan pada field upload yaitu di folder ‘upload_file’ yang terletak di
dalam folder aplikasi yii dan sejajar dengan folder protected.
*dan pada actionUpdate
public function actionUpdate($id)
{
$model=$this->loadModel($id);
$image=$model->upload;
//
Uncomment the following line if AJAX validation is needed
//
$this->performAjaxValidation($model);
if(isset($_POST['SuratMasuk']))
{
$cekfile
= $model->upload=CUploadedFile::getInstance($model,'upload');
//jika
file tidak ada
if
(empty($cekfile))
{
$model->attributes=$_POST['SuratMasuk'];
$model->upload
= $image;
if($model->save())
{
$this->redirect(array('view','id'=>$model->no));
}
}
else
//jika file ada
{
$model->attributes=$_POST['SuratMasuk'];
$model->upload=CUploadedFile::getInstance($model,'upload');
if($model->save())
{
$model->upload->saveAs(Yii::app()->basePath.'/../upload_file/'.$model->upload->getName());
$this->redirect(array('view','id'=>$model->no));
}
}
}
$this->render('update',array(
'model'=>$model,
));
}
Step 3.
Sekarang kita buka /protected/views/suratMasuk/_form.php
*perhatikan bagian ini ..
<?php $form=$this->beginWidget('CActiveForm',
array(
'id'=>'surat-masuk-form',
'htmlOptions'=>array('enctype'=>'multipart/form-data'),
//
Please note: When you enable ajax validation, make sure the corresponding
//
controller action is handling ajax validation correctly.
//
There is a call to performAjaxValidation() commented in generated controller
code.
//
See class documentation of CActiveForm for details on this.
'enableAjaxValidation'=>false,
)); ?>
Yang harus ditambahkan adalah bagian ‘htmlOptions’.
Selanjutnya tambahkan ini.
*ini digunakan untuk menampilkan gambar saat proses
update, sehingga gambar yang sudah tersimpan di database akan ditampilkan
<?php if(!empty($model->upload)) { ?>
<div
class="row">
<?php
echo CHtml::image(Yii::app()->request->baseUrl.'/upload_file/'.$model->upload.'','Surat
Masuk',array('width'=>100)); ?>
</div>
<?php
} ?>
<br>
//nah di sini perhatikan <?php yang kedua, sebelumnya
adalah textField, di sini kita ganti menjadi fileField
<div
class="row">
<?php
echo $form->labelEx($model,'upload'); ?>
<?php
echo
$form->fileField($model,'upload',array('size'=>60,'maxlength'=>255));
?>
<?php
echo $form->error($model,'upload'); ?>
</div>
Nah perkara upload selesai, sekarang kita buat
pasangannya yaitu download.
*ini untuk membuat download file di CgridView
<?php $this->widget('zii.widgets.grid.CGridView',
array(
'id'=>'surat-masuk-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'no',
'tgl_masuk',
'no_surat_masuk',
'perihal',
'kepada',
array(
'class'=>'CLinkColumn',
'header'=>'File',
'urlExpression'=>'Yii::app()->request->baseUrl."/upload_file/".$data->upload',
'label'=>'Download',
'linkHtmlOptions'=>array( /*yang ini untuk membuat download new tab
*/
'target'=>'_blank',
),
),
array(
'class'=>'CButtonColumn',
),
),
)); ?>
*ini untuk menampilkan hasil upload pada view
<center>
<?php
echo
"<br>";
echo
CHtml::image(Yii::app()->request->baseUrl.'/upload_file/'.$model->upload.'','Surat
Masuk',array('width'=>600));
?>
</center>