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.

  1. 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'
            ));
        }
    }
    ?>
    
  2. 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'
            ));
        }
    }
    ?>
    
  3. 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));
        }
    }
    ?>
    
  4. 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'
            ));
        }
    }
    ?>
    
  5. 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'
            ));
        }
    }
    ?>
    
  6. 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";
            }
        }
    }
    ?>
    
  7. Melalui browser buka http://localhost/ci/doct/make_table dan phpmyadmin.

    http://localhost/ci/doct/make_tablephpmyadmin

  8. Setelah mengeksekusi Buat Tabel, hasilnya adalah seperti ini.
  9. Mari mengisi data pada tabel kita, buat folder dummy pada folder ci/application/
  10. 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
    
  11. 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";
            }
        }
    }
    ?>
    
  12. Buka http://localhost/ci/doct/load_data kemudian eksekusi tombol load data, setelah itu buka phpmyadmin.

  13. 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

  1. thanks ye codenye gw minta, cuman itu gw komenter dikit..
    tampilan buat hasilnye di peke dong.. biar kliatan jadinye kya ape..

      • aing
      • Desember 13th, 2010

      bukannya udah disertain gambar hasil eksekusi kode?

  2. Mohondikirim sourcenya. tks

  1. No trackbacks yet.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: