Gambar produk belum ada. Sehingga akan ditampilkan broken image.
Gambar untuk produk, kita akan diisi dengan nilai
default.jpg
. Jika tidak ada gambar yang di-upload.
Kalau kita lihat alamat path yang dipakai, gambar ini akan berlokasi di
/upload/product/default.jpg
.
Sedangkan kita belum punya folder dan file
default.jpg
.
Bagaimana cara mengatasinya?
Sederhana…
Kita tinggal buat folder baru di dalam project dengan nama
upload
, lalu di dalamnya berisi folder lagi bernama product
.
dan di sanalah kita akan menaruh file
default.jpg
.
Gambar
default.jpg
akan menjadi gambar placeholder apabila tidak ada gambar yang di-upload.
Sebagai contoh, buat “No Image” dengan aplikasi edit photo apa saja yang kalian punya.
Membuat Fitur Upload pada Codeigniter
Sebelum kita membuat fitur upload, kita perlu pahami dulu bagaimana konsep kerjanya.
Upload file memiliki alur proeses seperti ini:
- User mengirim file melalui form;
- File di-upload ke server dan disimpan dalam folder
tmp
dulu; - Kita pindahkan file yang ada di direktori
tmp
ke dalam direktoriupload/product/
yang sudah kita buat; - Selesai.
Terdengar sederhana…
Tapi mari kita lihat dalam prekteknya.
Silahkan buka model
Product_model.php
, kemudian tambahakan method _uploadImage()
tepat di bawah method delete()
.
Berikut ini isi kode method
_uploadImage()
:private function _uploadImage()
{
$config['upload_path'] = './upload/product/';
$config['allowed_types'] = 'gif|jpg|png';
$config['file_name'] = $this->product_id;
$config['overwrite'] = true;
$config['max_size'] = 1024; // 1MB
// $config['max_width'] = 1024;
// $config['max_height'] = 768;
$this->load->library('upload', $config);
if ($this->upload->do_upload('image')) {
return $this->upload->data("file_name");
}
return "default.jpg";
}
Sehingga akan menjadi seperti ini:
Apa yang dilakuakn oleh method ini?
Sederhana…
- Kita membuat konfigurasi untuk upload file seperti:
upload_path
untuk menentukan alamat lokasi file akan teruploadfile_name
untuk menentukan nama file. Oya, nama file akan kita ambil dari ID produk. Karena itu, kita mengisinya dengan$this->product_id
.overwrite
untuk menindih file yang sudah ter-upload saat di-upload file baru (edit data).allowed_types
untuk membatasi tipe file yang boleh di-upload.max_size
untuk menentukan batasan ukuran file.max_wdith
danmax_height
sengaja saya komentari agar tidak diaktifkan. Ini fungsinya untuk membatasi ukuran lebar dan tinggi image. Apabila image yang di-upload melebihi dari ukuran yang ditetapkan, maka upload akan gagal.
- Kita me-load library
upload
dengan konfigurasi yang sudah ditentukan.$this->load->library('upload', $config);
- Kita akan mengembalikan nama file yang sudah di-upload. Apabila upload gagal, maka kembalikan saja
default.jpg
.
Mengapa method ini diberikan modifier
private
?
Bukankah nanti kita akan memanggilnya dari Controller?
Kita tidak akan memanggil method ini dari Controller. Karena itu, kita memberikan modifier
priavate
.
Method ini nanti akan dipanggil dari class
Product_model
(class itu sendiri), pada method save()
dan update()
.
Nah, sekarang tugas kita adalah mengubah method
save()
dan update()
.
Menggunakan Method _uploadImage()
Coba tebak?
Di mana kita akan memanggil method ini?
Yap! Method ini akan kita gunakan untuk mengisi properti
$this->image
.
Silahkan ubah method
save()
dan update()
menjadi seperti ini:
Khusus untuk method
update()
, kita membuat pengecekan seperti ini:if (!empty($_FILES["image"]["name"])) {
$this->image = $this->_uploadImage();
} else {
$this->image = $post["old_image"];
}
Artinya, jika ada file yang di-upload saat mengedit data, maka upload file-nya.
Tapi kalau tidak ada, cukup gunakan nama file yang sudah ada (
old_image
).
Nilai
old_image
kita dapatkan dari form, karena pada edit_form.php
kita sudah membuat field ini dengan tipe hidden
.Percobaan Upload File
Sebelum mencoba melakukan upload, kita harus ubah dulu hak akses dari direktori
upload
.
Jika kamu menggunakan Windows, kamu tidak perlu melakukan ini.
Tapi, bagi kamu yang menggunakan Linux, ini harus dilakukan agar aplikasi dapat membuat file baru di dalam direktori
upload
.
Silahkan ketik perintah berikut:
sudo chmod 777 /var/www/html/tokobuah/upload/ -R
Atau pada terminal di VS Code, ketik seperti ini:
sudo chmod 777 upload/ -R
Kita akan diminta password, silahkan isi dengan password yang kamu gunakan di komputermu.
Setelah itu, silahkan coba tambahkan produk baru dan jangan lupa sertakan gambarnya.
Setelah itu, klik Save dan buka halaman list products.
Maka hasilnya:
OK.......Lanjut
Menghapus File yang di-upload
Kita membutuhkan sebuah method khusus untuk menghapus file yang telah di-upload.
Silahkan tambahkan method berikut pada class
Product_model
, tepat di bawah method _uploadImage()
.private function _deleteImage($id)
{
$product = $this->getById($id);
if ($product->image != "default.jpg") {
$filename = explode(".", $product->image)[0];
return array_map('unlink', glob(FCPATH."upload/product/$filename.*"));
}
}
Sehingga akan menjadi seperti ini:
Terakhir, panggil method
_deleteImage()
pada method delete()
.
Oke, sekarang kita sudah bisa menghapus data dan juga file yang terupload.
Mungkin kamu akan bertanya,
Mengapa ada dua file yang terhapus?
Jadi gini…
Coba perhatikan method-nya, khususnya kode yang ada di dalam if.
Di sana kita mengambil nama file dengan fungsi
exlode()
. Lalu kita cari file berdasarkan nama tersbut dengan fungsi glob()
.
Setelah file-file ditemukan, lalu kita gunakan fungsi
array_map()
untuk mengeksekusi fungsi unlink()
pada tiap file yang ditemukan.
Tanda bitang (
*
) setelah $filename
artinya semua ektensi dipilih.$filename.*
(pengguna Linux pasti paham )
Ini nanti akan menghapus semua file dengan nama yang sama dan apapun ekstensinya.
Mengapa demikian?
Karena pada fungsi upload yang kita buat, di sana kita membolehkan untuk upload file dengan ekstensi
jpg
, gif
, dan png
.
Ketika data diedit dan gambar yang di-upload berekstensi berbeda dengan yang sudah ada di server…
…maka ia akan membuat file baru.
Misalnya di server sudah ada
123.jpg
, lalu di-upload lagi—misal file .png
— maka nanti akan dibuat lagi 123.png
.
Mengapa bisa begitu? Bukankah kita sudah memberikan konfigurasi
overwrite = true
?overwrite
pada konfigurasi upload, hanya akan menindih file dengan nama dan ekstensi yang sama.
Misal:
Di server sudah ada
123.jpg
. Ketika kita upload file lagi dengan ekstensi yang sama, maka 123.jpg
akan ditindih dengan file yang baru.Troubleshoot dan Debugging
Saya yakin, sebagian dari teman-teman yang mengikuti tutorial ini akan mendapatkan error dan masalah seperti file yang tidak mau di-upload.
Jangan panik!
Kita harus temukan sumber permasalahannya.
Nah untuk debugging fungsi upload, saya sarankan menggunakan ini:
print_r($this->upload->display_errors());
Taruh kode ini di dalam method
_uploadImage()
tepatnya sebelum return
dan matikan return
untuk sementara.
biar nanti jika terjadi erorr jadi ketahuan
Pada error tersebut, pesannya sudah jelas:
The upload destination folder does not appear to be writable.
Folder atau direktori tujuan upload tidak bisa ditulis. Ini terbukti dengan nilai
image
pada bagian kode SQL adalah NULL.
Mengapa bisa NULL?
Karena fungsi
_uploadImage()
gagal melakukan upload dan dia tidak akan mengembalikan nilai apapun.
Nanti nilai yang akan digunakan pada produk ini adalah
default.jpg
, karena pada tabel databasenya kita definisikan seperti ini.
Solusi dari permasalahan ini sebenarnya tinggal mengubah hak akses pada direktori
upload
.agar folder bisa kita write...
0 Response to "Buat Web dengan Codeigniter (Bag 5."Fitur CRUD)"
Post a Comment
Ilmu ibarat sempax, kita harus menggunakannya, tapi tak perlu memamerkannya..".Tolong klik iklan dong..biar blog nya tetep eksis..Thxs "