How to convert foreign chars on Code Igniter

Standard

Working with foreign chars on Code Igniter is super simple. I’ve been working on website with vietnamese language for quite some time. Yes, vietnamese character with their curly accessories on alphabets.

For example if you use slug on your vietnamese language on url you will get “Disallowed Character” error. Another case if you are working with payment gateway, unfortunately they don’t accept charset except UTF-8, eg : The famous PayPal and others.

Enough talks, here i show you how.

First, load the Text Helper, or you can put it on autoload config.

$this->load->helper('text');

After the helper is loaded then here is how you use it. Simply just call this method to convert it.

$string = convert_accented_characters($string);

You can add the character mapping on foreign_chars.php under config directory. Here is the example.

Yes. It is done. Hope this helps. This post is more like bookmark so i know where to look when i need it :P

Alasan Menggunakan PHP Framework

Standard

Baru-baru ini ada kesempatan diskusi dengan orang soal penggunaan php framework dengan akademisi dengan latar belakang pemrograman java, mengapa perlu menggunakan php framework, apa gunanya php framework. Diskusinya lumayan menggoyahkan iman :p

Posting kali ini adalah jawaban dan kesimpulan saya soal ini, yang kebetulan belum bisa saya utarakan waktu diskusi tempo hari. Kalau mas dan mbak semua ditanya kenapa menggunakan framework/tidak menggunakan framework, apa jawabannya? Pasti jawabannya beragam. Berikut jawaban populer yang saya dapatkan dari survey kecil2an via Y!m dengan temen2.

Kenapa pake framework?

  • “Coding lebih cepat, biasanya pake framework jadi nulis good code”
  • “Framework X base penggunanya banyak, community besar”
  • “Kalau ukuran project/aplikasi besar lebih mudah dengan framework”
  • “Biar gak reinvent the wheel, reuse code”
  • “dan lain-lain, dan sebagainya, dan teman-temannya… “

Kenapa tidak menggunakan framework?

  • “Framework gak transparan, banyak activity yang di hidden”
  • “Framework gak fleksibel, terus konvensinya beda-beda”
  • “Ga punya full control atas framework, mending bikin sendiri”
  • “dan lain-lain, dan sebagainya, dan teman-temannya… “

Pro dan kontra soal ini memang gak ada habisnya. IMHO, poin2 diatas gak sepenuhnya bener. Coding cepat itu relatif dan pake framework juga belum tentu kita bisa nulis good code. Pengguna framework X banyak juga bukan alasan tepat kita menggunakan framework, tapi ini bisa jadi alasan pertimbangan memilih framework. Ukuran aplikasi yang akan di develop juga bukan tolak ukur penggunaan framework, besar kecil aplikasi bisa di develop menggunakan/tidak menggunakan f/w. Reuse code ini juga relatif, yang tidak pake framework juga pasti punya koleksi class/function bukan?

Kalo dibilang framework itu banyak activity yang di hidden, saya gak setuju, tinggal di trace saja, corenya ada kok, gak sreg ya tinggal modifikasi aja. Konvensi tiap framework beda-beda itu jelas, gak hanya di PHP kan ya? Di Java pun begitu, Spring misalnya pasti beda dengan f/w lainnya di java. Kalo kata mas @neofreko sih bikin apa2 sendiri itu buat orang masih muda aja, kalo yang dewasa ini harusnya bijaksana, lagipula development time kan juga jadi pertimbangan besar.

Ini poin-poin yang jadi kesimpulan saya mengapa menggunakan framework :

  • Mudah dimaintain dan konsisten
  • Development time lebih cepat dengan menggunakan framework
  • Stable and Less Error

Alasan dan penjelasannya kira-kira gini :

  • Mudah dimaintain dan konsisten, ini karena framework sudah ada konvensinya. Aspek ini menurut saya penting jika bekerja dengan tim yang terdiri dari beberapa orang atau anggota tim yang berganti-ganti (as they always do). Dengan adanya konvensi ini debugging lebih mudah dilakukan, alurnya sudah jelas. Ya memang konvensi tiap framework beda-beda, tapi itu bukan masalah menurut saya.
  • Dengan menggunakan framework, development time juga akan lebih cepat. Framework simplify things. Dengan menggunakan framework kita memangkas waktu mengerjakan library basic yang mutlak diperlukan, misal database connectivity, security, session management. Untuk developer yang baru masuk tim pun tidak akan terlalu banyak makan waktu untuk ikut develop langsung dengan membaca dokumentasi dan contoh penggunaan f/w (apalagi f/w yang digunakan termasuk populer).
  • Framework jelas stable dan less error. Apa jaminannya? Cek di websitenya, tiap framework ada testnya. Kalo bikin sendiri error prone alias rawan error.

Kalo kata mas @neofreko lagi sih. “Siapa yang mau bikin ACL (Access Control List) sendiri? cuman orang gila yang mau bikin sendiri” :p

Tapi semuanya balik lagi soal kebijakan dan/atau kasus/aplikasi yang akan dikerjakan. Yaah itu pendapat saya soal alasan penggunaan framework untuk development, boleh setuju boleh juga gak setuju. Silahkan komentar yang setuju dan gak setuju di form komentar dibawah ini… ;)

Selamat makan siang semuanya :)

CodeIgniter Session Problem

Standard

“Why my user session keep expiring?” “Why CodeIgniter session expires when the page refreshed?

Bagi yang sudah sering menggunakan CI biasanya pernah mengalami masalah session problem ini. Usut punya usut dan cari punya cari, ternyata banyak juga yang mengalami masalah serupa. Di forum CodeIgniter pun ada beberapa thread yang posting masalah ini. Kenapa sessionnya expired terus? Atau malah tidak bekerja dengan semestinya di Internet Explorer versi lawas sedangkan di browser lain tidak masalah.

Banyak yang bilang session class si CI ini unreliable. Well, yes it is. I couldn’t agree more with it. CodeIgniter membuat session class-nya ini tidak menggunakan native session-nya PHP, tetapi CI generate sendiri session data mereka. Alasannya agar session lebih fleksibel bagi developer.

Untuk masalah diatas, ini salah satu workaround-nya. Menggunakan external library yang dibikin oleh mas Dariusz Debowczyk yang cerdas nan brilian. Skrip session class-nya dapat diunduh di tautan berikut (atau di akhir post ini) :

http://codeigniter.com/wiki/Dariusz_Debowczyk%27s_Session_Class

Cara menggunakannya cukup simpel, copy dan paste skrip lalu save di direktori “libraries” dengan nama Session.php. Kemudian tinggal panggil library seperti biasa, $this->load->library(“session”); atau didefinisikan di file config/autoload.php di option library-nya. Problem solved! :)

Menurut posting di thread forum CI, library ini berjalan pada CodeIgniter versi 1 dan 2. Saya sudah coba gunakan dan jalan baik-baik saja di versi 2. Di bawah ini skrip session class mas Darius saya kutip untuk mempermudah copy dan pastenya.

</span>
<pre><!--?php  if (!defined('BASEPATH')) exit('No direct script access allowed'); /?-->  makes dw cs4 happy

/**
* Session class using native PHP session features and hardened against session fixation.
*
* @package     CodeIgniter
* @subpackage  Libraries
* @category    Sessions
* @author      Dariusz Debowczyk, Matthew Toledo
* @link        http://www.philsbury.co.uk/index.php/blog/code-igniter-sessions/
*/
class CI_Session {

    var $flashdata_key     = 'flash'; // prefix for "flash" variables (eg. flash:new:message)

    function CI_Session()
    {
        $this->object =& get_instance();
        log_message('debug', "Native_session Class Initialized");
        $this->_sess_run();
    }

    /**
    * Regenerates session id
    */
    function regenerate_id()
    {
        // copy old session data, including its id
        $old_session_id = session_id();
        $old_session_data = $_SESSION;

        // regenerate session id and store it
        session_regenerate_id();
        $new_session_id = session_id();

        // switch to the old session and destroy its storage
        session_id($old_session_id);
        session_destroy();

        // switch back to the new session id and send the cookie
        session_id($new_session_id);
        session_start();

        // restore the old session data into the new session
        $_SESSION = $old_session_data;

        // update the session creation time
        $_SESSION['regenerated'] = time();

        // session_write_close() patch based on this thread
        // http://www.codeigniter.com/forums/viewthread/1624/
        // there is a question mark ?? as to side affects

        // end the current session and store session data.
        session_write_close();
    }

    /**
    * Destroys the session and erases session storage
    */
    function destroy()
    {
        unset($_SESSION);
        if ( isset( $_COOKIE[session_name()] ) )
        {
            setcookie(session_name(), '', time()-42000, '/');
        }
        session_destroy();
    }

    /**
    * Alias for destroy(), makes 1.7.2 happy.
    */
    function sess_destroy()
    {
        $this->destroy();
    }

    /**
    * Reads given session attribute value
    */
    function userdata($item)
    {
        if($item == 'session_id'){ //added for backward-compatibility
            return session_id();
        }else{
            return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item];
        }
    }

    /**
    * Sets session attributes to the given values
    */
    function set_userdata($newdata = array(), $newval = '')
    {
        if (is_string($newdata))
        {
            $newdata = array($newdata => $newval);
        }

        if (count($newdata) > 0)
        {
            foreach ($newdata as $key => $val)
            {
                $_SESSION[$key] = $val;
            }
        }
    }

    /**
    * Erases given session attributes
    */
    function unset_userdata($newdata = array())
    {
        if (is_string($newdata))
        {
            $newdata = array($newdata => '');
        }

        if (count($newdata) > 0)
        {
            foreach ($newdata as $key => $val)
            {
                unset($_SESSION[$key]);
            }
        }
    }

    /**
    * Starts up the session system for current request
    */
    function _sess_run()
    {
        session_start();

        $session_id_ttl = $this->object->config->item('sess_expiration');

        if (is_numeric($session_id_ttl))
        {
            if ($session_id_ttl > 0)
            {
                $this->session_id_ttl = $this->object->config->item('sess_expiration');
            }
            else
            {
                $this->session_id_ttl = (60*60*24*365*2);
            }
        }

        // check if session id needs regeneration
        if ( $this->_session_id_expired() )
        {
            // regenerate session id (session data stays the
            // same, but old session storage is destroyed)
            $this->regenerate_id();
        }

        // delete old flashdata (from last request)
        $this->_flashdata_sweep();

        // mark all new flashdata as old (data will be deleted before next request)
        $this->_flashdata_mark();
    }

    /**
    * Checks if session has expired
    */
    function _session_id_expired()
    {
        if ( !isset( $_SESSION['regenerated'] ) )
        {
            $_SESSION['regenerated'] = time();
            return false;
        }

        $expiry_time = time() - $this->session_id_ttl;

        if ( $_SESSION['regenerated']  $newval);
        }

        if (count($newdata) > 0)
        {
            foreach ($newdata as $key => $val)
            {
                $flashdata_key = $this->flashdata_key.':new:'.$key;
                $this->set_userdata($flashdata_key, $val);
            }
        }
    }

    /**
    * Keeps existing "flash" data available to next request.
    */
    function keep_flashdata($key)
    {
        $old_flashdata_key = $this->flashdata_key.':old:'.$key;
        $value = $this->userdata($old_flashdata_key);

        $new_flashdata_key = $this->flashdata_key.':new:'.$key;
        $this->set_userdata($new_flashdata_key, $value);
    }

    /**
    * Returns "flash" data for the given key.
    */
    function flashdata($key)
    {
        $flashdata_key = $this->flashdata_key.':old:'.$key;
        return $this->userdata($flashdata_key);
    }

    /**
    * PRIVATE: Internal method - marks "flash" session attributes as 'old'
    */
    function _flashdata_mark()
    {
        foreach ($_SESSION as $name => $value)
        {
            $parts = explode(':new:', $name);
            if (is_array($parts) && count($parts) == 2)
            {
                $new_name = $this->flashdata_key.':old:'.$parts[1];
                $this->set_userdata($new_name, $value);
                $this->unset_userdata($name);
            }
        }
    }

    /**
    * PRIVATE: Internal method - removes "flash" session marked as 'old'
    */
    function _flashdata_sweep()
    {
        foreach ($_SESSION as $name => $value)
        {
            $parts = explode(':old:', $name);
            if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flashdata_key)
            {
                $this->unset_userdata($name);
            }
        }
    }
} 

I hope this post helps you. Have a nice weekend :)

PHP: Mobile Device Detection Script

Standard

Kalo kita punya website dengan dua versi, versi desktop dan versi mobilenya, pasti kita mau mobile user alias user yang akses pake handphone di-redirect ke website versi mobile. Gmana caranya? Gini kira-kira caranya.


if(mobile_detect() == true){

// redirect http://m.websitekita.com

}

fungsi mobile_detect() yang ada diatas bisa diambil dibawah ini. please use, copy, edit this simple script as you please.


function mobile_detect()
{
$is_mobile = false;

$iphone = strpos($_SERVER['HTTP_USER_AGENT'],"iPhone");
$android = strpos($_SERVER['HTTP_USER_AGENT'],"Android");
$palmpre = strpos($_SERVER['HTTP_USER_AGENT'],"webOS");
$berry = strpos($_SERVER['HTTP_USER_AGENT'],"BlackBerry");
$ipod = strpos($_SERVER['HTTP_USER_AGENT'],"iPod");

if ($iphone || $android || $palmpre || $ipod || $berry == true)
{
$is_mobile = true;
}else{
$is_mobile = false;
}
return $is_mobile;
}

PHP: RSS Yahoo Weather Parser

Standard

Yahoo! Weather menyediakan informasi cuaca hampir semua lokasi di dunia. Informasi cuaca ini bisa diambil melalui RSS yang disediakan oleh Yahoo! Contohnya, informasi cuaca di kota Jakarta, bisa diakses di URL berikut :

http://weather.yahooapis.com/forecastrss?p=IDXX0022&u=c

Gmana cara ngambil datanya? untuk pengguna bahasa pemrograman PHP ini dia contoh kodenya.

function yahooWeatherParser($source) {

//$source = "http://weather.yahooapis.com/forecastrss?p=IDXX0022&amp;u=c";
$strXml = @file_get_contents($source);
if($strXml == false) return false;

$objRss = simplexml_load_string($strXml);

$objWeather = new SimpleXMLElement($strXml);
$weather['condition'] = $objWeather->xpath("//yweather:condition");
$weather['location'] = $objWeather->xpath("//yweather:location");
$weather['units'] = $objWeather->xpath("//yweather:units");
$weather['wind'] = $objWeather->xpath("//yweather:wind");
$weather['atmosphere'] = $objWeather->xpath("//yweather:atmosphere");
$weather['astronomy'] = $objWeather->xpath("//yweather:astronomy");
$weather['forecast'] = $objWeather->xpath("//yweather:forecast");
$weather['description'] =  $objRss->channel->item->description;

return $weather;
}

Gimana cara pakenya? gini ceritanya…

print_r(yahooWeatherParser('http://weather.yahooapis.com/forecastrss?p=IDXX0022&amp;u=c'));

Sekilas PHP dan MongoDB

Standard

Posting kali ini sekedar sharing percobaan menggunakan PHP dengan MongoDB. Apa itu MongoDB? MongoDB adalah document-based database server. MongoDB ini open source dibangun dengan bahasa pemrograman c++. Kata wikipedia, MongoDB ini scalable, high-performance, schema-free, web-scale. Isi dari MongoDB ini adalah koleksi dari dokumen – dokumen JSON-like. Kira – kira isinya begini…

  {
       "username" : "bob",
       "address" : {
           "street" : "123 Main Street",
           "city" : "Springfield",
           "state" : "NY"
       }
   }

Di bawah ini ada slide presentasi yang sempat dibuat dari hasil coba – coba PHP dan MongoDB. Apa? Kenapa? dan Bagaimananya MongoDB silahkan browsing – browsing sendiri ya.. :)

View more presentations from Hadi Ariawan.

Note :

Articles to read related to MongoDB and PHP.

 

  • http://www.mongodb.org/display/DOCS/Introduction

Installing Zend Optimizer on XAMPP

Standard

Secara default instalasi XAMPP di Windows tidak menyertakan Zend Optimizer, tapi pada umumnya peyedia hosting sudah terinstall Zend Optimizer. Berikut ini langkah – langkah instalasi Zend Optimizer untuk XAMPP di Windows. Versi XAMPP yang digunakan saat post ini ditulis adalah XAMPP 1.7.1.

Direktori instalasi XAMPP yang digunakan ada di D: ( D:\xampp\ )

1. Download Zend Optimizer di website zend.com.

Zend Optimizer bisa di download di http://www.zend.com/en/products/guard/downloads. Tersedia versi MacOS, Linux dan Windows. Download Zend Optimizer for Windows (saat post ini ditulis versi Zend Optimizer 3.3.3)

2. Execute ZendOptimizer-3.3.3-Windows-i386.exe

Pastikan apache/web server dalam keadaan tidak aktif sebelum mulai proses instalasi. Pilih web server yang digunakan, untuk XAMPP 1.7.1 adalah Apache 2.x.x.

Saat proses instalasi ini berjalan, anda akan diberikan 3 kali pertanyaan direktori.

  • Lokasi instalasi Zend Optimizer (C:\Program Files\…..)
    • secara default installer akan menawarkan di C:\Program Files\… Zend Optimizer
  • Lokasi php.ini
    • ubah lokasinya sesuai dengan instalasi xampp, dalam kasus ini lokasi xampp yang digunakan ada di direktori D:\ maka lokasinya adalah D:\xampp\php\
  • Lokasi apache
    • ubah lokasinya sesuai dengan instalasi xampp, dalam kasus ini lokasi xampp yang digunakan ada di direktori D:\ maka lokasinya adalah D:\xampp\apache\

3. Cek phpinfo()

Sebenarnya proses instalasi sudah selesai, Zend Optimizer sudah terinstall di XAMPP. Periksa phpinfo untuk memastikan bahwa Zend Optimizer telah terinstall dengan baik dan benar. Jika sudah terinstall maka akan ada bagian seperti gambar di bawah ini.

Zend Optimizer (phpinfo)

Zend Optimizer (phpinfo)

Setelah selesai instalasi, pastikan option Zend Loader : enabled. Jika option Zend Loader masih disabled, ubahlah setting di file php.ini. Cari dan ubah option zend_optimizer.enable_loader dari 0 ke 1. Contoh lihat gambar di bawah ini.

Zend Optimizer (php.ini)

Zend Optimizer (php.ini)

Lalu test dengan menjalankan aplikasi yang membutuhkan Zend Optimizer. That’s it! It’s Done! ;)

Note:

Sorry, tidak sempat capture pada saat proses instalasi.

Custom Format (Guid) PHP Unique ID

Standard

Pernah lihat “0afd386c-3422-4ceb-b620-fdda219205db” ?? biasanya orang – orang menamakan rangkaian string dengan format itu dengan Guid. Jangan tanya artinya Guid apa, karena saya juga gak tau :p

Oke.. gak usah pakek teori teori ya.. langsung studi kasus aja.. hehehe. Begini contoh kasusnya :

Permasalahan :

Si Budi membangun dua buah sistem (mungkin karena budi tidak jadi bermain bola :p). Sistem yang pertama adalah sebuah website dibangun dengan menggunakan .NET, c#. Sistem yang kedua juga website versi mobile untuk pengguna mobile, dibangun dengan PHP. Salah satu field di salah satu tabel berisikan Guid. Tuliskan skrip PHP yang outputnya adalah Guid dengan format yang mirip dengan format ouput library Guid .NET.

Solusi :

Beginilah jawaban si Budi…

c#


String theNuGuid = Guid.NewGuid().ToString();

php


// Generate Guid
function NewGuid() {
$s = strtoupper(md5(uniqid(rand(),true)));
$guidText =
substr($s,0,8) . '-' .
substr($s,8,4) . '-' .
substr($s,12,4). '-' .
substr($s,16,4). '-' .
substr($s,20);
return $guidText;
}
// End Generate Guid

Si Budi sangat jenius sekali… jawabannya benar! :)

Have a nice weekend everybody… cihui! hari senen libur yak… (dance)

Dirgahayu Republik Indonesia ke-64… MERDEKA!!! (scenic)

Note :

Si Budi nyontek dari sini :