Jumat, 28 Desember 2012

Event Calendar with Codeigniter

At this time i'll share about create event calendar with Codeigniter. I use Codeigniter 2.1.3 to create it. well, it's my first calendar... XD

the screenshot :  


First, we should create a database table
CREATE TABLE t_notes (
  `date` DATE NOT NULL,
  notes VARCHAR(30) NOT NULL,
  PRIMARY KEY (`date`)
)

and then, make sure configuration of database and autoload (database, url, form) has been set.
The controller, mynotes.php :
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Mynotes extends CI_Controller {
 
 function __construct(){
  parent::__construct();
  $this->load->model('mynotes_model', 'mynotes');
  $this->load->library('calendar', $this->_setting());
 }
 
 function index(){
  redirect('mynotes/notes');
 }
 
 // untuk konversi nama bulan
 function _month($mon){
  $mon = (int) $mon;
  switch($mon){
   case 1 : $mon = 'Januari'; Break;
   case 2 : $mon = 'Februari'; Break;
   case 3 : $mon = 'Maret'; Break;
   case 4 : $mon = 'April'; Break;
   case 5 : $mon = 'Mei'; Break;
   case 6 : $mon = 'Juni'; Break;
   case 7 : $mon = 'Juli'; Break;
   case 8 : $mon = 'Agustus'; Break;
   case 9 : $mon = 'September'; Break;
   case 10 : $mon = 'Oktober'; Break;
   case 11 : $mon = 'November'; Break;
   case 12 : $mon = 'Desember'; Break;
  }
  return $mon;
 }
 
 // untuk menambahkan catatan pada tanggal
 function add_note($date){
  $data = array(
     'day'   => $date,
     'mon'   => $this->input->post('mon'),
     'month' => $this->_month($this->input->post('mon')),
     'year'  => $this->input->post('year'),
    );
  $this->load->view('add_note', $data);
 }
 
 // aksi insert catatan
 function do_add($year, $mon, $day){
  $this->mynotes->addNote($year, $mon, $day, $this->input->post('note', true));
  $this->notes($year, $mon);
 }
 
 // menampilkan opsi untuk menghapus atau edit catatan
 function updel_note($date){
  $data = array(
     'day'   => $date,
     'mon'   => $this->input->post('mon'),
     'month' => $this->_month($this->input->post('mon')),
     'year'  => $this->input->post('year'),
     'note'  => $this->mynotes->getNote($this->input->post('year'), $this->input->post('mon'), $date)
    );
  $this->load->view('updel_note', $data);
 }
 
 // aksi untuk edit catatan
 function edit_note($year, $mon, $day){
  $this->mynotes->editNote($year, $mon, $day, $this->input->post('note', true));
  $this->notes($year, $mon);
 }
 
 // aksi untuk hapus catatan
 function delete_note($year, $mon, $day){
  $this->mynotes->deleteNote($year, $mon, $day);
  $this->notes($year, $mon);
 }
 
 // fungsi utama untuk menampilkan kalender catatan
 function notes($year = null, $mon = null){
  $year = (empty($year) || !is_numeric($year))?  date('Y') :  $year;
  $mon  = (empty($mon) || !is_numeric($mon))?  date('m') :  $mon;
  
  $date = $this->mynotes->getCalendar($year, $mon);
  $data = array(
     'notes' => $this->calendar->generate($year, $mon, $date),
     'year'  => $year,
     'mon'   => $mon
    );
  $this->load->view('mynotes', $data);
 }
 
 // setting tampilan kalender
 function _setting(){
  return array(
   'start_day'   => 'sunday',
   'show_next_prev'  => true,
   'next_prev_url'  => site_url('mynotes/notes'),
   'month_type'     => 'long',
            'day_type'       => 'short',
   'template'    => '{table_open}<table class="date">{/table_open}
           {heading_row_start}&nbsp;{/heading_row_start}
           {heading_previous_cell}<caption><a href="{previous_url}" class="prev_date" title="Previous Month">&lt;&lt;</a>{/heading_previous_cell}
           {heading_title_cell}{heading}{/heading_title_cell}
           {heading_next_cell}<a href="{next_url}" class="next_date"  title="Next Month">&gt;&gt;</a></caption>{/heading_next_cell}
           {heading_row_end}<col class="weekend_sun"><col class="weekday" span="5"><col class="weekend_sat">{/heading_row_end}
           {week_row_start}<thead><tr>{/week_row_start}
           {week_day_cell}<th>{week_day}</th>{/week_day_cell}
           {week_row_end}</tr></thead><tbody>{/week_row_end}
           {cal_row_start}<tr>{/cal_row_start}
           {cal_cell_start}<td>{/cal_cell_start}
           {cal_cell_content}<a href="'.site_url('mynotes/updel_note').'/{day}" class="act_note" title="Edit/hapus catatan untuk tanggal {day}"><div class="active act_note" val="{day}" title="Edit/Hapus catatan untuk tanggal {day}">{day}</div></a><div class="notes">{content}</div></div>{/cal_cell_content}
           {cal_cell_content_today}<a href="'.site_url('mynotes/updel_note').'/{day}" class="act_note" title="Edit/hapus catatan untuk tanggal {day}"><div class="t_active" title="Edit/Hapus catatan untuk tanggal {day}">{day}</div></a><div class="t_notes">{content}</div>{/cal_cell_content_today}
           {cal_cell_no_content}<a href="'.site_url('mynotes/add_note').'/{day}" class="act_note" title="Tambah catatan untuk tanggal {day}"><div class="day" title="Tambah catatan untuk tanggal {day}">{day}</div></a>{/cal_cell_no_content}
           {cal_cell_no_content_today}<a href="'.site_url('mynotes/add_note').'/{day}" class="act_note" title="Tambah catatan untuk tanggal {day}"><div class="today" title="Tambah catatan untuk tanggal {day}">{day}</div></a>{/cal_cell_no_content_today}
           {cal_cell_blank}&nbsp;{/cal_cell_blank}
           {cal_cell_end}</td>{/cal_cell_end}
           {cal_row_end}</tr>{/cal_row_end}
           {table_close}</tbody></table>{/table_close}');
 }
}

next step is about model,  mynotes_model.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Mynotes_model extends CI_Model {
 function getCalendar($year, $mon){
  $year  = ($mon < 9 && strlen($mon) == 1) ? "$year-0$mon" : "$year-$mon";
  $query = $this->db->select('date, notes')->from('t_notes')->like('date', $year, 'after')->get();
  if($query->num_rows() > 0){
   $data = array();
   foreach($query->result_array() as $row){
    $data[(int) end(explode('-',$row['date']))] = $row['notes'];
   }
   return $data;
  }else{
   return false;
  }
 }
 
 function addNote($year, $mon, $day, $note){
  $mon = (strlen($mon) == 2)? $mon : "0$mon";
  $day = (strlen($day) == 2)? $day : "0$day";
  $this->db->query("INSERT INTO t_notes(date, notes) VALUES ('$year-$mon-$day', ?)", array($note));
 }
 
 function editNote($year, $mon, $day, $note){
  $mon = (strlen($mon) == 2)? $mon : "0$mon";
  $day = (strlen($day) == 2)? $day : "0$day";
  $this->db->query("UPDATE t_notes SET notes = ? WHERE date = '$year-$mon-$day'", array($note));
 }
 
 function deleteNote($year, $mon, $day){
  $mon = (strlen($mon) == 2)? $mon : "0$mon";
  $day = (strlen($day) == 2)? $day : "0$day";
  $this->db->query("DELETE FROM t_notes WHERE date = '$year-$mon-$day'");
 }
 
 function getNote($year, $mon, $day){
  $mon   = (strlen($mon) == 2)? $mon : "0$mon";
  $day   = (strlen($day) == 2)? $day : "0$day";
  $query = $this->db->query("SELECT notes FROM t_notes WHERE date = '$year-$mon-$day'");
  if($query->num_rows() == 1){
   $query = $query->row_array();
   return $query['notes'];
  }else{
   return false;
  }
 }
}?>

and then, final step, it's about view. There're 3 files in view to display the calendar
  1. mynotes.php (to display the main page)
  2. add_note.php (to adding the event), and
  3. updel_note.php (to update or delete event)
Remember this calendar require  jquery and jquery colorbox.
for mynotes.php
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>My Calendar</title>
 <link rel="stylesheet" type="text/css" href="<?php echo base_url()?>css/style.css"/>
 <link rel="stylesheet" type="text/css" href="<?php echo base_url();?>css/colorbox.css"/>
 
 <script type="text/javascript" src="<?php echo base_url();?>js/jquery-1.7.2.min.js"></script>
 <script type="text/javascript" src="<?php echo base_url();?>js/jquery.colorbox-min.js"></script>
</head>
<body>
 <div align="center">
  <?php echo $notes?>
  <span> by Cemplux</span>
 </div>
 <script>
 $(function(){
  $(".act_note").colorbox({ 
    overlayClose: false,
    data:{year:<?php echo $year;?>,mon:<?php echo $mon;?>}
  });
 });
</script>
</body>
</html>

next view file,  add_note.php :
<div style="width:500px; height:130px; overflow:auto; color:#000000; margin-bottom:20px;" align="center">
 <h4>Tambah catatan untuk tanggal <?php echo "$day $month $year"?></h4>
 <?php echo form_open("mynotes/do_add/$year/$mon/$day");?>
 <table>
  <tr><td>Note</td><td>:</td><td><input type="text" name="note" maxlength="30" size="40" /></td></tr>
  <tr><td colspan="2"></td><td><input type="button" name="Batal" value="Batal" class="cancel">&nbsp;&nbsp;
          <input type="submit" name="OK" value="OK"></td></tr>
 </table>
 </form>
 <script> 
 $('.cancel').click(function(){
  var data = false;
  $.fn.colorbox.close(data);
 });
 </script>
</div>

and then the last view file,  updel_note.php :
<div style="width:500px; height:130px; overflow:auto; color:#000000; margin-bottom:20px;" align="center">
 <h4>Edit/hapus catatan untuk tanggal <?php echo "$day $month $year"?></h4>
 <?php echo form_open("mynotes/edit_note/$year/$mon/$day", ' class="submit"');?>
 <table>
  <tr><td>Note</td><td>:</td><td><input type="text" name="note" maxlength="30" size="40" value="<?php echo $note?>" /></td></tr>
  <tr><td colspan="2"></td><td><input type="button" name="Batal" value="Batal" class="cancel">&nbsp;&nbsp;
     <input type="submit" name="OK" value="OK">&nbsp;&nbsp;
     <a href="<?php echo site_url("mynotes/delete_note/$year/$mon/$day")?>" title="hapus note">
     <input type="button" name="hapus" value="Hapus" class="del"></a></td>
  </tr>
 </table>
 </form>
 <script> 
 $('.cancel').click(function(){
  var data = false; $.fn.colorbox.close(data);
 });
 
 $('.del').click(function(){
  if(confirm('hapus  catatan?')){ return true; }else{ return false;}
 })
 
 $('.submit').submit(function(){
  if(confirm('edit catatan?')){ return true; }else{ return false; }
 })
 </script>
</div>

This is it my sharing about event calendar with codeigniter.
Sorry about my english :D
You can download the source here.

Keyword : Codeigniter Event Calendar,  calendar

To appreciate the IPR (Intellectual Property Rights), reference sources that I use and I have learned will be displayed.
Referensi    : Codeigniter User Guide - Calendar Library, www.java2s.com/Code/HTMLCSS/CSS-Controls/Calendarwithtable.htm
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Kalender Catatan/Acara dengan Codeigniter

Event Calendar with Codeigniter

Pada kali ini saya akan berbagi tentang cara membuat kalender catatan atau kalender acara dengan menggunakan Codeigniter dan database MySQL.

Srceenshot nya :

Pertama-tama kita siapkan database-nya. Cukup simpel hanya butuh 1 tabel dan 2 atribut
CREATE TABLE t_notes (
  `date` DATE NOT NULL,
  notes VARCHAR(30) NOT NULL,
  PRIMARY KEY (`date`)
)

Selanjutnya kita buat controller-nya (mynotes.php), tp sebelumnya silahkan set konfigurasi codeigniter untuk database dan autoload untuk library (databse) dan helper (url, form).
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Mynotes extends CI_Controller {
 
 function __construct(){
  parent::__construct();
  $this->load->model('mynotes_model', 'mynotes');
  $this->load->library('calendar', $this->_setting());
 }
 
 function index(){
  redirect('mynotes/notes');
 }
 
 // untuk konversi nama bulan
 function _month($mon){
  $mon = (int) $mon;
  switch($mon){
   case 1 : $mon = 'Januari'; Break;
   case 2 : $mon = 'Februari'; Break;
   case 3 : $mon = 'Maret'; Break;
   case 4 : $mon = 'April'; Break;
   case 5 : $mon = 'Mei'; Break;
   case 6 : $mon = 'Juni'; Break;
   case 7 : $mon = 'Juli'; Break;
   case 8 : $mon = 'Agustus'; Break;
   case 9 : $mon = 'September'; Break;
   case 10 : $mon = 'Oktober'; Break;
   case 11 : $mon = 'November'; Break;
   case 12 : $mon = 'Desember'; Break;
  }
  return $mon;
 }
 
 // untuk menambahkan catatan pada tanggal
 function add_note($date){
  $data = array(
     'day'   => $date,
     'mon'   => $this->input->post('mon'),
     'month' => $this->_month($this->input->post('mon')),
     'year'  => $this->input->post('year'),
    );
  $this->load->view('add_note', $data);
 }
 
 // aksi insert catatan
 function do_add($year, $mon, $day){
  $this->mynotes->addNote($year, $mon, $day, $this->input->post('note', true));
  $this->notes($year, $mon);
 }
 
 // menampilkan opsi untuk menghapus atau edit catatan
 function updel_note($date){
  $data = array(
     'day'   => $date,
     'mon'   => $this->input->post('mon'),
     'month' => $this->_month($this->input->post('mon')),
     'year'  => $this->input->post('year'),
     'note'  => $this->mynotes->getNote($this->input->post('year'), $this->input->post('mon'), $date)
    );
  $this->load->view('updel_note', $data);
 }
 
 // aksi untuk edit catatan
 function edit_note($year, $mon, $day){
  $this->mynotes->editNote($year, $mon, $day, $this->input->post('note', true));
  $this->notes($year, $mon);
 }
 
 // aksi untuk hapus catatan
 function delete_note($year, $mon, $day){
  $this->mynotes->deleteNote($year, $mon, $day);
  $this->notes($year, $mon);
 }
 
 // fungsi utama untuk menampilkan kalender catatan
 function notes($year = null, $mon = null){
  $year = (empty($year) || !is_numeric($year))?  date('Y') :  $year;
  $mon  = (empty($mon) || !is_numeric($mon))?  date('m') :  $mon;
  
  $date = $this->mynotes->getCalendar($year, $mon);
  $data = array(
     'notes' => $this->calendar->generate($year, $mon, $date),
     'year'  => $year,
     'mon'   => $mon
    );
  $this->load->view('mynotes', $data);
 }
 
 // setting tampilan kalender
 function _setting(){
  return array(
   'start_day'   => 'sunday',
   'show_next_prev'  => true,
   'next_prev_url'  => site_url('mynotes/notes'),
   'month_type'     => 'long',
            'day_type'       => 'short',
   'template'    => '{table_open}<table class="date">{/table_open}
           {heading_row_start}&nbsp;{/heading_row_start}
           {heading_previous_cell}<caption><a href="{previous_url}" class="prev_date" title="Previous Month">&lt;&lt;</a>{/heading_previous_cell}
           {heading_title_cell}{heading}{/heading_title_cell}
           {heading_next_cell}<a href="{next_url}" class="next_date"  title="Next Month">&gt;&gt;</a></caption>{/heading_next_cell}
           {heading_row_end}<col class="weekend_sun"><col class="weekday" span="5"><col class="weekend_sat">{/heading_row_end}
           {week_row_start}<thead><tr>{/week_row_start}
           {week_day_cell}<th>{week_day}</th>{/week_day_cell}
           {week_row_end}</tr></thead><tbody>{/week_row_end}
           {cal_row_start}<tr>{/cal_row_start}
           {cal_cell_start}<td>{/cal_cell_start}
           {cal_cell_content}<a href="'.site_url('mynotes/updel_note').'/{day}" class="act_note" title="Edit/hapus catatan untuk tanggal {day}"><div class="active act_note" val="{day}" title="Edit/Hapus catatan untuk tanggal {day}">{day}</div></a><div class="notes">{content}</div></div>{/cal_cell_content}
           {cal_cell_content_today}<a href="'.site_url('mynotes/updel_note').'/{day}" class="act_note" title="Edit/hapus catatan untuk tanggal {day}"><div class="t_active" title="Edit/Hapus catatan untuk tanggal {day}">{day}</div></a><div class="t_notes">{content}</div>{/cal_cell_content_today}
           {cal_cell_no_content}<a href="'.site_url('mynotes/add_note').'/{day}" class="act_note" title="Tambah catatan untuk tanggal {day}"><div class="day" title="Tambah catatan untuk tanggal {day}">{day}</div></a>{/cal_cell_no_content}
           {cal_cell_no_content_today}<a href="'.site_url('mynotes/add_note').'/{day}" class="act_note" title="Tambah catatan untuk tanggal {day}"><div class="today" title="Tambah catatan untuk tanggal {day}">{day}</div></a>{/cal_cell_no_content_today}
           {cal_cell_blank}&nbsp;{/cal_cell_blank}
           {cal_cell_end}</td>{/cal_cell_end}
           {cal_row_end}</tr>{/cal_row_end}
           {table_close}</tbody></table>{/table_close}');
 }
}

Selanjutnya untuk model dengan nama mynotes_model.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Mynotes_model extends CI_Model {
 function getCalendar($year, $mon){
  $year  = ($mon < 9 && strlen($mon) == 1) ? "$year-0$mon" : "$year-$mon";
  $query = $this->db->select('date, notes')->from('t_notes')->like('date', $year, 'after')->get();
  if($query->num_rows() > 0){
   $data = array();
   foreach($query->result_array() as $row){
    $data[(int) end(explode('-',$row['date']))] = $row['notes'];
   }
   return $data;
  }else{
   return false;
  }
 }
 
 function addNote($year, $mon, $day, $note){
  $mon = (strlen($mon) == 2)? $mon : "0$mon";
  $day = (strlen($day) == 2)? $day : "0$day";
  $this->db->query("INSERT INTO t_notes(date, notes) VALUES ('$year-$mon-$day', ?)", array($note));
 }
 
 function editNote($year, $mon, $day, $note){
  $mon = (strlen($mon) == 2)? $mon : "0$mon";
  $day = (strlen($day) == 2)? $day : "0$day";
  $this->db->query("UPDATE t_notes SET notes = ? WHERE date = '$year-$mon-$day'", array($note));
 }
 
 function deleteNote($year, $mon, $day){
  $mon = (strlen($mon) == 2)? $mon : "0$mon";
  $day = (strlen($day) == 2)? $day : "0$day";
  $this->db->query("DELETE FROM t_notes WHERE date = '$year-$mon-$day'");
 }
 
 function getNote($year, $mon, $day){
  $mon   = (strlen($mon) == 2)? $mon : "0$mon";
  $day   = (strlen($day) == 2)? $day : "0$day";
  $query = $this->db->query("SELECT notes FROM t_notes WHERE date = '$year-$mon-$day'");
  if($query->num_rows() == 1){
   $query = $query->row_array();
   return $query['notes'];
  }else{
   return false;
  }
 }
}?>

Tahap terakhir adalah view, untuk view terdapat 3 file yaitu
  1. mynotes.php (untuk tampilan utama)
  2. add_note.php (untuk form tambah catatan), dan
  3. updel_note.php (untuk form edit atau hapus catatan)
Perlu diingat untuk tampilan form kalender mengunakan jquery dan jquery colorbox.
untuk mynotes.php
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>My Calendar</title>
 <link rel="stylesheet" type="text/css" href="<?php echo base_url()?>css/style.css"/>
 <link rel="stylesheet" type="text/css" href="<?php echo base_url();?>css/colorbox.css"/>
 
 <script type="text/javascript" src="<?php echo base_url();?>js/jquery-1.7.2.min.js"></script>
 <script type="text/javascript" src="<?php echo base_url();?>js/jquery.colorbox-min.js"></script>
</head>
<body>
 <div align="center">
  <?php echo $notes?>
  <span> by Cemplux</span>
 </div>
 <script>
 $(function(){
  $(".act_note").colorbox({ 
    overlayClose: false,
    data:{year:<?php echo $year;?>,mon:<?php echo $mon;?>}
  });
 });
</script>
</body>
</html>

selanjutnya untuk add_note.php :
<div style="width:500px; height:130px; overflow:auto; color:#000000; margin-bottom:20px;" align="center">
 <h4>Tambah catatan untuk tanggal <?php echo "$day $month $year"?></h4>
 <?php echo form_open("mynotes/do_add/$year/$mon/$day");?>
 <table>
  <tr><td>Note</td><td>:</td><td><input type="text" name="note" maxlength="30" size="40" /></td></tr>
  <tr><td colspan="2"></td><td><input type="button" name="Batal" value="Batal" class="cancel">&nbsp;&nbsp;
          <input type="submit" name="OK" value="OK"></td></tr>
 </table>
 </form>
 <script> 
 $('.cancel').click(function(){
  var data = false;
  $.fn.colorbox.close(data);
 });
 </script>
</div>

dan yang terakhir untuk updel_note.php :
<div style="width:500px; height:130px; overflow:auto; color:#000000; margin-bottom:20px;" align="center">
 <h4>Edit/hapus catatan untuk tanggal <?php echo "$day $month $year"?></h4>
 <?php echo form_open("mynotes/edit_note/$year/$mon/$day", ' class="submit"');?>
 <table>
  <tr><td>Note</td><td>:</td><td><input type="text" name="note" maxlength="30" size="40" value="<?php echo $note?>" /></td></tr>
  <tr><td colspan="2"></td><td><input type="button" name="Batal" value="Batal" class="cancel">&nbsp;&nbsp;
     <input type="submit" name="OK" value="OK">&nbsp;&nbsp;
     <a href="<?php echo site_url("mynotes/delete_note/$year/$mon/$day")?>" title="hapus note">
     <input type="button" name="hapus" value="Hapus" class="del"></a></td>
  </tr>
 </table>
 </form>
 <script> 
 $('.cancel').click(function(){
  var data = false; $.fn.colorbox.close(data);
 });
 
 $('.del').click(function(){
  if(confirm('hapus  catatan?')){ return true; }else{ return false;}
 })
 
 $('.submit').submit(function(){
  if(confirm('edit catatan?')){ return true; }else{ return false; }
 })
 </script>
</div>

Demikian sharing bagian inti dari kalender catatan. Untuk source-nya bisa di download disini.

Cukup sekian tips nya... :D

Alhamdulillah bisa berbagi tips lagi... :D 

Keyword : Codeigniter Event Calendar,  Kalender acara, Codeigniter

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi    : Codeigniter User Guide - Calendar Library, www.java2s.com/Code/HTMLCSS/CSS-Controls/Calendarwithtable.htm
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Senin, 03 Desember 2012

Codeigniter - SQL Server : Pagination

Codeigniter Paginasi (pagination) untuk SQL Server .

Pada kali ini saya mau sharing mengenai salah satu cara paginasi (Pagination) pada SQL Server. Salah satunya dengan menggunakan Common Table Expression (CTE) yang disediakan SQL Server.

Berbeda dengan query "Select TOP n  * FROM table"  yang hanya menampilkan data sebanyak n baris mulai dari baris pertama sampai baris n pada hasil query. CTE bisa dipakai mirip fungsi "limit" pada database MYSQL.

Langsung saja, untuk MODEL

function getAllData($no_page){
        $perpage = 20; // nilai $perpage disini sama dengan di $config['per_page']
        if($no_page == 1){
            $first = 1;
            $last  = $perpage; 
        }else{
            $first = ($no_page - 1) * $perpage + 1;
            $last  = $first + ($perpage -1);
        }
       
        return $this->db->query("WITH CTE AS (
                                        SELECT  a.*,
                                                ROW_NUMBER() OVER (ORDER BY a.id_tabel desc) as RowNumber
                                        FROM tabel_data a 
                                    )
                                SELECT * FROM CTE WHERE RowNumber BETWEEN $first AND $last")->result_array();   
    }



function data_pagination($url, $rows = 10, $uri = 3){
 $this->load->library('pagination');
  
 $config['per_page']   = 20;
 $config['base_url']   = site_url($url);
 $config['total_rows']   = $rows;
 $config['use_page_numbers'] = TRUE;
 $config['uri_segment']   = $uri;
 $config['num_links']   = 3;
 $config['next_link']   = 'Next';
 $config['prev_link']   = 'Previous';
 // untuk config class pagination yg lainnya optional (suka2 lu.. :D )

 $this->pagination->initialize($config);
 return $this->pagination->create_links();
}



function getTotalRowAllData(){
 $query = $this->db->query("SELECT count(*) as row FROM tabel_data")->row_array();
 return $query['row'];
}

Tips : jika hanya untuk mendapatkan informasi jumlah baris data, lebih baik gunakan
SELECT COUNT (*) FROM table
pada query, jangan menggunakan
SELECT * FROM table
terus pakai
$query->num_rows()
pada sintaks PHP. Hal ini cukup boros dalam pemrosesan data. Jadi sayangkan, kalau hanya ingin tau jumlah suatu data, harus diambil semua datanya dari database baru dihitung baris satu persatu pada proses PHP nya. XD

Selanjutnya untuk CONTROLLER nya

function show_alldata($no_page = 1){
     $data['page'] = $this->model->data_pagination("data/show_alldata", 
                                                    $this->model->getTotalRowAllData(), 3);
     $data['data'] = $this->model->getAllData($no_page);
     $data['no_page'] = $no_page;
     $this->load->view('template', $data);       
}

untuk VIEW nya bisa ditampilkan secara suka-suka lu, yang penting untuk menampilkan data-nya ada di variabel $data dan untuk menampilkan halaman paginasi bisa di variabel $page.
<div class="info">Menampilkan halaman <?php echo $no_page; ?> </div>
<table>
   <tr>
      <th>Data 1</th>
      <th>Data 2</th>
      <th>Data 3</th>
   </tr>
   <?php
      foreach($data as $row){
         echo '<tr><td>'.$row['data 1'].'</td><td>'.$row['data 1'].'</td><td>'.$row['data 1'].'</td></tr>';
      }
   ?>
</table>

<div class="pagination"><?php echo $page; ?></div>

Cukup sekian tips nya... :D

Alhamdulillah bisa berbagi tips lagi... :D 

Keyword : SQL Server pagination , SQL Server paginasi, Codeigniter SQL Server paginasi

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi    : msdn.microsoft.com,   sqlserverplanet.com   
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Kamis, 11 Oktober 2012

Codeigniter - Ajax : Simple Upload File menggunakan jQuery Form Plugin

Pada kali ini saya mau sharing mengenai salah satu cara upload file menggunakan Codeigniter dan jQuery. Untuk plugin jQuery bisa didapat disini atau mirror.

Pada tahap awal buat view terlebih dahulu

<div class="msg"></div> 
<form action="#" id="myForm" method="POST">
 <div id="body">
  <input type="file" name="userfile" id="userfile" class="WArarea" size="50px"/>
  <input type="submit" value="Upload" />
 </div>
</form>
<script type="text/javascript">
 $('#myForm').ajaxForm({
 url:'<?php echo site_url("contoh/upload_file");?>',
 type: 'post',
 dataType: 'json',
 resetForm: true,
 beforeSubmit: function() {
  $('.msg').html('Submitting...');
 },
 success: function(data) {
  if(data.status){
   $('.msg').html('<span style="color:blue">'+data.msg+'</span>')
  }else{
   $('.msg').html('<span style="color:red">'+data.msg+'</span>')
  }
 }
});
</script>

Kemudian untuk controllernya

function _conf_upload(){
 $config['upload_path'] = "./uploads/";
 $config['allowed_types'] = "doc|docx|pdf|xls|xlsx";
 $config['max_size'] = "2048";
 $this->load->library('upload');
 $this->upload->initialize($config);
}
function upload_file(){
 $this->_conf_upload();
 if ( ! $this->upload->do_upload()){  // cek apakah ada file yg diupload
  $status = array('status' => false, 'msg' => $this->upload->display_errors());
 }else{
  $file = $this->upload->data();
  // pura-puranya disini ada sebuah proses mengenai file yg d upload.
  $status = array('status' => true, 'msg' => 'Tugas berhasil di upload');
 }
 echo(json_encode($status));
}

Nah, cukup simpel kan untuk upload file menggunakan Ajax dengan plugin jQuery.

Cukup sekian tips nya... :D

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi    : http://jquery.malsup.com/form/
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Selasa, 25 September 2012

Codeigniter : Tips untuk menangani back button pada browser setelah logout

Disini ada sedikit tips yang saya dapat dari vidcence.blogspot.com tentang Masalah “back button” setelah logOut.

Pada permasalahan yang dihadapi adalah ketika kita sudah logout, pastinya status kita benar-benar logout. Akan tetapi apabila kita mengklik tombol kembali (back button) pada browser, seolah-olah kita masih dalam kondisi login. Hal ini tentunya dapat mengganggu ataupun membuat kita harus berfikir keras untuk mencegahnya (tentunya dari segi developer... XD ). Apalagi ketika saat menekan back button halaman yang ditampilkan browser adalah form input data, nah pastinya jd masalah kan... (sok iye..) 

Nah disini ada kode yang saya dapat dari web vidcence.blogspot.com, akan tetapi saya modif agar simple. Buat helper dengan nama sukasukalo_helper.php, isikan kode berikut
function backButtonHandle(){ // nama fungsinya juga bisa d ganti "suka-suka lo" XD (y)
  $CI =& get_instance();
  $CI->load->library(array('output'));
  $CI->output->set_header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
  $CI->output->set_header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
  $CI->output->set_header('Pragma: no-cache');
  $CI->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 }

Nah untuk memakainya cukup di load helper tersebut dan panggil fungsinya pada SETIAP fungsi konstruktor (__construct) di controller

function __construct(){
  parent::__construct(); 
  $this->load->helper('sukasukalo'); // helper yg di atas
  
  backButtonHandle(); // ni fungsinya yg d panggil
 }

Sekarang coba jalankan aplikasinya (login -> klik sembarang menu/link -> logout -> back button).
Alhamdulillah udah saya coba (di firefox n Chrome) dan berhasil (berhasil, berhasil, berhasil... hore  XD)

Cukup sekian tips nya, tumben nih lagi seneng ngetik... :D

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi     :http://vidcence.blogspot.com/2012/06/masalah-back-button-setelah-logout.html
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Kamis, 13 September 2012

Tips mempercepat loading web pada framework PHP - Codeigniter

Akhirnya aku berkesempatan lagi buat nulis.
Entah mengapa aku males klo buat nulis, aku sukanya nonton Anime... XD
#abaikan

Langsung saja, berikut ini ada beberapa tips yang dapat membantu mempercepat loading web pada framework Codeigniter.

1. Mengaktifkan kompresi HTML
Kompresi dilakukan untuk mengecilkan ukuran html, sehingga data yang dikirimkan oleh server ke client lebih kecil dan lebih cepat. Kompresi html dapat dilakukan dengan menggunakan kompresi gzip sudah disediakan oleh Codeigniter.
Setting untuk mengaktifkan kompresi gzip ada di config.php, ubah nilai $config['compress_output'] menjadi TRUE
$config['compress_output'] = TRUE; 

Catatan : dalam menggunakan kompresi gzip, hindari penggunaan sintaks echo dalam controller Codeigniter. Jika ingin menampilkan sesuatu dengan menggunakan echo, seperti menampilkan json
echo json_encode($json);
bisa diganti dengan
$this->output->set_output(json_encode($json));

2. Gunakan Cache
Gunakan method cache yang telah disediakan oleh Codeigniter untuk mempercepat pengaksesan suatu web. Cache menyimpan halaman web yang sebelumnya telah diakses, sehingga apabila halaman sebelumnya diakses kembali, sistem akan menampilkan halaman yang ada di cache.
code untuk cache yang ada d Codeigniter
$this->output->cache(n);
dimana n merupakan sebuat digit yang merepresentasikan berapa menit cache akan disimpan.
Letakkan code di atas pada tiap fungsi yang ada di controller. Lebih baiknya di fungsi yang menampilkan data yang statis (tidak berubah2 datanya ketika fungsi tersebut berulang kali diakses).
Catatan : cache yang digenerate oleh Codeigniter akan disimpan di folder cache sejajar dengan folder config, pastikan folder cache memiliki hak akses untuk read/write.

Cukup sekian tips nya, maklum lagi muales buat nulis kayak gini... :D

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

Rabu, 30 Mei 2012

Konfigurasi Codeigniter 2.1.0 dengan SQL Server 2008

Pada kali ini saya mau sharing mengenai konfigurasi Codeigniter (CI 2.1.0) untuk database SQL Server 2008. Sebagai info tambahan, saya menggunakan XAMPP 1.7.7 dengan OS Windows 7 64bit.
Langkah-langkahnya sebagai berikut :
  1. Download driver SQL Server untuk PHP, bisa di download disini.  Sebagai catatan cek versi PHP yang sedang dipakai, kemudian cocokkan dengan versi library PHP untuk SQL Server.
  2. Ekstrak file yang telah di download ke extensinya php (contoh klo di XAMPP ada di XAMPP/php/ext)
  3. Edit file php.ini nya, trus tambahkan code (untuk PHP 5.3) 
    extension=php_sqlsrv_53_ts_vc9.dll 
    extension=php_pdo_sqlsrv_53_ts_vc9.dll
    UNTUK PHP 5.3 bisa pake php_sqlsrv_53_ts_vc9, klo PHP 5.4 php_sqlsrv_54_ts_vc9   sesuai denan versi PHP nya
  4.  Selanjutnya setting database.php yang ada pada folder config Codeigniter
    $db['default']['hostname'] = 'ZAWA-PC'; 
    isi dengan nama pc atau IP komputer
    untuk koneksi database dari komputer lain dapat seperti 'tcp:MOUZA-PC,1433';
    MOUZA-PC dapat diganti dengan IP komputer lain yang terdapat database SQL Server
    1433 merupakan port default SQL Server
    $db['default']['username'] = 'sa';
    $db['default']['password'] = '123456';
    $db['default']['database'] = 'db_zawa';
    $db['default']['dbdriver'] = 'sqlsrv';
    $db['default']['dbprefix'] = '';
    

    $db['default']['pconnect'] = FALSE; 
    Default CI nya true, tp buat False karena di library sistem CI nya nilai return nya tidak ada  (bisa di perbaiki sendiri, cukup kasih code "return" di library sistemnya).
    $db['default']['db_debug'] = TRUE;
    $db['default']['cache_on'] = FALSE;
    $db['default']['cachedir'] = '';
    $db['default']['char_set'] = 'utf8';
    $db['default']['dbcollat'] = 'utf8_general_ci';
    $db['default']['swap_pre'] = '';
    $db['default']['autoinit'] = TRUE;
    $db['default']['stricton'] = FALSE;
    

Setelah selesai melakukan konfigurasi, cobalah untuk koneksi. Semoga berhasil.
Sekian dulu artikel yang saya buat. Semoga dapat berguna.. ^_^

Keyword : PHP CodeIgniter, Konfigurasi SQL Server 2008

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi     : http://codeigniter.com/,  msdn.microsoft.com
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Senin, 09 Januari 2012

CodeIgniter - Library MZA_SecureUrl to encrypt Url

After long time i didn't write an article, now i'll write an article about the codeigniter library to encrypt url.
I created this library with the name MZA_SecureUrl, library to secure the url that we make with the way in encryption. Url needs to be secured so that our web a little safer from the dangers of meddling hand that can infiltrate our website by reading Url. Therefore, one way to secure the url is to encrypt the url. 
The first thing that must be made is a library for encryption. Encryption is done only for the intended function names and its parameters (if there are parameters in the function).
Create a file with a name MZA_SecureUrl.php
class MZA_SecureUrl{
   private $valid_url, $parse, $length, $point1, $point2;
    
   function MZA_SecureUrl(){
      $this->obj =& get_instance();
      $this->valid_url = md5('mza secure url');  // you can change the string
      $this->parse  = 'mza secure url';  // you can change the string
      $this->length  = 5;  // you can change the value. Min : 1, Max : 32;
      $this->point1  = 5;  // you can change the value. Min : 1, Max : point1 + length : 32
      $this->point2  = 17;  // you can change the value. Min : 1, Max : point2 + length : 32
   }
 
   function _get_iv(){
      $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
      return mcrypt_create_iv($iv_size, MCRYPT_RAND);
   }
 
   function setSecureUrl_encode($class,$function, $param = array()){ // array $param only singel dimension of array, can't multiple
 dimensions. 
      $parameter = '';             // Send me an email if you have any suggestion. 
      $function = $this->_encodeUrl($function);
      if(!empty($param)){
  foreach($param as $value){
     $parameter .= $value.'/';
         }   
         $parameter = $this->_encodeUrl(substr($parameter,0,-1));
         return $class.'/secure/'.substr($this->valid_url,$this->point1,$this->length).$function.substr($this->valid_url,$this->point2,$this->length).$parameter;
      }else{
  return $class.'/secure/'.substr($this->valid_url,$this->point1,$this->length).$function;
      }
   }
 
   function _encodeUrl($url){
      return str_replace(array('+','/','='),array('-','_',' '),base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->parse), $url, MCRYPT_MODE_ECB, $this->_get_iv())));
   }
 
   function _decodeUrl($url){
      return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->parse), base64_decode($url), MCRYPT_MODE_ECB, $this->_get_iv());
   }
 
   function setSecureUrl_decode($url){
      $url = str_replace(array('-','_',' '),array('+','/','='),urldecode($url));
      if($this->_isValid_url($url)){
  $parameter = '';
  $data = explode(substr($this->valid_url,$this->point2,$this->length),substr($url,$this->length));
  $url = $this->_decodeUrl($data[0]);
  if(!empty($data[1])){
     $parameter = trim($this->_decodeUrl($data[1]));
     $parameter = explode('/', $parameter);  
     return array('function' => trim($url), 'params' => $parameter);
  }else{
     return array('function' => trim($url), 'params' => null);
  }
      }else{
  return false;
      }
   }
 
   function _isValid_url($url){
      if(strcmp(substr($url,0,$this->length),substr($this->valid_url,$this->point1,$this->length)) == 0){
         return true;
      }else{
  return false;
      }
   }
} 

after that, copy the following functionality to any existing controller file in your application
function secure($url){
   $data    = $this->mza_secureurl->setSecureUrl_decode($url);
   if($data != false){
      if (method_exists($this, trim($data['function']))){
         if(!empty($data['param'])){
            return call_user_func_array(array($this, trim($data['function'])), $data['param']);
         }else{
            return $this->$data['function']();
         }
      }
   }
   show_404();
}
yap ... library to encrypt the url is created. Now, to run its library, please set the configuration and add MZA_SecureUrl  to $autoload ['libraries']  on autoload.php file. To call its library can be used like this
$data['url'] = $this->mza_secureurl->setSecureUrl_encode($class,$function,$params);
example to call count controller, say function and the parameters
    $data['url1'] = $this->mza_secureurl->setSecureUrl_encode('count','say',array(1,'+',2,'=',3));
example to call front controller, front_site function that haven't parameters
    $data['url2'] = $this->mza_secureurl->setSecureUrl_encode('front','front_site');

Here I also give an example, you can download here or mirror.
So first article that I created. Hope can be useful .. ^ _ ^


Sorry about my english... (^_^)v

Keyword : PHP CodeIgniter, Secure Url

To appreciate the IPR (Intellectual Property Rights), the source of reference that I use and I learned will be displayed.
Referensi     :codeigniter.com
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Codeigniter - Library MZA_SecureUrl untuk mengenkripsi Url

Setelah sekian lama tidak buat artikel, kini saya akan buat artikel tentang library untuk enkripsi url.
Library ini saya buat dengan nama MZA_SecureUrl, yaitu library untuk mengamankan tentang url yang kita
buat dengan cara di enkripsi. Url perlu diamankan agar web kita sedikit lebih aman dari bahaya tangan usil yang dapat mengerjai web kita dengan membaca Url. Oleh karena itu, salah satu mengamankan url adalah dengan cara menenkripsi url tersebut.
Langsung saja....
hal pertama yang harus dibuat adalah library untuk men-enkripsi. Enkripsi dilakukan hanya untuk nama fungsi yang dituju
beserta parameternya (jika terdapat parameter dalam fungsi tersebut).
Buat file dengan nama MZA_SecureUrl.php yang isinya
class MZA_SecureUrl{
   private $valid_url, $parse, $length, $point1, $point2;
    
   function MZA_SecureUrl(){
      $this->obj =& get_instance();
      $this->valid_url = md5('mza secure url');  // you can change the string
      $this->parse  = 'mza secure url';  // you can change the string
      $this->length  = 5;  // you can change the value. Min : 1, Max : 32;
      $this->point1  = 5;  // you can change the value. Min : 1, Max : point1 + length : 32
      $this->point2  = 17;  // you can change the value. Min : 1, Max : point2 + length : 32
   }
 
   function _get_iv(){
      $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
      return mcrypt_create_iv($iv_size, MCRYPT_RAND);
   }
 
   function setSecureUrl_encode($class,$function, $param = array()){ // array $param only singel dimension of array, can't multiple
 dimensions. 
      $parameter = '';             // Send me an email if you have any suggestion. 
      $function = $this->_encodeUrl($function);
      if(!empty($param)){
  foreach($param as $value){
     $parameter .= $value.'/';
         }   
         $parameter = $this->_encodeUrl(substr($parameter,0,-1));
         return $class.'/secure/'.substr($this->valid_url,$this->point1,$this->length).$function.substr($this->valid_url,$this->point2,$this->length).$parameter;
      }else{
  return $class.'/secure/'.substr($this->valid_url,$this->point1,$this->length).$function;
      }
   }
 
   function _encodeUrl($url){
      return str_replace(array('+','/','='),array('-','_',' '),base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->parse), $url, MCRYPT_MODE_ECB, $this->_get_iv())));
   }
 
   function _decodeUrl($url){
      return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($this->parse), base64_decode($url), MCRYPT_MODE_ECB, $this->_get_iv());
   }
 
   function setSecureUrl_decode($url){
      $url = str_replace(array('-','_',' '),array('+','/','='),urldecode($url));
      if($this->_isValid_url($url)){
  $parameter = '';
  $data = explode(substr($this->valid_url,$this->point2,$this->length),substr($url,$this->length));
  $url = $this->_decodeUrl($data[0]);
  if(!empty($data[1])){
     $parameter = trim($this->_decodeUrl($data[1]));
     $parameter = explode('/', $parameter);  
     return array('function' => trim($url), 'params' => $parameter);
  }else{
     return array('function' => trim($url), 'params' => null);
  }
      }else{
  return false;
      }
   }
 
   function _isValid_url($url){
      if(strcmp(substr($url,0,$this->length),substr($this->valid_url,$this->point1,$this->length)) == 0){
         return true;
      }else{
  return false;
      }
   }
} 

setelah itu, copy-kan fungsi di bawah ini ke setiap file controller yang ada.
function secure($url){
   $data    = $this->mza_secureurl->setSecureUrl_decode($url);
   if($data != false){
      if (method_exists($this, trim($data['function']))){
         if(!empty($data['param'])){
            return call_user_func_array(array($this, trim($data['function'])), $data['param']);
         }else{
            return $this->$data['function']();
         }
      }
   }
   show_404();
}
yap... library untuk menenkripsi url sudah dibuat. Sekarang, untuk menjalankan library-nya, silakan set konfigurasi autoload.php dan tambahkan MZA_SecureUrl pada $autoload['libraries'] nya. Untuk memanggil library nya dapat menggunakan seperti ini
$data['url'] = $this->mza_secureurl->setSecureUrl_encode($class,$function,$params);
contoh untuk memanggil controller count, fungsi say dan parameternya
    $data['url1'] = $this->mza_secureurl->setSecureUrl_encode('count','say',array(1,'+',2,'=',3));
contoh untuk memanggil controller front, fungsi front_site yang tidak memiliki parameter
    $data['url2'] = $this->mza_secureurl->setSecureUrl_encode('front','front_site');

Disini saya juga memberikan contohnya, silakan download disini atau mirror
Sekian dulu artikel yang saya buat. Semoga dapat berguna.. ^_^

Keyword : PHP CodeIgniter, Secure Url

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