Codeigniter untuk pemula, eps 4
Halo, kembali lagi dengan serial Codeigniter untuk pemula. Mulai episode ini saya aing akan mencoba menggunakan studi kasus untuk mempermudah klinik Codeigniter kita. Studi kasus yang dipilih adalah membuat aplikasi Point of Sales (POS) sederhana untuk minimarket.
Pertama kita akan menyiapkan database aplikasi kita, tentu saja menggunakan doctrine sebagai alat bantu. Kita tetap manggunakan database yang telah kita gunakan di episode sebelumnya. Mari mulai membuat model untuk database kita.
-
Buat berkas category.php di folder ci/application/models/. Berkas ini dipakai untuk mendefinisikan tabel Kategori Produk yang dijual, mendefinisikan bisa berarti tentukan dulu struktur tabel melalui model sisanya doctrine yang menangani.
<?php //membuat kelas Category yang merupakan perluasan //dari Doctrine_Record class Category extends Doctrine_Record{ //membuat fungsi untuk mendefinisikan tabel public function setTableDefinition() { //tabel ini akan bernama 'category' //memiliki kolom 'tittle', 'active' //kolom bernama 'tittle' dengan jenis string dan panjang //255 karakter $this->hasColumn('tittle', 'string', 255); //kolom bernama 'active' dengan jenis boolean, hanya //kategori yang aktif saja yang dapat digunakan //saat menghapus kategori, kita hanya akan merubah //kolom active menjadi FALSE $this->hasColumn('active', 'boolean'); } //membuat beberapa opsi untuk tabel public function setUp() { //tabel ini memiliki relasi one to many //dengan tabel product $this->hasMany('Product as Products', array( //local adalah kolom pada tabel category //yang dijadikan acuan untuk relasi 'local' => 'id', //foreign adalah kolom pada tabel product //yang menjadi foreign key pada relasi 'foreign' => 'category' )); } } ?> -
Buat berkas product.php di folder ci/application/models/ untuk menampung daftar produk.
<?php //membuat kelas Product //turunan dari Doctrine_Record class Product extends Doctrine_Record{ //mendefinisikan kolom table public function setTableDefinition() { //tabel ini bernama 'product' //memiliki kolom 'name', 'price', 'discount', 'active' //'category', 'stock' //kolom bernama 'name' dengan jenis string dan panjang //255 karakter $this->hasColumn('name', 'string', 255); //kolom bernama 'price' dengan jenis integer $this->hasColumn('price', 'integer', 4); //kolom bernama 'discount' dengan jenis float //diskon berupa persentase harga, bukan nilai rupiah $this->hasColumn('discount', 'float', 4); //kolom bernama 'category' isinya adalah //integer id dari kategori barang yang terdapat //dalam tabel category $this->hasColumn('category', 'integer', 4); //kolom bernama 'stock' bertipe integer //berisi stok yang tersedia untuk produk ini $this->hasColumn('stock', 'integer', 4); //kolom bernama 'active' dengan jenis boolean, hanya //produk yang aktif saja yang dapat diakses $this->hasColumn('active', 'boolean'); } //membuat beberapa opsi untuk tabel public function setUp() { //Timestampable akan membuat tabel memiliki dua kolom tambahan //kolom Created at dan Edit at $this->actAs('Timestampable'); //tabel ini memiliki relasi many to one dengan //tabel category $this->hasOne('Category', array( //local adalah kolom pada tabel ini //yang dijadikan acuan untuk relasi 'local' => 'category', //foreign adalah kolom pada tabel category //yang menjadi key yang dituju 'foreign' => 'id' )); //tabel ini memiliki relasi one to many dengan //tabel transaction_detail yang menampung daftar barang $this->hasMany('Transaction_detail as Transaction_details', array( //local adalah kolom pada tabel ini //yang dijadikan acuan untuk relasi 'local' => 'id', //foreign adalah kolom pada tabel transaction_detail //yang menjadi key yang dituju 'foreign' => 'transaction' )); } } ?> -
Buat berkas cashier.php di folder ci/application/models/ untuk mendefinisikan tabel berisi daftar nama kasir beserta password yang dapat mengakses aplikasi ini.
<?php //membuat kelas Cashier //turunan dari Doctrine_Record class Cashier extends Doctrine_Record{ //mendefinisikan kolom table public function setTableDefinition() { //tabel ini bernama cashier //memiliki kolom 'username', 'name', 'password', 'active' //kolom bernama username bertipe string digunakan //untuk login $this->hasColumn('username', 'string', 255); //kolom name bertipe string digunakan untuk ditampilkan //dalam layar dan cetakan nota penjualan (jika disediakan) $this->hasColumn('name', 'string', 255); //kolom password bertipe string $this->hasColumn('password', 'string', 255); //kolom bernama 'active' dengan jenis boolean, hanya //kasir yang aktif saja yang dapat membuka aplikasi $this->hasColumn('active', 'boolean'); } //membuat beberapa opsi untuk tabel public function setUp() { //tabel ini memiliki relasi one to many dengan //tabel transaction $this->hasMany('Transaction as Transactions', array( //local adalah kolom dalam tabel ini yang dijadikan //referensi pada tabel transaction 'local' => 'id', //foreign adalah kolom dalam tabel transaction //yang berhubungan dengan tabel ini 'foreign' => 'cashier' )); //ini berguna agar password akan dienkripsi sebelum diinsert //password adalah nama kolom, md5Password adalah fungsi enkripsi $this->hasMutator('password', 'md5Password'); } //fungsi enkripsi (fungsi mutator) public function md5Password($value){ //string ini akan ditambahkan pada string password sebelum //keduanya dienkripsi menggunakan metode md5, untuk menambah //kekuatan keamanan saja $salt = '#*r4H@51A!@-*%'; //menyetel kolom password menjadi hasil enkripsi searah dengan md5 $this->_set('password', md5($salt.$value)); } } ?> -
Buat berkas transaction.php di folder ci/application/models/ untuk menampung daftar transaksi penjualan. Tabel ini hanya berisi informasi kasir, nilai total transaksi dan waktu transaksi, informasi mengenai produk yang dijual dalam transaksi ada dalam tabel transaction_detail.
<?php //membuat kelas Transaction //turunan dari Doctrine_Record class Transaction extends Doctrine_Record{ //mendefinisikan kolom tabel public function setTableDefinition() { //tabel ini bernama transaction //memiliki kolom 'cashier', 'total', 'active' //kolom cashier berisi id kasir yang melayani $this->hasColumn('cashier', 'integer', 4); //kolom total berisi total nilai transaksi $this->hasColumn('total', 'float', 4); //kolom bernama 'active' dengan jenis boolean, hanya //transaksi yang aktif saja yang dapat diakses $this->hasColumn('active', 'boolean'); } //membuat beberapa opsi untuk tabel public function setUp() { //Timestampable akan membuat tabel memiliki dua kolom tambahan //kolom Created at dan Edit at $this->actAs('Timestampable'); //tabel ini memiliki relasi one to many dengan //tabel transaction_detail yang menampung daftar barang //dalam transaksi tersebut $this->hasMany('Transaction_detail as Transaction_details', array( //local adalah kolom pada tabel ini //yang dijadikan acuan untuk relasi 'local' => 'id', //foreign adalah kolom pada tabel transaction_detail //yang menjadi key yang dituju 'foreign' => 'transaction' )); //tabel ini memiliki relasi many to one //dengan tabel cashier $this->hasOne('Cashier', array( //local adalah kolom pada tabel ini //yang dijadikan acuan untuk relasi 'local' => 'cashier', //foreign adalah kolom pada tabel cashier //yang menjadi key yang dituju 'foreign' => 'id' )); } } ?> -
Buat berkas transaction_detail.php di folder ci/application/models/ berisi detail barang dalam transaksi.
<?php //membuat kelas Transaction_detail //turunan dari Doctrine_Record class Transaction_detail extends Doctrine_Record{ //mendefinisikan kolom tabel public function setTableDefinition() { //tabel ini bernama transaction_detail //memiliki kolom 'product', 'price', 'quantity', //'discount', 'transaction', 'active' //kolom product mengacu pada id product $this->hasColumn('product', 'integer', 4); //kolom price adalah harga produk pada saat //transaksi, kolom ini perlu karena dimungkinkan //terjadi perbedaan harga suatu produk $this->hasColumn('price', 'integer', 4); //kolom quantity adalah jumlah produk yang //dibeli dalam transaksi $this->hasColumn('quantity', 'integer', 4); //kolom discount berisi diskon yang dikenakan //pada produk tersebut pada saat transaksi terjadi //sama seperti harga, diskon juga mungkin berubah $this->hasColumn('discount', 'float', 4); //kolom transaction mengacu pada id transaksi $this->hasColumn('transaction', 'integer', 4); //kolom bernama 'active' dengan jenis boolean, hanya //detail transaksi yang aktif saja yang dapat diakses $this->hasColumn('active', 'boolean'); } //membuat beberapa opsi untuk tabel public function setUp() { //tabel ini memiliki relasi many to one //dengan tabel transaction $this->hasOne('Transaction', array( //local adalah kolom pada tabel ini //yang dijadikan acuan untuk relasi 'local' => 'transaction', //foreign adalah kolom pada tabel cashier //yang menjadi key yang dituju 'foreign' => 'id' )); //tabel ini memiliki relasi many to one //dengan tabel product $this->hasOne('Product', array( //local adalah kolom pada tabel ini //yang dijadikan acuan untuk relasi 'local' => 'product', //foreign adalah kolom pada tabel cashier //yang menjadi key yang dituju 'foreign' => 'id' )); } } ?> -
Nah, sudah selesai membuat model untuk tabelnya, sekarang waktunya membuat model itu dalam database, saatnya merasakan manfaat doctrine. Buat berkas doct.php di folder ci/application/controllers/ adalah kontroler yang membantu kita menangani pembuatan database
<?php //membuat kelas Doct yang digunakan //untuk mengelola database class Doct extends Controller{ //membuat fungsi make_table, digunakan //untuk membuat tabel berdasarkan model function make_table(){ //membuat tombol POST yang memicu pembuatan tabel echo 'Sudah yakin bahwa tabel tidak ada?<br /> <form action="" method="POST"> <input type="submit" name="action" value="Buat Tabel"><br />'; //jika tombol bernama "action" diklik if($this->input->post('action')){ //Doctrine akan membuat tabel berdasarkan model Doctrine::createTablesFromModels(); //Jika berhasil, tampilkan tulisan echo "Berhasil membuat Tabel"; } } } ?> -
Melalui browser buka http://localhost/ci/doct/make_table dan phpmyadmin.
- Setelah mengeksekusi Buat Tabel, hasilnya adalah seperti ini.

- Mari mengisi data pada tabel kita, buat folder dummy pada folder ci/application/
-
Buat berkas data.yml pada ci/application/dummy/.
cashier: Kasir1: username: code name: Kasir Pertama password: code active: 1 Kasir2: username: igniter name: Kasir Kedua password: igniter active: 1 Category: Kategori1: tittle: Makanan active: 1 Kategori2: tittle: Minuman active: 1 Product: Produk1: name: Coke price: 5000 discount: 0 Category: Kategori2 stock: 10 active: 1 Produk2: name: Gatorade price: 7000 discount: 0 Category: Kategori2 stock: 5 active: 1 Produk3: name: Roti Boy price: 10000 discount: 0 Category: Kategori1 stock: 15 active: 1 Produk4: name: Pizza Slice price: 15000 discount: 0 Category: Kategori1 stock: 5 active: 1 - Rubah berkas doct.php
<?php //membuat kelas Doct yang digunakan //untuk mengelola database class Doct extends Controller{ //membuat fungsi make_table, digunakan //untuk membuat tabel berdasarkan model function make_table(){ //bagian ini tidak diubah } //membuat fungsi load_data yang akan mengisi tabel dengan //data yang diload dari folder /application/dummy function load_data(){ //buat tombol submit untuk mentrigger fungsi echo 'Semua data pada tabel akan dihapus.<br /> <form action="" method="POST"> <input type="submit" name="action" value="Isi Tabel"><br />'; //lakukan pengisian data //jika terdapat inputan POST berisi "action" if($this->input->post('action')){ //untuk menghindari foreign key yang berhubungan, error Doctrine_Manager::connection()->execute('SET FOREIGN_KEY_CHECKS = 0'); //meload data Doctrine::loadData(APPPATH.'/dummy'); echo "Berhasil mengambil data"; } } } ?> -
Buka http://localhost/ci/doct/load_data kemudian eksekusi tombol load data, setelah itu buka phpmyadmin.
-
Jika isi tabel mengalami perubahan, tandanya eksekusi kode kita berhasil. Jika kita buka tabel category dan product
Kita baru saja merasakan kemudahan yang ditawarkan oleh doctrine, pertama kita membuat tabel beserta relasinya dengan sekali klik, selanjutnya kita mengisi tabel itu lagi-lagi dengan sekali klik. Struktur berkas yml (dibaca yaamel) juga tidak terlalu sukar dimengerti, kan? Hoho.
Oke, untuk episode kali ini sepertinya cukup, episode depan kita mulai dengan membuat kontroler untuk aplikasi POS kita. Happy Coding








thanks ye codenye gw minta, cuman itu gw komenter dikit..
tampilan buat hasilnye di peke dong.. biar kliatan jadinye kya ape..
bukannya udah disertain gambar hasil eksekusi kode?