Selasa, 10 Januari 2017

Implementation Data Encryption Standard (DES) in PHP

I made simple implementation Data Encryption Standard in PHP.
I made the code of this program for graduate school assignment on ITS.
you can check in MY GITHUB for the code.

Keywords : PHP DES, Data Encryption Standard in PHP

To appreciate the IPR (Intellectual Property Rights), reference sources that I use and I have learned will be displayed.
Reference   : https://github.com/sapelord/DES
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Jumat, 29 Juli 2016

Contoh Sederhana - Surat Keterangan Penghasilan Orang Tua

Saya membuat contoh surat keterangan jumlah kepemilikan rumah ini secara mendadak untuk adik saya yang akan daftar ulang di Unair. hehe

Semoga lolos verifikasi dokumennya...

Download: Link Contoh Surat Keterangan Penghasilan Orang Tua

Contoh Sederhana - Surat Keterangan Jumlah Kepemilikan Kendaraan Bermotor (Roda 2)

Saya membuat contoh surat keterangan jumlah kepemilikan rumah ini secara mendadak untuk adik saya yang akan daftar ulang di Unair. hehe

Semoga lolos verifikasi dokumennya...

Download: Link Contoh Surat Keterangan Jumlah Kepemilikan Kendaraan Bermotor

 


Contoh Sederhana - Surat Keterangan Jumlah Kepemilikan Rumah

Saya membuat contoh surat keterangan jumlah kepemilikan rumah ini secara mendadak untuk adik saya yang akan daftar ulang di Unair. hehe

Semoga lolos verifikasi dokumennya...

Download: Link Contoh Surat Keterangan Jumlah Kepemilikan Rumah

Kamis, 25 Februari 2016

Fungsi Terbilang Sederhana dengan PHP Class NumberFormatter

Mungkin sudah banyak contoh kode PHP untuk mengonversi angka ke dalam teks bilangan (terbilang) saat ini. Tapi kali ini saya coba membagikan salah satu kode terbilang dengan memanfaatkan class bawaan php yaitu class NumberFormatter.
Jadi hal ini bisa lebih simpel dalam penulisan kode PHP.

function terbilang($angka) {
    $terbF  = new NumberFormatter('id-ID', NumberFormatter::SPELLOUT);
    // 'id-ID' format penulisan bahasa id : Indonesia
    return $terbF->format($angka);
}

$angka = 1255555;
$huruf = terbilang($angka); 

echo $huruf;
// hasilnya : satu juta dua ratus lima puluh lima ribu lima ratus lima puluh lima

Begitu simpelkan?
Perlu DIPERHATIKAN, sebelum menggunakan class NumberFormatter
  • Class NumberFormatter ada pada PHP versi 5.3 ke atas
  •  Silahkan edit file php.ini
cari kata kunci seperti ini 
;extension=php_intl.dll 

hilangkan tanda ; menjadi
extension=php_intl.dll
  • Simpan, kemudian restart web server.
Selamat mencoba. :)

Keyword : PHP Fungsi Terbilang,Terbilang

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

Rabu, 14 Januari 2015

Konfigurasi Codeigniter 2.x.x dengan SQL Server 2008/2012 (Update)

Sudah lama sekali saya tidak menulis artikel diblog ini, mungkin ini yang dinamakan sindrom males ngetik ( XD ).
Dalam artikel saya yang sebelumnya mengenai Konfigurasi Codeigniter 2.1.0 dengan SQL Server 2008 masih banyak pembaca yang bingung dan bertanya-tanya
"kenapa kok masih g konek ya padahal sudah bener semua settingan koneksi database ke SQL Servernya"
Nah jangankan pembaca yang budiman (bukan ibu Diman.... :D pis.. ), penulis yang bukan suaminya bu Diman pun juga heran, kok bisa tidak konek ke database SQL Server ya (pengalaman pas habis install ulang OS).
Nah untuk itu saya sebagai penulis (tentunya bukan suaminya bu Diman) membuat ulang langkah konfigurasi CI 2.x.x untuk bisa terkoneksi dengan SQL Server 2008/2012.

Sebagai info tambahan, saya menggunakan XAMPP 1.8.2 dengan PHP 5.4 dengan OS Windows 8 64bit.
Langkah-langkahnya sebagai berikut :
  1. Install SQL Server 2008 / 2012. Jangan lupa  install juga SQL Server Native Client, karena disinilah letak permasalahannya. Kadang kita meng-instal SQL Server, tapi tidak meng-install SQL Server Native Client nya sehingga aplikasi PHP kita tidak bisa terkoneksi dengan SQL Server. SQL Server Native Client bisa di download di microsoft.com, atau kalau bingung sudah saya siapkan dan dapat di download disini
  2. 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. Saya menggunakan Microsoft SQL Server Drivers versi 3.0
  3. Ekstrak file yang telah di download ke extensinya php (contoh klo di XAMPP ada di XAMPP/php/ext)
  4. Edit file php.ini nya, trus tambahkan code (untuk PHP 5.4) 
    
    
    extension=php_sqlsrv_54_ts.dll
    extension=php_pdo_sqlsrv_54_ts.dll
  5. Restart Apache pada XAMPP
  6. Selanjutnya setting database.php yang ada pada folder config Codeigniter
    $db['default']['hostname'] = 'ZAWA-PC'; // Nama PC dimana SQL Server diinstal
    atau
    $db['default']['hostname'] = 'localhost';
    $db['default']['username'] = 'sa';
    $db['default']['password'] = '123456';
    $db['default']['database'] = 'db_zawa';
    $db['default']['dbdriver'] = 'sqlsrv';
    $db['default']['dbprefix'] = '';
    $db['default']['pconnect'] = FALSE;
    $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;
    
  7. Apabila SQL Server di install di komputer lain yang masih dalam satu jaringan LAN, dan komputer kita HANYA ingin mengakses SQL Server dari komputer itu. Ubah konfigurasi untuk hostname-nya menjadi
    $db['default']['hostname'] = 'tcp:XXXX,YYYY'; 
    Dimana XXXX adalah nama PC yang diinstal SQL Server dan YYYY adalah Port yang digunakan SQL Server
    $db['default']['hostname'] = 'tcp:HYURA-PC,1433'; // 1433 Port default SQL Server
    atau
    $db['default']['hostname'] = 'tcp:192.168.0.212,1433'; // 1433 Port default SQL Server
    
Setelah selesai melakukan konfigurasi, jalankan aplikasi CI nya. Semoga berhasil dan semoga membantu.
Ada udang dibalik batu, udah duluuu...... ^_^

NB : Kalau menggunakan langkah ke 7 yang hanya mengakses SQL Server yang ada dikomputer komputer lain, JANGAN LUPA LAGI, tetap install SQL Server Native Client nya. Selain itu bisa jadi perlu diinstall juga Visual C++ Redistributable sesuai dengan arsitektur dari program PHP. Download VC11

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

Jumat, 14 Februari 2014

Tips Mempercepat Loading Website

Setelah lama membisu dalam sharing kali ini saya akan sharing pengalaman saya yang baru kemarin saya uprek2 kembali, yakni tentang Tips Mempercepat Loading Website yang dibangun.

Ada banyak tools yang digunakan untuk mengetahui kecepatan loading website kita, tapi pada kali ini saya memakai 3 tools yaitu :
  1. PageSpeed Insights dari Google
  2. gtmetrix.com
  3. gidnetwork.com  atau feedthebot.com

contoh web yang akan dianalisa oleh kedua aplikasi di atas
Gambar Analisa dari Google PageSpeed


Gambar Analisa dari GTMetrix


Gambar Analisa dari Gidnetwork.com


Langkah - langkah yang dilakukan untuk dapat mempercepat loading website (berdasarkan pengalaman saya pribadi pada web server Apache XAMPP) :

Bermain dengan file .htaccess 

Maksud dari bermain dengan file .htaccess adalah melakukan konfigurasi di file htacces untuk dapat mengoptimalkan performa website. 

1. Menggunakan Kompresi Gzip, Deflate

Kompresi gzip dilakukan untuk mengompres data dari server sebelum dikirim ke client sehingga ukuran file menjadi lebih kecil dari ukuran asli file dari server. Hal ini dapat mempercepat pengiriman data. Berikut kodenya untuk .htacces di apache xampp
<ifModule mod_gzip.c>
 mod_gzip_on Yes
 mod_gzip_dechunk Yes
 mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
 mod_gzip_item_include handler ^cgi-script$
 mod_gzip_item_include mime ^text/.*
 mod_gzip_item_include mime ^application/x-javascript.*
 mod_gzip_item_exclude mime ^image/.*
 mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
<IfModule mod_deflate.c>
 #The following line is enough for .js and .css
 SetOutputFilter DEFLATE
 AddOutputFilter DEFLATE js css
 AddOutputFilterByType DEFLATE text/plain 
 AddOutputFilterByType DEFLATE text/xml 
 AddOutputFilterByType DEFLATE text/html
 AddOutputFilterByType DEFLATE text/css 
 AddOutputFilterByType DEFLATE application/atom_xml 
 AddOutputFilterByType DEFLATE application/rss+xml 
 AddOutputFilterByType DEFLATE application/xhtml+xml 
 AddOutputFilterByType DEFLATE application/xml 
 AddOutputFilterByType DEFLATE application/x-javascript 
 AddOutputFilterByType DEFLATE application/x-httpd-php 
 AddOutputFilterByType DEFLATE application/x-httpd-fastphp 

 AddType x-font/otf .otf
 AddType x-font/ttf .ttf
 AddType x-font/eot .eot
 AddType x-font/woff .woff
 AddType image/x-icon .ico
 AddType image/png .png
 AddType text/css .css

 #The following lines are to avoid bugs with some browsers
 BrowserMatch ^Mozilla/4 gzip-only-text/html
 BrowserMatch ^Mozilla/4\.0[678] no-gzip
 BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
 BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
 Header append Vary User-Agent env=!dont-vary
</ifModule>

2. Memanfaatkan cache

Selain melakukan kompresi, lakukan pula pemanfaatan cache pada website anda, contoh kode htaccess untuk memanfaatkan cache
<IfModule mod_expires.c>
 ExpiresActive On
 ExpiresDefault "access plus 1 month"
 ExpiresByType image/jpg "access plus 1 year"
 ExpiresByType image/jpeg "access plus 1 year"
 ExpiresByType image/gif "access plus 1 year"
 ExpiresByType image/png "access plus 1 year"
 ExpiresByType text/html "access plus 1 month"
 ExpiresByType text/css "access plus 1 month"
 ExpiresByType application/pdf "access plus 1 month"
 ExpiresByType application/x-shockwave-flash "access plus 1 month"
 ExpiresByType application/x-javascript "access plus 14 days"
 ExpiresByType image/x-icon "access plus 1 year"
</ifModule>

<ifModule mod_headers.c>
 <filesMatch "\\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|svg)$">
  Header set Cache-Control "max-age=2592000, public"
 </filesMatch>
 <filesMatch "\\.(css)$">
  Header set Cache-Control "max-age=604800, public"
 </filesMatch>
 <filesMatch "\\.(js)$">
  Header set Cache-Control "max-age=216000, private"
 </filesMatch>
 <filesMatch "\\.(xml|txt)$">
  Header set Cache-Control "max-age=216000, public, must-revalidate"
 </filesMatch>
 <filesMatch "\\.(html|htm|php)$">
  Header set Cache-Control "max-age=1, private, must-revalidate"
 </filesMatch>
 Header unset ETag
</ifModule>
FileETag None

3. Aktifkan modul Deflate  pada Apache XAMPP

Langkah terakhir adalah mengaktifkan modul deflate dengan membuka direktori konfigurasi Apache. Contoh pada XAMPP di OS Windows
      C:\\xampp\apache\conf\httpd.conf
cari baris yang dengan kode seperti dibawah ini
      #LoadModule deflate_module modules/mod_deflate.so
      #LoadModule expires_module modules/mod_expires.so
      #LoadModule headers_module modules/mod_headers.so
lalu hapus tanda '#' untuk mengaktifkan modul deflat. Simpan dan restart Apache-nya


Setelah setelah konfigurasi di atas telah dilakukan, analisa kembali website kita menggunakan 3 tools di atas. Maka hasilnya bisa dilihat
Gambar Hasil Analisa Google PageSpeed
Gambar Hasil Analisa GTMetrix
Gambar Hasil Analisa GIDNetwork



Tambahan 
Apabila merasa kurang cukup dengan yang di atas tentang mempercepat loading website kita. Bisa juga melakukan trik kompresi file gambar, css, dan javascript secara manual menggunakan tools seperti :
  1. jscompress.com untuk mengompres/minify file javascript
  2. cssminifier.com untuk mengompres file css
  3. imageoptimizer.net untuk mengompres file gambar

Demikian sharing kali ini, semoga bermanfaat ^_^
Akhirnya... bisa sharing lagi.... :D

Keyword : mempercepat loading website,  loading website.

Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi    : http://stackoverflow.com/questions/6724549, http://stackoverflow.com/questions/12367858, http://httpd.apache.org/docs/2.2/
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Minggu, 02 Juni 2013

Multiple Event Calendar with Codeigniter

Well, after long time didn't post about sharing. Now i'm sharing about multiple event calendar with Codeigniter framework that named "Evencal" (sorry for other code that have same name.. ^_^ ).


This is an update from my event calendar. Evencal using :
  1. Codeigniter 2.1.3 update Codeigniter 3
  2. jQuery 1.7.2
  3. jQuery Colorbox
  4. CSS Notification Boxes

This is screenshoot :

At first, create code SQL for database Evencal. This application using MYSQL Database :
CREATE TABLE IF NOT EXISTS `events` (
  `event_date` date NOT NULL,
  `total_events` int(50) NOT NULL DEFAULT '0',
  PRIMARY KEY (`event_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `event_detail` (
  `idevent` int(11) NOT NULL AUTO_INCREMENT,
  `event_date` date NOT NULL,
  `event_time` time NOT NULL,
  `event` varchar(200) NOT NULL,
  PRIMARY KEY (`idevent`),
  KEY `event_date` (`event_date`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

ALTER TABLE `event_detail`
  ADD CONSTRAINT `event_detail_ibfk_1` FOREIGN KEY (`event_date`) REFERENCES `events` (`event_date`);

and then create controller evencal.php
class Evencal extends CI_Controller {
 function __construct(){
  parent::__construct();
  $this->load->model('evencal_model', 'evencal');
  $this->load->library('calendar', $this->_setting());
 }
 
 function index($year = null, $month = null, $day = null){
  $year  = (empty($year) || !is_numeric($year))?  date('Y') :  $year;
  $month = (is_numeric($month) &&  $month > 0 && $month < 13)? $month : date('m');
  $day   = (is_numeric($day) &&  $day > 0 && $day < 31)?  $day : date('d');
  
  $date      = $this->evencal->getDateEvent($year, $month);
  $cur_event = $this->evencal->getEvent($year, $month, $day);
  $data      = array(
      'notes' => $this->calendar->generate($year, $month, $date),
      'year'  => $year, 
      'mon'   => $month,
      'month' => $this->_month($month),
      'day'   => $day,
      'events'=> $cur_event
     );
  $this->load->view('index', $data);
 }
 
 // for convert (int) month to (string) month in Indonesian
 function _month($month){
  $month = (int) $month;
  switch($month){
   case 1 : $month = 'Januari'; Break;
   case 2 : $month = 'Februari'; Break;
   case 3 : $month = 'Maret'; Break;
   case 4 : $month = 'April'; Break;
   case 5 : $month = 'Mei'; Break;
   case 6 : $month = 'Juni'; Break;
   case 7 : $month = 'Juli'; Break;
   case 8 : $month = 'Agustus'; Break;
   case 9 : $month = 'September'; Break;
   case 10 : $month = 'Oktober'; Break;
   case 11 : $month = 'November'; Break;
   case 12 : $month = 'Desember'; Break;
  }
  return $month;
 }
 
 // get detail event for selected date
 function detail_event(){  
  $this->form_validation->set_rules('year', 'Year', 'trim|required|is_natural_no_zero|xss_clean');
  $this->form_validation->set_rules('mon', 'Month', 'trim|required|is_natural_no_zero|less_than[13]|xss_clean');
  $this->form_validation->set_rules('day', 'Day', 'trim|required|is_natural_no_zero|less_than[32]|xss_clean');
  
  if ($this->form_validation->run() == FALSE){
   echo json_encode(array('status' => false, 'title_msg' => 'Error', 'msg' => 'Please insert valid value'));
  }else{
   $data = $this->evencal->getEvent($this->input->post('year'), $this->input->post('mon'), $this->input->post('day'));
   if($data == null){
    echo json_encode(array('status' => false, 'title_msg' => 'No Event', 'msg' => 'There\'s no event in this date'));
   }else{   
    echo json_encode(array('status' => true, 'data' => $data));
   }
  }
 }
 
 // popup for adding event
 function add_event(){
  $data = array(
     'day'   => $this->input->post('day'),
     'mon'   => $this->input->post('mon'),
     'month' => $this->_month($this->input->post('mon')),
     'year'  => $this->input->post('year'),
    );
  $this->load->view('add_event', $data);
 }
 
 // do adding event for selected date
 function do_add(){
  $this->form_validation->set_rules('year', 'Year', 'trim|required|is_natural_no_zero|xss_clean');
  $this->form_validation->set_rules('mon', 'Month', 'trim|required|is_natural_no_zero|less_than[13]|xss_clean');
  $this->form_validation->set_rules('day', 'Day', 'trim|required|is_natural_no_zero|less_than[32]|xss_clean');
  $this->form_validation->set_rules('hour', 'Hour', 'trim|required|xss_clean');
  $this->form_validation->set_rules('minute', 'Minute', 'trim|required|xss_clean');
  $this->form_validation->set_rules('event', 'Event', 'trim|required|xss_clean');
  
  if ($this->form_validation->run() == FALSE){
   echo json_encode(array('status' => false, 'title_msg' => 'Error', 'msg' => 'Please insert valid value'));
  }else{
   $this->evencal->addEvent($this->input->post('year'), 
            $this->input->post('mon'), 
            $this->input->post('day'), 
            $this->input->post('hour').":".$this->input->post('minute').":00",
            $this->input->post('event'));
   echo json_encode(array('status' => true, 'time' => $this->input->post('time'), 'event' => $this->input->post('event')));
  }
 }
 
 // delete event
 function delete_event(){
  $this->form_validation->set_rules('year', 'Year', 'trim|required|is_natural_no_zero|xss_clean');
  $this->form_validation->set_rules('mon', 'Month', 'trim|required|is_natural_no_zero|less_than[13]|xss_clean');
  $this->form_validation->set_rules('day', 'Day', 'trim|required|is_natural_no_zero|less_than[32]|xss_clean');
  $this->form_validation->set_rules('del', 'ID', 'trim|required|is_natural_no_zero|xss_clean');
  
  if ($this->form_validation->run() == FALSE){
   echo json_encode(array('status' => false));
  }else{
   $rows = $this->evencal->deleteEvent($this->input->post('year'),$this->input->post('mon'),$this->input->post('day'), $this->input->post('del'));
   if($rows > 0){
    echo json_encode(array('status' => true, 'row' => $rows));
   }else{
    echo json_encode(array('status' => true, 'row' => $rows, 'title_msg' => 'No Event', 'msg' => 'There\'s no event in this date'));
   }
  }
 }
 
 // same as index() function
 function detail($year = null, $month = null, $day = null){
  $year  = (empty($year) || !is_numeric($year))?  date('Y') :  $year;
  $month = (is_numeric($month) &&  $month > 0 && $month < 13)? $month : date('m');
  $day   = (is_numeric($day) &&  $day > 0 && $day < 31)?  $day : date('d');
  
  $date      = $this->evencal->getDateEvent($year, $month);
  $cur_event = $this->evencal->getEvent($year, $month, $day);
  $data     = array(
      'notes' => $this->calendar->generate($year, $month, $date),
      'year'  => $year,
      'mon'   => $month,
      'month' => $this->_month($month),
      'day'   => $day,
      'events'=> $cur_event
     );
  $this->load->view('index', $data);
 }
 
 // setting for calendar
 function _setting(){
  return array(
   'start_day'   => 'monday',
   'show_next_prev'  => true,
   'next_prev_url'  => site_url('evencal/index'),
   '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;Prev</a>{/heading_previous_cell}
           {heading_title_cell}{heading}{/heading_title_cell}
           {heading_next_cell}<a href="{next_url}" class="next_date"  title="Next Month">Next&gt;&gt;</a></caption>{/heading_next_cell}
           {heading_row_end}<col class="weekday" span="5"><col class="weekend_sat"><col class="weekend_sun">{/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}<div class="date_event detail" val="{day}"><span class="date">{day}</span><span class="event d{day}">{content}</span></div>{/cal_cell_content}
           {cal_cell_content_today}<div class="active_date_event detail" val="{day}"><span class="date">{day}</span><span class="event d{day}">{content}</span></div>{/cal_cell_content_today}
           {cal_cell_no_content}<div class="no_event detail" val="{day}"><span class="date">{day}</span><span class="event d{day}">&nbsp;</span></div>{/cal_cell_no_content}
           {cal_cell_no_content_today}<div class="active_no_event detail" val="{day}"><span class="date">{day}</span><span class="event d{day}">&nbsp;</span></div>{/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}');
 }
}

and then for the model evencal_model.php
class Evencal_model extends CI_Model {
 
 // for get all event date in one month
 function getDateEvent($year, $month){
  $year  = ($month < 10 && strlen($month) == 1) ? "$year-0$month" : "$year-$month";
  $query = $this->db->select('event_date, total_events')->from('events')->like('event_date', $year, 'after')->get();
  if($query->num_rows() > 0){
   $data = array();
   foreach($query->result_array() as $row){
    $data[(int) end(explode('-',$row['event_date']))] = $row['total_events'];
   }
   return $data;
  }else{
   return false;
  }
 }
 
 // get event detail for selected date
 function getEvent($year, $month, $day){
  $day   = ($day < 10 && strlen($day) == 1)? "0$day" : $day;
  $year  = ($month < 10 && strlen($month) == 1) ? "$year-0$month-$day" : "$year-$month-$day";
  $query = $this->db->select('idevent as id, event_time as time, event')->order_by('event_time')->get_where('event_detail', array('event_date' => $year));
  if($query->num_rows() > 0){
   return $query->result_array();
  }else{
   return null;
  }
 }
 
 // insert event
 function addEvent($year, $month, $day, $time, $event){ 
  $check = $this->db->get_where('events', array('event_date' => "$year-$month-$day"));
  if($check->num_rows() > 0){
   $this->db->query("UPDATE events SET total_events = total_events + 1 WHERE event_date = ?", array("$year-$month-$day"));
   $this->db->insert('event_detail', array('event_date' => "$year-$month-$day", 'event_time' => $time, 'event' => $event));
  }else{
   $this->db->insert('events', array('event_date' => "$year-$month-$day", 'total_events' => 1));
      $this->db->insert('event_detail', array('event_date' => "$year-$month-$day", 'event_time' => $time, 'event' => $event));
  }
  
 }
 
 // delete event
 function deleteEvent($year, $month, $day, $id){
  $this->db->delete("event_detail", array('idevent' => $id, 'event_date' => "$year-$month-$day"));
  $check = $this->db->query('SELECT count(*) as total FROM event_detail WHERE event_date = ?', array("$year-$month-$day"))->row();
  if($check->total > 0){
   $this->db->update('events', array('total_events' => $check->total), array('event_date' => "$year-$month-$day"));
  }else{
   $this->db->delete("events", array('event_date' => "$year-$month-$day"));
  }
  return $check->total;
 }
}

and for the view, just have 2 views in this application
first view, index.php
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>My Event Calendar (Evencal)</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 id="evencal">
  <div class="calendar">
   <?php echo $notes?>
   <span>by <a href="http://zawaruddin.blogspot.com"><strong>zawaruddin.blogspot.com</strong></a></span>
  </div>
  <div class="event_detail">
   <h2 class="s_date">Detail Event <?php echo "$day $month $year";?></h2>
   <div class="detail_event">
    <?php 
     if(isset($events)){
      $i = 1;
      foreach($events as $e){
       if($i % 2 == 0){
        echo '<div class="info1"><h4>'.$e['time'].'<img src="'.base_url().'css/images/delete.png" class="delete" alt="" title="delete this event" day="'.$day.'" val="'.$e['id'].'" /></h4><p>'.$e['event'].'</p></div>';
       }else{
        echo '<div class="info2"><h4>'.$e['time'].'<img src="'.base_url().'css/images/delete.png" class="delete" alt="" title="delete this event" day="'.$day.'" val="'.$e['id'].'" /></h4><p>'.$e['event'].'</p></div>';
       } 
       $i++;
      }
     }else{
      echo '<div class="message"><h4>No Event</h4><p>There\'s no event in this date</p></div>';
     }
    ?>
    <input type="button" name="add" value="Add Event" val="<?php echo $day;?>" class="add_event"/>
   </div>
  </div>
 </div>
 <script>
  $(".detail").live('click',function(){
   $(".s_date").html("Detail Event for "+$(this).attr('val')+" <?php echo "$month $year";?>");
   var day = $(this).attr('val');
   var add = '<input type="button" name="add" value="Add Event" val="'+day+'" class="add_event"/>';
   $.ajax({
    type: 'post',
    dataType: 'json',
    url: "<?php echo site_url("evencal/detail_event");?>",
    data:{<?php echo "year: $year, mon: $mon";?>, day: day},
    success: function( data ) {
     var html = '';
     if(data.status){
      var i = 1;
      $.each(data.data, function(index, value) {
          if(i % 2 == 0){
        html = html+'<div class="info1"><h4>'+value.time+'<img src="<?php echo base_url();?>css/images/delete.png" class="delete" alt="" title="delete this event" day="'+day+'" val="'+value.id+'" /></h4><p>'+value.event+'</p></div>';
       }else{
        html = html+'<div class="info2"><h4>'+value.time+'<img src="<?php echo base_url();?>css/images/delete.png" class="delete" alt="" title="delete this event" day="'+day+'" val="'+value.id+'" /></h4><p>'+value.event+'</p></div>';
       } 
       i++;
      });
     }else{
      html = '<div class="message"><h4>'+data.title_msg+'</h4><p>'+data.msg+'</p></div>';
     }
     html = html+add;
     $( ".detail_event" ).fadeOut("slow").fadeIn("slow").html(html);
    } 
   });
  });
  $(".delete").live("click", function() {
   if(confirm('Are you sure delete this event ?')){
    var deleted = $(this).parent().parent();
    var day =  $(this).attr('day');
    var add = '<input type="button" name="add" value="Add Event" val="'+day+'" class="add_event"/>';
    $.ajax({
     type: 'POST',
     dataType: 'json',
     url: "<?php echo site_url("evencal/delete_event");?>",
     data:{<?php echo "year: $year, mon: $mon";?>, day: day,del: $(this).attr('val')},
     success: function(data) {
      if(data.status){
       if(data.row > 0){
        $('.d'+day).html(data.row);
       }else{
        $('.d'+day).html('');
        $( ".detail_event" ).fadeOut("slow").fadeIn("slow").html('<div class="message"><h4>'+data.title_msg+'</h4><p>'+data.msg+'</p></div>'+add);
       }
       deleted.remove();
      }else{
       alert('an error for deleting event');
      }
     }
    });
   }
  });
  $(".add_event").live('click', function(){
   $.colorbox({ 
     overlayClose: false,
     href: '<?php echo site_url('evencal/add_event');?>',
     data:{year:<?php echo $year;?>,mon:<?php echo $mon;?>, day: $(this).attr('val')}
   });
  });
</script>
</body>
</html>

and second view for add event form, add_event.php
<?php 
 $h = '<select name="hour" id="hour">';
 $m = '<select name="minute" id="minute">';
 for($i = 0; $i< 60; $i++){
  if($i < 24){
   $h .= '<option value="'.(($i > 9)? $i : "0$i").'">'.(($i > 9)? $i : "0$i").'</option>';
  }
  $m .= '<option value="'.(($i > 9)? $i : "0$i").'">'.(($i > 9)? $i : "0$i").'</option>';
 }
 $h .= '</select>';
 $m .= '</select>';
?>
<div style="width:500px; height:135px; overflow:auto; color:#000000; margin-bottom:20px;" align="center">
 <h4>Adding event for <?php echo "$day $month $year"?></h4>
 <div class="spacer"></div>
 <table>
  <tr><td>Time <span class="require">*</span></td><td>:</td><td><?php echo "$h&nbsp;:&nbsp;$m";?>&nbsp;:&nbsp;<select name="second" disabled><option value="00">00</option></select></td></tr>
  <tr><td>Event <span class="require">*</span></td><td>:</td><td><input type="text" name="event" id="event" maxlength="50" size="50" /></td></tr>
  <tr><td colspan="2"></td><td><input type="button" name="cancel" value="Cancel" class="cancel">&nbsp;&nbsp;
          <input type="button" name="save" value="Save" class="save"></td></tr>
 </table>
 <script> 
 $('.cancel').click(function(){
  var data = false;
  $.fn.colorbox.close(data);
 });
 $('.save').click(function(){
  if($('#event').val().length > 0){
   $.ajax({
    type: 'POST',
    dataType: 'json',
    url: "<?php echo site_url("evencal/do_add");?>",
    data:{<?php echo "year:$year,mon:$mon,day:$day";?>, hour:$('#hour').val(), minute: $('#minute').val(), event:$('#event').val()},
    success: function(data) {
     if(data.status){
      //$.fn.colorbox.close(data);
      window.location = '<?php echo site_url("evencal/detail/$year/$mon/$day")?>';
     }else{
      $('.spacer').html(data.message);
     }
    }
   });
  }else{
   $('.spacer').html('Please complete the field')
   $('#event').attr('class','error_require');
  }
 });
 </script>
</div>

and last, for autoload component in codeigniter
$autoload['libraries'] = array('database','form_validation');
$autoload['helper'] = array('url','form','html');

That's all about my sharing for Multiple Event Calendar - Evencal with codeigniter.
Sorry about my english :D
You can download the source in my github repo.

Keywords : Codeigniter Multiple Event Calendar,  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,
                    www.paulund.co.uk/giveaway-10-css-notification-boxes-for-free
                    www.jacklmoore.com/colorbox
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Rabu, 10 April 2013

PHP send email via GMAIL SMTP from localhost

At this time i want to share about how to send email using sendmail tools (in XAMPP) via GMAIL SMTP from localhost.

First we must download sendmail tools with ssl (GMAIL SMTP recommend to use ssl connection). We can donwload at glob.com.au/sendmail or in my backup here. Then extract the file to C:\\XAMPP\sendmail
Open sendmail.ini and edit code like this
smtp_server=smtp.gmail.com
smtp_port=587

error_logfile=error.log
debug_logfile=debug.log

auth_username=xxx@gmail.com
auth_password=xxx

you can ignore other code in sendmail.ini,

Open php.ini, find word with key "[mail function]" then edit like this
[mail function]
; For Win32 only.
; http://php.net/smtp
;SMTP = localhost

; http://php.net/smtp-port
;smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = postmaster@localhost

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = Off

; Log all mail() calls including the full path of the script, line #, to address and headers
;mail.log = "C:\xampp\php\logs\php_mail.log"

save php.ini and restart your apache.

Now, test to send an email
<?php
 $headers  = 'MIME-Version: 1.0' . "\r\n";
 $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
 $headers  = 'From: administrator<sender@test.jp>' . "\r\n";
 $headers .= 'Reply To: no-reply@test.jp' . "\r\n";
 $message  = "仮登録いただき、ありがとうございます。";
 mail('receiver', '仮登録完了のお知らせ', $message, $headers); // using sendmail + ssl for send an email.
?>
that's all.
I hope it can help you for send email via GMAIL SMTP from localhost. :)

Sorry about my english :D

Keyword : php mail, sendmail, email

To appreciate the IPR (Intellectual Property Rights), reference sources that I use and I have learned will be displayed.
Referensi    : forums.devshed.com/mail-server-help-111, php.net, stackoverflow.com, blog.rosihanari.net/cara-mengirim-email-dengan-script-php-di-localhost-via-xampp
Author        : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com

Instal Framework Yii di Windows

Pada kali ini saya akan sharing tentang framework php selain Codeigniter yang beberapa hari ini baru saya pelajari yaitu framework Yii. (Hari gini baru blajar Yii.... sama :P)

Kali ini saya akan membahas mengenai tahap instalali dan setting dasar framework Yii sesuai dengan yang saya pelajari. Jadi mohon maaf apabila ada bagian yang sekiranya salah, maklum baru belajar.. hehehe :)

langsung saja, pertama-tama yang dibutuhkan adalah
  1. framework Yii, bisa di download www.yiiframework.com. untuk sekarang yang saya pakai adalah Yii 1.1.13 bisa didapat juga di sini 
  2. web server, untuk web server saya pake XAMPP 1.7.7
Setelah download framework Yii, ekstrak file zip ke dalam folder htdocs yang ada pada XAMPP web server, kemudian rename foldernya menjadi yii.

Selanjutnya lakukan proses membangun aplikasi web menggunakan Yii, caranya
  1. buka cmd, pindah ke path C:\\xampp\htdocs
  2. ketik yii\framework\yiic webapp coba_yii
  3. apabila terdapat message "'"php.exe"' is not recognized as an internal or external command, operable program or batch file."  
  4. lakukan langkah berikut
  • tutup cmd, klik START, klik kanan computer, klik propertise
  • pilih advanced system setting, kemudian buka "environment variables"
  • kemudian buat variabel PATH baru atau edit jika sudah ada dan isikan nilai "C:\xampp\php"(untuk lebih enaknya masukin aja ke user variable dan system variable... hehe)
  • klik ok, keluar dari system propertise,  buka kembali cmd,
  • lakukan kembali proses ke 2.
Apabila proses generate aplikasi berhasil, maka akan terdapat folder "coba_yii" didalam folder  C:\\xampp\htdocs.

(OPTIONAL) untuk kenyamanan atau suka menggabungkan framework Yii dengan aplikasi yang dibuat, copy kan folder yii tadi ke dalam folder coba_yii , kemudian buka file index.php yang ada di folder coba_yii, edit bagian
$yii=dirname(__FILE__).'/../yii/framework/yii.php'; 
menjadi 
$yii=dirname(__FILE__).'/yii/framework/yii.php';
Sekarang coba jalankan aplikasi memanggil alamat "localhost\coba_yii"
Selamat mencoba

Keyword : Instalasi Yii,  install Yii, Yii Windows

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

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 or via github.

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 atau melalui github.

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