Blog Archives

Membuat Laporan menggunakan lib mPDF pada CI

Bagian ini membahas proses pembuatan salah satu laporan untuk aplikasi Simple Kasir yang telah dibahas tahun lalu. Baru sempat merangkumnya sekarang. 🙂

Contoh laporan yang akan dibuat adalah laporan penjualan untuk bulan tertentu. Pembuatan laporan ini menggunakan lib dari mPDF yang bisa diunduh disini. Pada contoh ini digunakan mPDF versi 5.7, jika ingin menggunakan versi yang terbaru silahkan. Pada situs ini juga disediakan dokumentasi yang cukup lengkap yang bisa dijadikan sebagai bahan acuan pembangunan laporan.

Langkah-langkah awal yang harus dilakukan agar bisa menggunakan mPDF pada CI adalah :

1. Ekstrak file MPDF57.zip yang sudah diunduh sebelumnya. Hasil ekstraksi berupa folder MPDF57 letakkan di folder application/libraries/MPDF57, kita bisa menghapus beberapa file atau folder yang tidak diperlukan, misalnya : folder example, iccprofiles, graph_cache.

Lib mPDF memerlukan fungsi mb_string bawaan dari php, jadi pastikan pada file php.ini extension php_mbstring.dll ter-enable.

2. Agar bisa digunakan dengan mudah dalam CI, kita buat class pdf yang akan membungkus lib mPDF ini. Pada folder application/libraries buat file pdf.php dan isi dengan code berikut :

<?php if ( ! defined('BASEPATH')) exit('Tidak ada akses langsung script diperbolehkan');

class pdf{
    function pdf(){
        $CI =& get_instance();
        log_message('Debug', 'mPDF class is loaded.');
    }

    function load($param=NULL){
        include_once APPPATH.'libraries/MPDF57/mpdf.php';
        if($params == NULL){
            $param = '"en-GB-x","A4","","",10,10,10,10,6,3';
        }
        return new mPDF($param);
    }
}

 /* End of file pdf.php
    Location ./application/libraries/pdf.php */

Pada class pdf terdapat fungsi load yang digunakan untuk memuat lib mPDF. Jika saat memanggil fungsi load tidak ada parameter yang dilewatkan maka secara default fungsi ini akan menginstansiasi object mPDF dengan parameter = “en-GB-x”,”A4″, “”, “”, 10, 10, 10, 10, 6, 3; dimana urutan parameternya adalah : mode, format kertas, font size, font, margin left, margin right, margin top, margin bottom, margin header, margin footer, orientasi kertas (bisa diisi dengan p / portrait atau l / landscape).

Sampai tahap ini library pdf sudah bisa digunakan. Cara memuat lib ini sama seperti memuat lib lainnya, cukup dengan syntax : $this->load->library(‘pdf’);. Dan untuk mendapatkan object dari class mPDF dengan memanggil fungsi load dengan syntax : $pdf=$this->pdf->load();.

3. Buat helper pada application/helpers dengan nama file “common_helper.php”. Tambahkan fungsi “getMonthName” untuk mendapatkan nama-nama bulan, fungsi “get5LastYears” untuk mendapatkan daftar tahun lima tahun kebelakang dan fungsi “getNameOfMonth” untuk mendapatkan nama bulan dari nomor urut bulan. Code-nya :

<?php if ( ! defined('BASEPATH')) exit('Tidak ada akses langsung script diperbolehkan');

if ( ! function_exists('getMonthNames')){
    function getMonthNames(){
        $namaBulan = array(
            1 => 'Januari',
            2 => 'Februari',
            3 => 'Maret',
            4 => 'April',
            5 => 'Mei',
            6 => 'Juni',
            7 => 'Juli',
            8 => 'Agustus',
            9 => 'September',
            10 => 'Oktober',
            11 => 'November',
            12 => 'Desember');
        return $namaBulan;
    }
}
if( ! function_exists('getNameOfMonth')){
    function getNameOfMonth($bln){
        $namaBulan = getMonthNames();
        return $namaBulan[(int)$bln];
    }
}
if( ! function_exists('getg5LastYears')){    
    function get5LastYears(){
        $listTahun = array();
        $thnNow = intval(date('Y'));
        for($i=$thnNow-4; $i<=$thnNow; $i++){
            $listTahun[(string)$i] = (string)$i;
        }
        return $listTahun;
    }
}    
/*     End of file common_helper.php
    Location ./application/helpers/common_helper.php */

4. Buat controller untuk menampilkan halaman cetak laporan dengan nama lapPenjualanPerBulan.php. Pada bagian constructor muat lib template, table dan validation serta model item dan user. Buat fungsi _set_fields yang akan menampung nilai inputan bulan dan tahun.

Fungsi index akan menampilkan halaman generate laporan dengan memilih bulan dan tahun terlebih dahulu. Untuk mengisi dropdownlist bulan dan tahun, digunakan fungsi dari helper yang sebelumnya sudah kita buat, muat helper dengan syntax : $this->load->helper(‘common_helper’); dan untuk memanggil fungsinya cukup dengan syntax : getMonthNames() dan get5LastYears(). Code-nya :

    function __construct(){
        parent::__construct();
        //load lib:
        $this->load->library('template','table');        
        //load model:
        $this->load->model('item_model', '', TRUE);
        $this->load->model('user_model', '', TRUE);
    }
    
    function index(){
        if($this->session->userdata('logged_in')) {            
            $session_data = $this->session->userdata('logged_in');
            $data['jabId'] = $session_data['jab'];
            $data['judul'] = 'Penjualan';
            
            $this->load->helper('common_helper');
            $data['cbBulan'] = getMonthNames();
            $data['cbTahun'] = get5LastYears();
            $data['lap'] = 'lapPenjualanPerBulan';
            
            $this->validation->namaBulan = date('m');
            $this->validation->tahun = date('Y');
            
            $this->template->display('laporan/lapBlnan', $data);
        }else{ //jika tidak ada session, redirect ke halaman login
            redirect('login', 'refresh');
        }
    }

Tambahkan fungsi loadReport yang akan menghasilkan file pdf yang akan di tampilkan di tab baru, dalam membuat pdf digunakan lib mPDF yang sudah dibungkus dalam class pdf sebelumnya.

    function loadReport(){
        if($this->session->userdata('logged_in')) {            
            $session_data = $this->session->userdata('logged_in');            
            $data['bulan'] = $this->input->post('bln');
            $data['tahun'] = $this->input->post('thn');
            $this->load->helper('common_helper');
            $data['tglCetak'] = date('d') .' '. getNameOfMonth(date('m')) . ' ' . date('Y');
            //As PDF creation takes a bit of memory, we're saving the created file in /downloads/reports/
            $pdfFilePath = FCPATH."/downloads/reports/lapJualBln".date('F').".pdf";
            
            if(file_exists($pdfFilePath)==FALSE){
                ini_set('memory_limit', '64M');
                //generate table :
                $items = $this->item_model->GetLapJualPerBln($data['bulan'] . '-' . $data['tahun']);                
                $this->load->library('table');
                $this->table->set_empty("&nbsp;");
                $this->table->set_heading('No', 'Kode Barang', 'Nama Barang', 'Foto', 'Jumlah Terjual');
                if($items != false){
                    $i=0;
                    foreach($items as $brg){
                        $this->table->add_row(
                            ++$i,
                            $brg->IdBrg,
                            $brg->NamaBarang,
                            ($brg->GambarBarang!=null) ?
                            '<img width="100" src="data:image/jpeg;base64,'.base64_encode($brg->GambarBarang).'">' : '-',
                            $brg->jumTerjual
                        );
                    }
                }else{
                    $this->table->add_row("","","Tidak ada barang yang terjual","","");
                }
                $data['table'] = $this->table->generate();    
                
                $data['bulan'] = getNameOfMonth($data['bulan']);
                
                $peg = $this->user_model->GetUserByUserName($session_data['username']);
                $data['namaPeg'] = $peg->NamaPengguna;
                
                $html = $this->load->view('laporan/labjualPerBln', $data, true); //render the view into HTML
                $this->load->library('pdf');
                $pdf=$this->pdf->load();
                $pdf->SetFooter(''.'|{PAGENO}|'.''); //Add a footer for good measure
                $pdf->WriteHTML($html); //write the HTML into PDF
                $pdf->Output();
            }
            redirect("downloads/reports/namafile.pdf");
        }else{ //jika tidak ada session, redirect ke halaman login
            redirect('login', 'refresh');
        }
    }

Guna menghasilkan laporan dalan bentuk pdf diperlukan tampilan html yang merupakan isi content dari laporan, dalam contoh ini namanya “labjualPerBln.php” yang akan tersimpan pada application/views/laporan. Code pada file tersebut adalah:

<head>
    <title>Lap. Penjualan</title>
    <link rel="stylesheet"type="text/css"href="<?php echo base_url().$this->config->item('css'); ?>"/>
</head>
<body>
<div id="content">
    <div class="row">
        <div class="caption" align="center">Laporan Penjualan Barang bulan <?php echo $bulan." ".$tahun;?> </div>
        <div class="end"></div>
    </div>
    <hr>
    <div class="row">
        <div class="value">Tanggal Cetak : <?php echo $tglCetak;?></div>
        <div class="end"></div>
    </div>
    <br/>
    <div class="row">
        <div class="value">Berikut adalah daftar barang yang berhasil terjual bulan ini.</div>
        <div class="end"></div>
    </div>
    <div class="row">        
        <div class="data"><?php echo $table; ?></div>
        <div class="end"></div>
    </div>
    <div class="spacer"></div>
    <div class="row">
        <div class="value" align="right">
            Pembuat Laporan
            <br/><br/><br/>
            <b><?php echo $namaPeg; ?></b>
        </div>
        <div class="end"></div>
    </div>
</div>                        
</body>

5. Buat tampilah halaman yang akan membuat file pdf simpan dengan nama lapBlnan.php, code-nya :

<head>
    <title><?php echo "Laporan ".$judul."/Bulan";?></title>    
    <script type="text/javascript" src="<?php echo base_url() ?>assets/js/jquery-1.3.2.min.js"></script>
</head>
<body>
    <div class="row">
        <div class="caption"><?php echo "Laporan ".$judul." Barang/Bulan"; ?></div>
        <div class="end"></div>
    </div>
    <hr />
    <div id="content">
        <?php echo form_open(site_url($lap.'/loadReport'), array('target' => '_blank'));?>
        <div class="row">
            <div class="caption_border">Pilih Periode Laporan</div>
            <div class="end"></div>
        </div>
        <div class="row">
            <table>
                <tr>
                    <td style="padding-left:5px;">Bulan : </td>
                    <td style="padding-left:5px;"><?php echo form_dropdown('bln',$cbBulan,$this->validation->namaBulan,'id="bln";onChange="updateGraph()"');?></td>
                    <td style="padding-left:15px;">Tahun : </td>
                    <td style="padding-left:5px;"><?php echo form_dropdown('thn',$cbTahun,$this->validation->tahun,'id="thn";onChange="updateGraph()"');?></td>
                    <td style="padding-left:15px;">
                        <?php $f_btn = array('name'=>'submit', 'id'=>'submit', 'value'=>'Generate Report');
                              echo form_submit($f_btn); ?>
                    </td>
                </tr>
            </table>
            <div class="end"></div>
        </div>
        <div class="spacer"></div>
    </div>
</body>

6. Selesai. Slanjutnya tinggal mendaftarkan halaman laporan tersebut pada menu dan contoh hasil tampilannya adalah :

Dan ketika menekan tombol “Generate Report” akan terbuka tab baru yang menampilkan laporan dalam format pdf. Contoh tampilannya:

Sekian catatan kali ini. Semoga bermanfaat… (^u^)