Senin, 01 Agustus 2011

PHP Codeigniter - Export data dari database ke excel

export data from database to excel.

Pada kali ini saya juga akan sharing tentang export data dari database ke excel, dengan menggunakan library excel_reader2 yang bisa di download di http://code.google.com/p/php-excel-reader/downloads/list atau mirror

Sebelumnya, sharing ini adalah kelanjutan atau bisa dibilang masih berhubungan dengan sharing yang sebelumnya, yaitu sharing tentang penggunaan CI + jQuery 1.3.2  + Colorbox + Flexigrid. Jadi alangkah baikknya jika baca sharing yang sebelumnya, karena file yang ada di sharing tersebut dipakai pada sharing kali ini.. hehe

Langsung saja, pada sharing tentang export data ke excel ini cukup mudah dan simple (hehe bukannya sombong loh... XD),
jika excel_reader2 sudah di download taruh file excel_readernya dalam library untuk CI Versi 2 ada di folder CI_Root/application/libraries.
Selanjutnya edit file user.php dan buat fungsi export dan set_header seperti di bawah ini
function export(){
  $header = $this->set_header();
  $data = array($header);
    
  $filename  = 'Laporan_User';
  $loop = 0;
  foreach($this->user_model->getUser()->result() as $row){   
   $content[$loop] = array($row->USERNAME, $row->NAME, $row->EMAIL, $row->ADDRESS);
   array_push($data, $content[$loop]);
   $loop++;    
  }
  $this->load->helper('to_excel');
  array_to_excel($data, $filename); 
 }
  
 function set_header(){
  return array('Username','Nama','Email','Alamat');
 }

Setelah itu, edit pula file user_view.php
tambahkan button untuk export excel seperti contoh di bawah ini.
{name: 'Export', bclass: 'add', onpress : action}, // bclass : 'add' hanya untuk tampilan icon yg akan ditampilkan
{separator: true}

Setelah itu, tambahkan kondisi pada fungsi action pada user_view.php
if (com == 'Export') {
 if(confirm('Export to Excel file ?')) {
  export_excel();
 }
}

Tambahkan pula fungsi export_excel pada user_view.php
function export_excel() {
 window.open("<?php echo $url_form?>/export/","export_window");
}

Dan yang terakhir, buat file dengan nama to_excel_helper.php dan taruh dalam folder helper di CI.
if (!defined('BASEPATH')) exit('No direct script access allowed'); 

function to_excel($query, $filename='xlsoutput') 
{ 
     $headers = ''; // variable untuk menampung header 
     $data = ''; // variable untuk menampung data 

     //$obj =& get_instance(); 

     $fields = $query->field_data(); 
     if ($query->num_rows() == 0) { 
          echo 'The table appears to have no data.'; 
     } else { 
          foreach ($fields as $field) { 
             $headers .= $field->name . "\t"; 
          } 

          foreach ($query->result() as $row) { 
               $line = ''; 
               foreach($row as $value) { 
                    if ((!isset($value)) OR ($value == "")) { 
                         $value = "\t"; 
                    } else { 
                         $value = str_replace('"', '""', $value); 
                         $value = '"' . $value . '"' . "\t"; 
                    } 
                    $line .= $value; 
               } 
               $data .= trim($line)."\n"; 
          } 

          $data = str_replace("\r","",$data); 

          header("Content-type: application/x-msdownload"); 
          header("Content-Disposition: attachment; filename=$filename.xls"); 
          echo "$headers\n$data"; 
     } 
} 

function array_to_excel($array, $filename='xlsoutput') 
{ 
     $headers = ''; // variable untuk menampung header 
     $data = ''; // variable untuk menampung data 

     //$obj =& get_instance(); 

     //$fields = $query->field_data(); 
     if (sizeof($array) == 0) { 
          echo 'The table appears to have no data.'; 
     } else { 
          foreach ($array as $row) { 
               $line = ''; 
               foreach($row as $value) { 
                    if ((!isset($value)) OR ($value == "")) { 
                         $value = "\t"; 
                    } else { 
                         $value = str_replace('"', '""', $value); 
                         $value = '"' . $value . '"' . "\t"; 
                    } 
                    $line .= $value; 
               } 
               $data .= trim($line)."\n"; 
          } 

          $data = str_replace("\r","",$data); 


        header('Content-type: application/ms-excel'); 
        header("Content-Disposition: attachment; filename=$filename.xls"); 
        echo $data; 
     } 
}
Nah, lumayan mudah kan untuk export dari database ke file excel...

Sekian sharing untuk export ke file excel.
Semoga bisa bermanfaat... ^_^


Keyword : PHP CodeIgniter, Export to excel, excel reader

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi    : http://code.google.com/p/php-excel-reader/
Author       : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Sharing Penggunaan jQuery Flexigrid dan Colorbox pada CodeIgniter

Wah setelah sekian lama tidur dari dunia per blog-an, kini bangun lagi untuk ngeblog.. hehe maklum sok sibuk.. XD
kali ini saya akan sharing tentang penggunaan CI + jQuery 1.3.2 (jQuery UI) + Colorbox + Flexigrid. Flexigrid adalah plugin dari jQuery untuk menampilkan data dalam format grid/tabel (ya begitulah pokoknya mah.. hahay..), sedang Colorbox fungsinya terutama yg saya ambil adalah untuk membuat tampilan form.

langsung saja, pertama2 download dulu bahan2 yang dibutuhkan, seperti
  1. CI (CI yg saya gunakan pada sharing kali ini adalah CI versi 2) di codeigniter.com
  2. jQuery, bisa di jqueryui.com,
  3. Flexigrid, bisa d dapat di  flexigrid for jquery (per 25 Juli 2011) atau mirror
  4. Colorbox, bisa di dapat di  colorpowered.com (per 25 Juli 2011) atau mirror. Untuk Colorbox, saya menggunakan css dan folder images dari example 5 dalam sharing kali ini.
Setelah semua bahan di dapat, ekstrak CI ke web server (contoh Xampp) dengan nama test, setelah itu taruh/ekstrak file/folder jQuery, Flexigrid dan Colorbox ke folder "api" yg sejajar dg folder system dalam aplikasi CI seperti gambah dibawah ini. Namun kalau ingin lebih mudah mendapatkan bahan-bahan yang dibutuhkan, silakan download file api.zip / mirror yang telah saya sediakan.


Pertama2, untuk design database, saya hanya menggunakan satu tabel aja (ya kan cuma contoh, g papa kan...??!!! hehe)
buat tabel dengan nama 'user_account' pada mysql.
CREATE TABLE IF NOT EXISTS `user_account` (
  `USERNAME` varchar(20) NOT NULL,
  `NAME` varchar(50) NOT NULL,
  `EMAIL` varchar(32) NOT NULL,
  `ADDRESS` varchar(100) NOT NULL,
  PRIMARY KEY (`USERNAME`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Setelah itu, buat file controller untuk menangani request dari user dengan nama file user.php yang isinya
class User extends CI_Controller{
 function __construct(){
  parent::__construct();
  $this->load->model('user_model');
 }
 
 function index(){
  $data['view']        = 'user/user_view';
  $data['url_json']  = site_url('user/json_user');
  $data['url_form']    = site_url('user');
  $data['title']      = 'Data User';
  $data['title_form']  = 'Form Data User';
  $this->load->view('home',$data);
 }
 
 function json_user(){
  $page   = $this->input->post('page');
  $rp   = $this->input->post('rp');
  $sortname  = $this->input->post('sortname');
  $sortorder  = $this->input->post('sortorder');
  if (!$sortname) $sortname  = 'username';
  if (!$sortorder) $sortorder = 'asc';
  
  $sort = "ORDER BY $sortname $sortorder";  // untuk pengurutan data
  
  if (!$page) $page = 1;  // halaman yg di tampilkan pertama kali
  if (!$rp) $rp = 10;  // total baris yg ditampilkan
  
  $start = (($page-1) * $rp);
  $limit = "LIMIT $start, $rp";  // untuk pembatasan data yg ditampilkan / pagination
  
  $query = $this->input->post('query');  // parameter yg diinputkan saat pencarian data
  $qtype = $this->input->post('qtype');  // kolom atribut yang ingin dicari 
  
  $where = "";
  if ($query) $where .= " WHERE $qtype LIKE '%$query%'";  // untuk proses pencarian data
  
  $result = $this->user_model->getUser($where, $sort, $limit);
  $total  = $this->user_model->countUser($where);
  
  $json  = "";    
  $json .= "{\n";
  $json .= "page: $page,\n";
  $json .= "total: $total,\n";
  $json .= "rows: [";
  $rc = false;
  $i = $start;
  foreach ($result->result() as $row) {
   $i++;
   if($i <= 9) $i = '0'.$i;
   if ($rc) $json .= ",";
   $json .= "\n{";
   $json .= "id:'".$row->USERNAME."',";
   $json .= "cell:[";
   $json .= "'".$i."',";
   $json .= "'".addslashes($row->USERNAME)."',";
   $json .= "'".addslashes($row->NAME)."',";
   $json .= "'".addslashes($row->EMAIL)."',";
   $json .= "'".addslashes($row->ADDRESS)."'";
   $json .= "]}";
   $rc = true;  
  }
  $json .= "\n]}";
  
  header("Expires: Wed, 01 Jan 2020 00:00:00 GMT" ); 
  header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT"); 
  header("Cache-Control: no-cache, must-revalidate" ); 
  header("Pragma: no-cache" );
  header("Content-type: text/x-json");
  echo $json;
 }
 
 function add(){  //  fungsi untuk menampilkan form tambah user
  $data['view']    = 'user/user_form';
  $data['action']  = site_url('user/create');
  $this->load->view('home', $data);
 }
 
 function create(){  //  fungsi untuk tambah data user
  $data   = array('username' => trim($this->input->post('username')),
       'name' => trim($this->input->post('name')), 
       'email' => trim($this->input->post('email')),
       'address' => trim($this->input->post('address')));         
  $this->user_model->addUser($data);
  $this->reload(); 
 }
 
 function edit($username){  //  fungsi untuk menampilkan form edit user
  $user = $this->user_model->getUserByUsername($username)->row();
  $data['action']  = site_url("user/update/$username");
  $data['view']     = 'user/user_form';
  $data['username'] = $user->USERNAME;
  $data['name']  = $user->NAME;
  $data['email']  = $user->EMAIL;
  $data['address'] = $user->ADDRESS;
  $this->load->view('home', $data);
 }
 
 function update($username){  //  fungsi untuk edit data user
  $data   = array('name' => trim($this->input->post('name')), 
       'email' => trim($this->input->post('email')),
       'address' => trim($this->input->post('address'))); 
  $this->user_model->editUser($username, $data);
  $this->reload();
 }
 
 function delete($username){  //  fungsi untuk hapus data user
  $this->user_model->deleteUser($username);
 }
 
 function reload(){  // fungsi untuk mereload flexigrid
  echo '<script type="text/javascript">parent.$("#tabel").flexReload();</script>';
  echo '<script type="text/javascript">parent.$.fn.colorbox.close();</script>';
 }
}

Dari yang saya dapet dari internet, terdapat fungsi dari flexigrid yang ditaruh dalam folder libraries d CI.
Namun setelah saya coba, bisa juga file flexigridnya disatukan dalam controller seperti pada fungsi json_user di atas.

Setelah membuat controller selesai, buatlah model dengan nama user_model.php yg isinya
*Untuk proses validasi data bisa kamu bikin peraturannya sendiri, seperti tidak boleh ada username yg sama, dan lainnya.

class User_model extends CI_Model{
 function __construct(){
  parent::__construct();
 }
 
 var $table = 'user_account';
 
 //  fungsi untuk mengambil data user per-page (pagination), 
 //  ** khusus untuk MySql, cos untuk Oracle ataupun Postgre saya blum coba.. hehe
 function getUser($where = '', $sort = '', $limit = ''){
  return $this->db->query("select * from ".$this->table." $where $sort $limit");
 }
 
 function getUserByUsername($username){
  return $this->db->get_where($this->table, array('username' => $username));
 }
 
 function countUser($where){
  return $this->getUser($where)->num_rows();
 }

 function addUser($data){
  $this->db->insert($this->table,$data); 
 }
 
 function editUser($username, $data){
  $this->db->where('username',$username);
  $this->db->update($this->table, $data);
 }
 
 function deleteUser($username){
  $this->db->delete($this->table, array('username' => $username));
 }
}

untuk query dalam User_model.php nya hanya untuk CRUD yang sederhana (hehe belagu bin ngguaya nih.. :P), jadi saya pake Active Record-nya CI, biar simpel (kecuali fungsi yang pertama XD).

untuk view ada 3 file yg harus dibuat
1. file home.php yg berisi
<html>
<head>
 <meta name="KEYWORDS" content="Contoh JQuery Flexigrid dan Colorbox">
    <title>Contoh JQuery Flexigrid dan Colorbox</title>
 <link type="text/css" rel="stylesheet" media="all" href="<?php echo base_url()?>api/themes/redmond/jquery.ui.all.css" />
 <link type="text/css" rel="stylesheet" media="all" href="<?php echo base_url()?>api/flexigrid/css/flexigrid.css">
 <link type="text/css" rel="stylesheet" media="all" href="<?php echo base_url()?>api/colorbox/colorbox.css" />
 
 <!-- yang ini optional, sesuai css yg kamu mau, tapi sudah saya includkan d api.zip-->
 <link type="text/css" rel="stylesheet" media="all" href="<?php echo base_url()?>api/style.css" />
 
 <script type="text/javascript" language="javascript" src="<?php echo base_url()?>api/jquery/jquery-1.3.2.js"></script>
 <script type="text/javascript" language="javascript" src="<?php echo base_url()?>api/flexigrid/js/flexigrid.js"></script>
 <script type="text/javascript" language="javascript" src="<?php echo base_url()?>api/colorbox/jquery.colorbox.js"></script>

 <script type="text/javascript">
  $(document).ready(function() {
   $("#cancel").click(function() {
    parent.$.fn.colorbox.close();
   });
  });
 </script>
</head>
<body>
<?php $this->load->view($view);?>
</body>
</html>

2. file user_view.php, file ini ditaruh dalam folder user pada view. file ini bertujuan untuk menampilkan data pada grid.
<table id="tabel" style="display:none"></table>
<script type="text/javascript" language="javascript">
 $('#tabel').flexigrid ({
  url: '<?php echo $url_json?>',       // url untuk memanggil fungsi di controller test/json_test
  dataType: 'json', 
  colModel : [
   {display: 'NO',   name : 'no',   width : 25,  sortable : true,  align: 'center'},
   {display: 'Username',  name : 'username',  width : 80,  sortable : true,  align: 'left'},
   {display: 'Nama',   name : 'name',   width : 110,  sortable : true,  align: 'left'},
   {display: 'Email',   name : 'email',  width : 200,  sortable : false, align: 'left'},
   {display: 'Alamat',  name : 'address',  width : 320,  sortable : false, align: 'left'}
  ],
  buttons : [     // tombol untuk melakukan tambah/edit/hapus data di grid
   // bclass untuk flexigrid sudah di definisikan (default), untuk tambah : add, edit : edit, dan hapus : delete. 
   //Jika ingin buat bclass baru, maka harus mengedit colorbox.css-nya (tidak direkomendasikan bagi yg belum expert...hehe)
   {name: 'Add', bclass: 'add', onpress : action}, 
   {separator: true},
   {name: 'Edit', bclass: 'edit', onpress : action},
   {separator: true},
   {name: 'Delete', bclass: 'delete', onpress : action},
   {separator: true}
  ],
  searchitems : [    // tombol untuk pencarian data
   // untuk field "name" usahakan namanya sama dengan nama atribut yg dicari dalam database
   {display: 'Username', name : 'username', isdefault: true}, 
   {display: 'Nama', name : 'name', isdefault: false}
  ],
  sortname: 'username',  // sortname sesuaikan dengan nama atribut dalam database
  sortorder: 'asc',
  usepager: true,
  resizable: false,
  title: '<?php echo $title?>',
  useRp: true,
  rp: 10,
  showTableToggleBtn: true,
  width: 800,
  height: 241
 });
 
  
 function action(com,grid) {
  // 'Add' === name dalam button flexigrid 
  if (com == 'Add') {   
   forms('add', '');
  } else if (com == 'Edit') {
   // cek baris yg d pilih (contoh baris yg dipilih min/max adalah 1)
   if ($('.trSelected',grid).length == 1) { 
    $('.trSelected',grid).each(function() {
     var id = $(this).attr('id');
     id = id.substring(id.lastIndexOf('row')+3);  // ambil data kolom id       
     forms('edit', id);
    });    
   } else {
    alert('Silahkan pilih salah satu baris yang ingin di edit');
    return false;
   }
  } else if (com == 'Delete') {
   if ($('.trSelected',grid).length == 1) {
    $('.trSelected',grid).each(function() {
     var id   = $(this).attr('id');
     id = id.substring(id.lastIndexOf('row')+3);
     if(confirm('Apakah anda yakin akan menghapus data : '+id+' ?')) {
      $.ajax({
       type: 'get',
       url:'<?php echo $url_form?>/delete/'+id,         // url untuk fungsi pada controller test/delete($id)
       success: function() { $('#tabel').flexReload(); }
      });
     }
    });
   } else {
    alert('Silahkan pilih salah satu baris yang ingin di delete');
    return false;
   }
  }
 }
  
 function forms(clas, id){ // setting untuk tampilan colorbox  
  if(id != ''){ 
   id = '/' + id; 
  }else { 
   id = ''; 
  }
  $('.'+clas).colorbox({
   href  : '<?php echo $url_form?>/'+clas+id,  // memanggil fungsi di controller test/add($id) atau test/edit($id)
   innerWidth : 500, 
   innerHeight : 297,
   iframe  : true,
   overlayClose: false,
   title  : '<font color="#45678D"><b><?php echo $title_form?></b></font>',
   onLoad  : function() { $('#cboxClose').remove(); }
  });
 }
</script>

dan yang terakhir,
3. file user_form.php, file ini bertujuan untuk menampilkan form (dg colorbox) untuk proses tambah atau edit data.
<form id="form" name="form" action="<?php echo $action ?>" method="post" enctype="multipart/form-data">
<table border="0" cellpadding="2" cellspacing="1" style="margin:5px">
 <tr>
  <td>Username</td>
     <td>&nbsp;:&nbsp;</td>
     <td><input type="text" name="username" <?php echo (!empty($username))? "value='$username' disabled" : '';?> /></td>
 </tr>        
 <tr>
  <td>Nama</td>
     <td>&nbsp;:&nbsp;</td>
     <td><input type="text" name="name" value="<?php echo (!empty($name))? $name : '';?>" /></td>
 </tr>    
 <tr>
  <td>Email</td>
     <td>&nbsp;:&nbsp;</td>
     <td><input type="email" name="email" value="<?php echo (!empty($email))? $email : '';?>" /></td>
 </tr>        
 <tr>
  <td>Alamat</td>
     <td>&nbsp;:&nbsp;</td>
     <td><textarea name="address" cols="40" rows="3"><?php echo (!empty($address))? $address : '';?></textarea></td>
 </tr>
 <tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
    <tr>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
  <td><input type="submit" value="Submit">&nbsp;<input type="button" value="Cancel" name="cancel" id="cancel"></td>
 </tr>
</table>
</form>

Untuk file user_view.php dan user_form.php di taruh dalam folder user dalam view.


OK. Sekian dulu sharing dari saya, mumpung lagi mood buat sharing. hehe
Moga bermanfaat bagi yg membutuhkan.. ^_^

Keyword : PHP CodeIgniter, Flexigrid, Colorbox, jQuery

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi    :jQuery, Flexidrid and Colorbox example.
Author       : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com