Jumat, 06 Agustus 2010

Skrip Python untuk mengambil gambar dari mangavolume.

Di bawah ini adalah kode Python yang saya buat selagi iseng. Skrip yang saya buat akan mengambil gambar (image) dari situs mangavolume.




import urllib,urllib2, urllister, os.path

imageTotal = 0
imageNow   = 0
sizeNow    = 0

def myReportHook(count, blockSize, totalSize):
  global sizeNow
  sizeNow = sizeNow + blockSize
  print count, sizeNow, totalSize

def getImage(url):
  x = url.rfind("compressed/") + 11
  y = url[x:]
  print y
  if not os.path.isfile(y):
    sizeNow  = 0
    urllib.urlretrieve(url, y,reporthook=myReportHook)
    urllib.urlcleanup() 

def retrieve(url):
  sock = urllib.urlopen(url)
  htmlSource = sock.read()
  sock.close()
  return htmlSource

def cekImage(parser):
  for image in parser.images: 
    if image.find("http") != -1:
      getImage(image)

def getNextPage(parser):
  for url in parser.urls: 
    if url.find("serie=") != -1:
      return url

def parserURL(url):
  htmlSource = retrieve(url)

  parser = urllister.URLLister()
  parser.feed(htmlSource)
  parser.close()
  return parser

host    = "http://www.mangavolume.com"
manga   = "/addicted-to-curry/"
chapter = "chapter-addicted-to-curry-1/"

print "Starting..."
parse = parserURL(host + manga + chapter)
cekImage(parse)
next = getNextPage(parse)
while next != "":
  parse = parserURL(host + next)
  cekImage(parse)
  next = getNextPage(parse)


Kode di atas saya simpan dengan nama mangavolume.py. Pada kode diatas ada modul yang diimpor yang tidak ada di Python, karena modul itu buatan sendiri. Idenya di ambil dari http://diveintopython.org/. Hanya saja sudah saya modifikasi agar sesuai dengan kebutuhan. Kodenya tampak seperti di bawah ini. Kode dibawah saya simpan dengan nama urllister.py.




from sgmllib import SGMLParser

class URLLister(SGMLParser):
  def reset(self):
     SGMLParser.reset(self)
     self.urls    = []
     self.options = []
     self.images  = []

  def start_a(self, attrs):
     href = [v for k, v in attrs if k=='href']
     if href:
       self.urls.extend(href)

  def start_option(self, attrs):
    option = [v for k, v in attrs if k=='value']
    if option:
      self.options.extend(option)

  def start_img(self, attrs):
     image = [v for k, v in attrs if k=='src']
     if image:
       self.images.extend(image)


Karena saya membuat kode diatas cuma iseng, fitur-fiturnya masih dasar banget. Kalo ada yang ingin mengembangkannya, saya persilahkan untuk melakukannya. Jika berkenan, mohon untuk mencantumkan blog ini sebagai asal kode yang anda kembangkan. Happy hacking.

Kamis, 10 Juni 2010

Belajar CodeIgniter (Bag. 2)

Konfigurasi dan Kustomisasi

CodeIgniter meletakkan file-file konfigurasi di system/application/config. Layoutnya tampak seperti berikut:

system
\--application
\---config
      autoload.php
      config.php
      constants.php
      database.php
      doctypes.php
      hooks.php
      index.html
      mimes.php
      routes.php
      smileys.php
      user_agents.php

Dari file-file konfigurasi diatas, hanya file konfigurasi config.php, database.php dan routes.php yang akan kita bahas.

File config.php

File ini berisi konfigurasi utama framework CodeIgniter. Mari kita lihat isinya:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|       http://example.com/
|
*/
$config['base_url']   = "http://example.com/";

/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = "index.php";

/*
|--------------------------------------------------------------------------
| URI PROTOCOL
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string.  The default setting of "AUTO" works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'AUTO'                      Default - auto detects
| 'PATH_INFO'         Uses the PATH_INFO
| 'QUERY_STRING'      Uses the QUERY_STRING
| 'REQUEST_URI'               Uses the REQUEST_URI
| 'ORIG_PATH_INFO'    Uses the ORIG_PATH_INFO
|
*/
$config['uri_protocol']       = "AUTO";

/*
|--------------------------------------------------------------------------
| URL suffix
|--------------------------------------------------------------------------
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
| For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/urls.html
*/

$config['url_suffix'] = "";

/*
|--------------------------------------------------------------------------
| Default Language
|--------------------------------------------------------------------------
|
| This determines which set of language files should be used. Make sure
| there is an available translation if you intend to use something other
| than english.
|
*/
$config['language']   = "english";

/*
|--------------------------------------------------------------------------
| Default Character Set
|--------------------------------------------------------------------------
|
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
*/
$config['charset'] = "UTF-8";

/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the "hooks" feature you must enable it by
| setting this variable to TRUE (boolean).  See the user guide for details.
|
*/
$config['enable_hooks'] = FALSE;


/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries.  For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';


/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs.  When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';


/*
|--------------------------------------------------------------------------
| Enable Query Strings
|--------------------------------------------------------------------------
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
| example.com/who/what/where/
|
| You can optionally enable standard query string based URLs:
| example.com?who=me&what=something&where=here
|
| Options are: TRUE or FALSE (boolean)
|
| The other items let you set the query string "words" that will
| invoke your controllers and its functions:
| example.com/index.php?c=controller&m=function
|
| Please note that some of the helpers won't work as expected when
| this feature is enabled, since CodeIgniter is designed primarily to
| use segment based URLs.
|
*/
$config['enable_query_strings'] = FALSE;
$config['controller_trigger']         = 'c';
$config['function_trigger']   = 'm';
$config['directory_trigger']  = 'd'; // experimental not currently in use

/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| If you have enabled error logging, you can set an error threshold to 
| determine what gets logged. Threshold options are:
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
|       0 = Disables logging, Error logging TURNED OFF
|       1 = Error Messages (including PHP errors)
|       2 = Debug Messages
|       3 = Informational Messages
|       4 = All Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
$config['log_threshold'] = 0;

/*
|--------------------------------------------------------------------------
| Error Logging Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| system/logs/ folder.  Use a full server path with trailing slash.
|
*/
$config['log_path'] = '';

/*
|--------------------------------------------------------------------------
| Date Format for Logs
|--------------------------------------------------------------------------
|
| Each item that is logged has an associated date. You can use PHP date
| codes to set your own date formatting
|
*/
$config['log_date_format'] = 'Y-m-d H:i:s';

/*
|--------------------------------------------------------------------------
| Cache Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| system/cache/ folder.  Use a full server path with trailing slash.
|
*/
$config['cache_path'] = '';

/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class or the Sessions class with encryption
| enabled you MUST set an encryption key.  See the user guide for info.
|
*/
$config['encryption_key'] = "";

/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'session_cookie_name' = the name you want for the cookie
| 'encrypt_sess_cookie' = TRUE/FALSE (boolean).  Whether to encrypt the cookie
| 'session_expiration'  = the number of SECONDS you want the session to last.
|  by default sessions last 7200 seconds (two hours).  Set to zero for no expiration.
| 'time_to_update'            = how many seconds between CI refreshing Session Information
|
*/
$config['sess_cookie_name']           = 'ci_session';
$config['sess_expiration']            = 7200;
$config['sess_encrypt_cookie']        = FALSE;
$config['sess_use_database']  = FALSE;
$config['sess_table_name']            = 'ci_sessions';
$config['sess_match_ip']              = FALSE;
$config['sess_match_useragent']       = TRUE;
$config['sess_time_to_update']        = 300;

/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path'   =  Typically will be a forward slash
|
*/
$config['cookie_prefix']      = "";
$config['cookie_domain']      = "";
$config['cookie_path']                = "/";

/*
|--------------------------------------------------------------------------
| Global XSS Filtering
|--------------------------------------------------------------------------
|
| Determines whether the XSS filter is always active when GET, POST or
| COOKIE data is encountered
|
*/
$config['global_xss_filtering'] = FALSE;

/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads.  When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| VERY IMPORTANT:  If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts.  For
| compression to work, nothing can be sent before the output buffer is called
| by the output class.  Do not "echo" any values with compression enabled.
|
*/
$config['compress_output'] = FALSE;

/*
|--------------------------------------------------------------------------
| Master Time Reference
|--------------------------------------------------------------------------
|
| Options are "local" or "gmt".  This pref tells the system whether to use
| your server's local time as the master "now" reference, or convert it to
| GMT.  See the "date helper" page of the user guide for information
| regarding date handling.
|
*/
$config['time_reference'] = 'local';


/*
|--------------------------------------------------------------------------
| Rewrite PHP Short Tags
|--------------------------------------------------------------------------
|
| If your PHP installation does not have short tag support enabled CI
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
| in your view files.  Options are TRUE or FALSE (boolean)
|
*/
$config['rewrite_short_tags'] = FALSE;


/*
|--------------------------------------------------------------------------
| Reverse Proxy IPs
|--------------------------------------------------------------------------
|
| If your server is behind a reverse proxy, you must whitelist the proxy IP
| addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR
| header in order to properly identify the visitor's IP address.
| Comma-delimited, e.g. '10.0.1.200,10.0.1.201'
|
*/
$config['proxy_ips'] = '';


/* End of file config.php */
/* Location: ./system/application/config/config.php */

Mari kita bahas beberapa konfigurasi yang umum di modifikasi:

  • $config['base_url'] = "http://example.com/";
    Ubahlah url dengan url server anda. Misalnya kita ganti dengan "http://localhost/". Jika aplikasi kita diletakkan dalam sub folder, tuliskan juga bagian sub folder yang bersangkutan. Seperti "http://localhost/belajar/". Hanya saja jika melakukan hal diatas, pada saat kita meletakkan aplikasi kita pada server sebenarnya kita harus merubah bagian localhost menjadi nama server anda. Ada cara yang lebih mudah dan cukup portabel sehingga kita tidak perlu mengubah konfigurasi base_url tiap kali kita implementasikan aplikasi kita di server yang berbeda. Di sini kita memanfaatkan fungsi dari PHP yaitu $_SERVER. Dan kita tuliskan "http://" . $_SERVER['SERVER_ADDR'] . "/belajar" sebagai ganti "http://localhost/belajar/".
  • $config['index_page'] = "index.php";
    Bagian ini biasanya di biarkan apa adanya. Namun jika anda merasa tidak nyaman dengan url seperti "http://localhost/belajar/index.php/hello" maka anda harus melakukan beberapa hal terlebih dahulu. Memanfaatkan mod_rewrite dan membuat file .htaccess sehingga kita bisa menghilangkan "index.php". Bagaimana caranya, silahkan anda cari di Google. :D
  • $config['url_suffix'] = "";
    Konfigurasi ini dimodifikasi jika kita menginginkan url yang dibuat mendapat akhiran seperti misalnya .html. Contoh, kita menginginkan url di halaman yang kita buat menjadi seperti "http://localhost/belajar/index.php/hello.html" daripada "http://localhost/belajar/index.php/hello" maka kita ubah ""; menjadi ".html"; atau apapun akhiran yang anda inginkan.
  • $config['log_threshold'] = 0;
    Jika aplikasi anda masih dalam tahap pengembangan, ubah angka 0 menjadi angka 4. Sehingga kita bisa mencari kesalahan-kesalahan yang mungkin terjadi pada aplikasi kita. Jika aplikasi anda sudah dalam tahap selesai dan siap diimplementasikan maka kita kembalikan angka 4 menjadi angka 0.

Sekarang isi file config.php menjadi seperti berikut:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|       http://example.com/
|
*/
$config['base_url']   = "http://" . $_SERVER['SERVER_ADDR'] . "/belajar/";

/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = "index.php";

/*
|--------------------------------------------------------------------------
| URI PROTOCOL
|--------------------------------------------------------------------------
|
| This item determines which server global should be used to retrieve the
| URI string.  The default setting of "AUTO" works for most servers.
| If your links do not seem to work, try one of the other delicious flavors:
|
| 'AUTO'                      Default - auto detects
| 'PATH_INFO'         Uses the PATH_INFO
| 'QUERY_STRING'      Uses the QUERY_STRING
| 'REQUEST_URI'               Uses the REQUEST_URI
| 'ORIG_PATH_INFO'    Uses the ORIG_PATH_INFO
|
*/
$config['uri_protocol']       = "AUTO";

/*
|--------------------------------------------------------------------------
| URL suffix
|--------------------------------------------------------------------------
|
| This option allows you to add a suffix to all URLs generated by CodeIgniter.
| For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/urls.html
*/

$config['url_suffix'] = ".html";

/*
|--------------------------------------------------------------------------
| Default Language
|--------------------------------------------------------------------------
|
| This determines which set of language files should be used. Make sure
| there is an available translation if you intend to use something other
| than english.
|
*/
$config['language']   = "english";

/*
|--------------------------------------------------------------------------
| Default Character Set
|--------------------------------------------------------------------------
|
| This determines which character set is used by default in various methods
| that require a character set to be provided.
|
*/
$config['charset'] = "UTF-8";

/*
|--------------------------------------------------------------------------
| Enable/Disable System Hooks
|--------------------------------------------------------------------------
|
| If you would like to use the "hooks" feature you must enable it by
| setting this variable to TRUE (boolean).  See the user guide for details.
|
*/
$config['enable_hooks'] = FALSE;


/*
|--------------------------------------------------------------------------
| Class Extension Prefix
|--------------------------------------------------------------------------
|
| This item allows you to set the filename/classname prefix when extending
| native libraries.  For more information please see the user guide:
|
| http://codeigniter.com/user_guide/general/core_classes.html
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'MY_';


/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs.  When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';


/*
|--------------------------------------------------------------------------
| Enable Query Strings
|--------------------------------------------------------------------------
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
| example.com/who/what/where/
|
| You can optionally enable standard query string based URLs:
| example.com?who=me&what=something&where=here
|
| Options are: TRUE or FALSE (boolean)
|
| The other items let you set the query string "words" that will
| invoke your controllers and its functions:
| example.com/index.php?c=controller&m=function
|
| Please note that some of the helpers won't work as expected when
| this feature is enabled, since CodeIgniter is designed primarily to
| use segment based URLs.
|
*/
$config['enable_query_strings'] = FALSE;
$config['controller_trigger']         = 'c';
$config['function_trigger']   = 'm';
$config['directory_trigger']  = 'd'; // experimental not currently in use

/*
|--------------------------------------------------------------------------
| Error Logging Threshold
|--------------------------------------------------------------------------
|
| If you have enabled error logging, you can set an error threshold to 
| determine what gets logged. Threshold options are:
| You can enable error logging by setting a threshold over zero. The
| threshold determines what gets logged. Threshold options are:
|
|       0 = Disables logging, Error logging TURNED OFF
|       1 = Error Messages (including PHP errors)
|       2 = Debug Messages
|       3 = Informational Messages
|       4 = All Messages
|
| For a live site you'll usually only enable Errors (1) to be logged otherwise
| your log files will fill up very fast.
|
*/
$config['log_threshold'] = 4;

/*
|--------------------------------------------------------------------------
| Error Logging Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| system/logs/ folder.  Use a full server path with trailing slash.
|
*/
$config['log_path'] = '';

/*
|--------------------------------------------------------------------------
| Date Format for Logs
|--------------------------------------------------------------------------
|
| Each item that is logged has an associated date. You can use PHP date
| codes to set your own date formatting
|
*/
$config['log_date_format'] = 'Y-m-d H:i:s';

/*
|--------------------------------------------------------------------------
| Cache Directory Path
|--------------------------------------------------------------------------
|
| Leave this BLANK unless you would like to set something other than the default
| system/cache/ folder.  Use a full server path with trailing slash.
|
*/
$config['cache_path'] = '';

/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| If you use the Encryption class or the Sessions class with encryption
| enabled you MUST set an encryption key.  See the user guide for info.
|
*/
$config['encryption_key'] = "";

/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'session_cookie_name' = the name you want for the cookie
| 'encrypt_sess_cookie' = TRUE/FALSE (boolean).  Whether to encrypt the cookie
| 'session_expiration'  = the number of SECONDS you want the session to last.
|  by default sessions last 7200 seconds (two hours).  Set to zero for no expiration.
| 'time_to_update'            = how many seconds between CI refreshing Session Information
|
*/
$config['sess_cookie_name']           = 'ci_session';
$config['sess_expiration']            = 7200;
$config['sess_encrypt_cookie']        = FALSE;
$config['sess_use_database']  = FALSE;
$config['sess_table_name']            = 'ci_sessions';
$config['sess_match_ip']              = FALSE;
$config['sess_match_useragent']       = TRUE;
$config['sess_time_to_update']        = 300;

/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path'   =  Typically will be a forward slash
|
*/
$config['cookie_prefix']      = "";
$config['cookie_domain']      = "";
$config['cookie_path']                = "/";

/*
|--------------------------------------------------------------------------
| Global XSS Filtering
|--------------------------------------------------------------------------
|
| Determines whether the XSS filter is always active when GET, POST or
| COOKIE data is encountered
|
*/
$config['global_xss_filtering'] = FALSE;

/*
|--------------------------------------------------------------------------
| Output Compression
|--------------------------------------------------------------------------
|
| Enables Gzip output compression for faster page loads.  When enabled,
| the output class will test whether your server supports Gzip.
| Even if it does, however, not all browsers support compression
| so enable only if you are reasonably sure your visitors can handle it.
|
| VERY IMPORTANT:  If you are getting a blank page when compression is enabled it
| means you are prematurely outputting something to your browser. It could
| even be a line of whitespace at the end of one of your scripts.  For
| compression to work, nothing can be sent before the output buffer is called
| by the output class.  Do not "echo" any values with compression enabled.
|
*/
$config['compress_output'] = FALSE;

/*
|--------------------------------------------------------------------------
| Master Time Reference
|--------------------------------------------------------------------------
|
| Options are "local" or "gmt".  This pref tells the system whether to use
| your server's local time as the master "now" reference, or convert it to
| GMT.  See the "date helper" page of the user guide for information
| regarding date handling.
|
*/
$config['time_reference'] = 'local';


/*
|--------------------------------------------------------------------------
| Rewrite PHP Short Tags
|--------------------------------------------------------------------------
|
| If your PHP installation does not have short tag support enabled CI
| can rewrite the tags on-the-fly, enabling you to utilize that syntax
| in your view files.  Options are TRUE or FALSE (boolean)
|
*/
$config['rewrite_short_tags'] = FALSE;


/*
|--------------------------------------------------------------------------
| Reverse Proxy IPs
|--------------------------------------------------------------------------
|
| If your server is behind a reverse proxy, you must whitelist the proxy IP
| addresses from which CodeIgniter should trust the HTTP_X_FORWARDED_FOR
| header in order to properly identify the visitor's IP address.
| Comma-delimited, e.g. '10.0.1.200,10.0.1.201'
|
*/
$config['proxy_ips'] = '';


/* End of file config.php */
/* Location: ./system/application/config/config.php */

Untuk konfigurasi lebih lengkap silahkan baca dokumentasi yang tersedia. :D

File routes.php

Disini kita akan mengkonfigurasi rute yang akan digunakan oleh CodeIgniter pada saat controller digunakan. Mari kita lihat isi file routes.php:


<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
| This file lets you re-map URI requests to specific controller functions.
|
| Typically there is a one-to-one relationship between a URL string
| and its corresponding controller class/method. The segments in a
| URL normally follow this pattern:
|
|       example.com/class/method/id/
|
| In some instances, however, you may want to remap this relationship
| so that a different class/function is called than the one
| corresponding to the URL.
|
| Please see the user guide for complete details:
|
|       http://codeigniter.com/user_guide/general/routing.html
|
| -------------------------------------------------------------------------
| RESERVED ROUTES
| -------------------------------------------------------------------------
|
| There are two reserved routes:
|
|       $route['default_controller'] = 'welcome';
|
| This route indicates which controller class should be loaded if the
| URI contains no data. In the above example, the "welcome" class
| would be loaded.
|
|       $route['scaffolding_trigger'] = 'scaffolding';
|
| This route lets you set a "secret" word that will trigger the
| scaffolding feature for added security. Note: Scaffolding must be
| enabled in the controller in which you intend to use it.   The reserved 
| routes must come before any wildcard or regular expression routes.
|
*/

$route['default_controller'] = "welcome";
$route['scaffolding_trigger'] = "";


/* End of file routes.php */
/* Location: ./system/application/config/routes.php */

Pada bagian ini yang akan kita ubah hanyalah bagian $route['default_controller'] = "welcome";. Bagian "welcome" kita ganti menjadi nama file controller yang akan kita gunakan sebagai titik awal aplikasi kita. Misalnya kita ganti menjadi "utama". Sehingga file routes.php kita sekarang isinya menjadi:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------------
| URI ROUTING
| -------------------------------------------------------------------------
| This file lets you re-map URI requests to specific controller functions.
|
| Typically there is a one-to-one relationship between a URL string
| and its corresponding controller class/method. The segments in a
| URL normally follow this pattern:
|
|       example.com/class/method/id/
|
| In some instances, however, you may want to remap this relationship
| so that a different class/function is called than the one
| corresponding to the URL.
|
| Please see the user guide for complete details:
|
|       http://codeigniter.com/user_guide/general/routing.html
|
| -------------------------------------------------------------------------
| RESERVED ROUTES
| -------------------------------------------------------------------------
|
| There are two reserved routes:
|
|       $route['default_controller'] = 'welcome';
|
| This route indicates which controller class should be loaded if the
| URI contains no data. In the above example, the "welcome" class
| would be loaded.
|
|       $route['scaffolding_trigger'] = 'scaffolding';
|
| This route lets you set a "secret" word that will trigger the
| scaffolding feature for added security. Note: Scaffolding must be
| enabled in the controller in which you intend to use it.   The reserved 
| routes must come before any wildcard or regular expression routes.
|
*/

$route['default_controller'] = "utama";
$route['scaffolding_trigger'] = "";


/* End of file routes.php */
/* Location: ./system/application/config/routes.php */

Jadi, jika memasukkan alamat url http://localhost/belajar maka CodeIgniter akan mencari controller utama.php sebagai titik awal aplikasi.


File database.php

File ini kita gunakan untuk mengkonfigurasi database yang akan kita gunakan dalam aplikasi kita. Mari kita lihat isi file database.php:


<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the "Database Connection"
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
|       ['hostname'] The hostname of your database server.
|       ['username'] The username used to connect to the database
|       ['password'] The password used to connect to the database
|       ['database'] The name of the database you want to connect to
|       ['dbdriver'] The database type. ie: mysql.  Currently supported:
mysql, mysqli, postgre, odbc, mssql, sqlite, oci8
|       ['dbprefix'] You can add an optional prefix, which will be added
|                                to the table name when using the  Active Record class
|       ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|       ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|       ['cache_on'] TRUE/FALSE - Enables/disables query caching
|       ['cachedir'] The path to the folder where cache files should be stored
|       ['char_set'] The character set used in communicating with the database
|       ['dbcollat'] The character collation used in communicating with the database
|
| The $active_group variable lets you choose which connection group to
| make active.  By default there is only one group (the "default" group).
|
| The $active_record variables lets you determine whether or not to load
| the active record class
*/

$active_group = "default";
$active_record = TRUE;

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "";
$db['default']['password'] = "";
$db['default']['database'] = "";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

/* End of file database.php */
/* Location: ./system/application/config/database.php */

Pada bagian ini yang umum kita konfigurasi adalah:

  • $db['default']['hostname'] = "localhost";
    Pada bagian ini kita tentukan alamat dari server database yang akan di gunakan.
  • $db['default']['username'] = "";
    Disini kita tentukan nama user yang digunakan dalam aplikasi kita untuk mengakses database.
  • $db['default']['password'] = "";
    Disini kita tentukan kata kunci yang digunakan dalam aplikasi kita untuk mengakses database.
  • $db['default']['database'] = "";
    Di sini kita menentukan nama database yang akan digunakan.
  • $db['default']['dbdriver'] = "mysql";
    Disini kita menentukan driver untuk database yang akan digunakan oleh aplikasi kita. CodeIgniter mendukung sejumlah database yang dapat kita gunakan dalam aplikasi kita. Database yang sudah didukung oleh CodeIgniter diantaranya: MySQL, PostgreSQL, MSSQL, Oracle, SQLite, ODBC.

Di bawah ini beberapa contoh konfigurasi untuk beberapa server database:

  • MySQL
    $db['default']['hostname'] = "localhost";
    $db['default']['username'] = "root";
    $db['default']['password'] = "toor";
    $db['default']['database'] = "belajar";
    $db['default']['dbdriver'] = "mysql";
  • PostgreSQL
    $db['default']['hostname'] = "192.168.1.1";
    $db['default']['username'] = "root";
    $db['default']['password'] = "toor";
    $db['default']['database'] = "belajar";
    $db['default']['dbdriver'] = "postgres";
  • SQLite
    $db['default']['hostname'] = "localhost";
    $db['default']['username'] = "";
    $db['default']['password'] = "";
    $db['default']['database'] = "belajar.db";
    $db['default']['dbdriver'] = "sqlite";

Penutup

Belajar CodeIgniter (Bag. 2) telah selesai. Disini kita belajar mengkonfigurasi framework CodeIgniter. Selamat mencoba. Happy Hacking. :D

Kamis, 03 Juni 2010

Belajar CodeIgniter (Bag. 1)

Apakah CodeIgniter itu?


CodeIgniter adalah sebuah framework yang menggunakan konsep 'MVC' untuk membuat sebuah aplikasi web berbasis PHP. CodeIgniter memanfaatkan OOP dalam pembuatannya. OOP yang digunakan adalah OOP pada PHP versi 4. Jadi aplikasi yang dibuat menggunakan CodeIgniter dapat di install pada server yang menggunakan PHP 4.3xx ke atas.


Instalasi CodeIgniter.


CodeIgniter dapat di ambil di sini. Setelah anda download, mekarkan file yang anda download tadi ke dalam sebuah folder. Layoutnya tampak seperti di bawah ini:



\---CodeIgniter_1.7.2
+---system
|   +---application
|   |   +---config
|   |   +---controllers
|   |   +---errors
|   |   +---helpers
|   |   +---hooks
|   |   +---language
|   |   |   \---english
|   |   +---libraries
|   |   +---models
|   |   \---views
|   +---cache
|   +---codeigniter
|   +---database
|   |   \---drivers
|   |       +---mssql
|   |       +---mysql
|   |       +---mysqli
|   |       +---oci8
|   |       +---odbc
|   |       +---postgre
|   |       \---sqlite
|   +---fonts
|   +---helpers
|   +---language
|   |   \---english
|   +---libraries
|   +---logs
|   +---plugins
|   \---scaffolding
|       +---images
|       \---views
\---user_guide
+---database
+---doc_style
+---general
+---helpers
+---images
+---installation
+---libraries
+---nav
\---overview


Salin atau pindahkan isi folder dan file yang akan digunakan sebagai titik awal aplikasi yang akan kita buat ke dalam folder yang kita inginkan di webserver. Terutama folder system/, file index.php, dan file license.txt. Anda dapat meletakkan folder system/ dan file-file tadi root document yang ditunjuk oleh webserver atau anda dapat meletakkannya di dalam folder tersendiri. Jika aplikasi anda adalah satu-satunya aplikasi yang akan di gunakan di server, maka folder dan file-file tadi dapat anda letakkan di document root. Jika tidak, maka folder dan file-file tadi diletakkan ke dalam suatu folder tersendiri.


Contohnya, jika anda ingin membuat aplikasi baru dengan CodeIgniter di XAMPP (Windows atau Linux) maka folder dan file tadi bisa anda letakkan di folder htdocs (di document root atau di folder terpisah). Mari kita mulai dengan membuat sebuah aplikasi baru dan kita letakkan di folder belajar. Kurang lebih layoutnya seperti berikut:



\htdocs
+---belajar
\---system
+---application
|   +---config
|   +---controllers
|   +---errors
|   +---helpers
+---hooks
|   +---language
|   |   \---english
|   +---libraries
|   +---models
|   \---views
+---cache
+---codeigniter
+---database
|   \---drivers
|       +---mssql
|       +---mysql
|       +---mysqli
|       +---oci8
|       +---odbc
|       +---postgre
|       \---sqlite
+---fonts
+---helpers
+---language
|   \---english
+---libraries
+---logs
+---plugins
\---scaffolding
+---images
\---views


Dan kita bisa menguji halaman yang baru kita buat dengan membuka browser dan memasukkan url http://localhost/belajar. Lho kok sudah bisa di panggil halamannya? Padahal kita belum membuat perubahan apapun pada aplikasi yang sedang kita buat. Itulah kelebihan menggunakan framework CodeIgniter.


Dan anda akan mendapatkan halaman seperti di bawah ini:



Lebih jauh dengan CodeIgniter


Seperti yang anda lihat pada screenshoot sebelumnya, halaman awal yang kita panggil terletak di htdocs/belajar/system/application/views/welcome_message.php mari kita buka file tersebut.



<html>
<head>
<title>Welcome to CodeIgniter</title>

<style type="text/css">

body {
background-color: #fff;
margin: 40px;
font-family: Lucida Grande, Verdana, Sans-serif;
font-size: 14px;
color: #4F5155;
}

a {
color: #003399;
background-color: transparent;
font-weight: normal;
}

h1 {
color: #444;
background-color: transparent;
border-bottom: 1px solid #D0D0D0;
font-size: 16px;
font-weight: bold;
margin: 24px 0 2px 0;
padding: 5px 0 6px 0;
}

code {
font-family: Monaco, Verdana, Sans-serif;
font-size: 12px;
background-color: #f9f9f9;
border: 1px solid #D0D0D0;
color: #002166;
display: block;
margin: 14px 0 14px 0;
padding: 12px 10px 12px 10px;
}

</style>
</head>
<body>

<h1>Welcome to CodeIgniter!</h1>

<p>The page you are looking at is being generated dynamically by CodeIgniter.</p>

<p>If you would like to edit this page you'll find it located at:</p>
<code>system/application/views/welcome_message.php</code>

<p>The corresponding controller for this page is found at:</p>
<code>system/application/controllers/welcome.php</code>

<p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>


<p><br />Page rendered in {elapsed_time} seconds</p>

</body>
</html>

Dan file controller yang ada di htdocs/belajar/system/application/controllers/welcome.php yang isinya seperti berikut ini:



<?php

class Welcome extends Controller {

function Welcome()
{
parent::Controller();   
}

function index()
{
$this->load->view('welcome_message');
}
}

/* End of file welcome.php */
/* Location: ./system/application/controllers/welcome.php */

Dari dua file diatas tampak konsep MVC yang diterapkan CodeIgniter. File-file controller terletak di folder system/application/controllers. Sedangkan file-file view terletak di folder system/application/views.


Mari kita lihat layout folder system/application:



application
|   index.html
|   
+---config
|       autoload.php
|       config.php
|       constants.php
|       database.php
|       doctypes.php
|       hooks.php
|       index.html
|       mimes.php
|       routes.php
|       smileys.php
|       user_agents.php
|       
+---controllers
|       about.php
|       index.html
|       welcome.php
|       
+---errors
|       error_404.php
|       error_db.php
|       error_general.php
|       error_php.php
|       index.html
|       
+---helpers
|       index.html
|       
+---hooks
|       index.html
|       
+---language
|   \---english
|           index.html
|           
+---libraries
|       index.html
|       
+---models
|       index.html
|       
\---views
about.php
index.html
welcome_message.php


Dari layout diatas tampak bahwa CodeIgniter membagi fungsi-fungsi ke dalam folder-folder tersendiri.


  • Untuk proses ke database di letakkan di folder models.(M)
  • Untuk menampilkan ke browser di letakkan di folder views.(V)
  • Untuk proses bisnis, di letakkan di folder controllers.(C)

Sekarang mari kita utak-atik kode pada file htdocs/belajar/system/application/controllers/welcome.php sehingga menjadi seperti di bawah ini:



<?php

class Welcome extends Controller {

function Welcome()
{
parent::Controller();   
}

function index()
{
$this->load->view('coba');
}
}
?>

Setelah selesai di edit, simpan kembali file diatas. Lalu buatlah file baru yang diletakkan di folder system/application/views dan kita simpan dengan nama file coba.php. Isi dari file system/application/views/coba.php kurang lebih seperti berikut:



<html>
<head>
<title>Selamat Belajar</title>
</head>
<body>

<h1>Selamat Datang!</h1>
</body>
</html>

Coba anda buka kembali dan masukkan URL http://localhost/belajar dan lihatlah hasilnya.




Selamat mencoba

Sabtu, 30 Januari 2010

Belajar Grails (bagian keempat)

Membuat kelas Domain


Sekarang mari kita bahas kelas Domain yang telah kita buat pada pembahasan sebelumnya. Kode yang kita buat seperti tampak di bawah ini:



Listing 4.1


class DaftarTeman {
    String nama
    String alamat
    String nomorHP
    String nomorTelpon
    Date tanggalLahir

    static constraints = {
        nama(size:0..40, nullable: false)
        alamat(size:0..80, nullable: true)
        nomorHP(size:0..20, nullable: true)
        nomorTelpon(size:0..20, nullable: true)
        tanggalLahir()
    }
    
    String toString() {
        "$nama"
    }
}

  • baris 01


    nama kelas yang akan menjadi nama tabel di database.
  • baris 02 - 06


    nama-nama field dan tipe datanya.
  • baris 09 - 13


    digunakan untuk validasi dan menentukan atribut dari field di database.
  • baris 16 - 18


    method yang akan mengembalikan nilai string.

Tipe Data


Tipe data yang akan digunakan untuk membuat sebuah domain adalah tipe data yang di dukung oleh Groovy (jika anda tidak sempat mempelajari Groovy, asumsikan saja tipe data yang akan dipergunakan dengan tipe data yang biasa anda gunakan pada pemrograman Java). Seperti terlihat pada potongan kode diatas. Jika anda berasumsi bahwa Groovy adalah sebuah perluasan bahasa Java, maka asumsi itu tidak seluruhnya salah. Untuk mudahnya, asumsi diatas dapat di terima. Sebaiknya anda pelajari Groovy lebih mendalam untuk mengetahui lebih dalam bahasa yang dipergunakan oleh Grails.


Constraint


Constraint digunakan untuk beberapa hal. Diantaranya adalah membuat validasi pada data yang akan di masukkan oleh pengguna, juga digunakan oleh Grails untuk mendefinisikan field-field pada tabel di database yang akan dibuat dan digunakan nantinya.


Di bawah ini akan di tampilkan tabel macam-macam constraint yang di dukung oleh Grails.


Constraint Contoh Keterangan
blank login(blank:false) Set ke false jika nilai string tidak boleh kosong
email email(email:true) Set ke true jika nilai harus berupa alamat email
inList login(inList:["Joe", "Fred"] ) Nilai yang dimasukkan harus sesuai dengan nilai di dalam list
length login(length:5..15) Digunakan untuk membatasi panjang dari string atau array
min age(min:new Date()) Untuk menentukan nilai minimum
minLength login(minLength:5) Untuk menentukan panjang minimum string atau array
minSize children(minSize:5) Untuk menentukan ukuran minimum collection atau angka
matches login(matches:/[a-zA-Z]/) Untuk diperiksa apakah sesuai dengan regular expression yang di berikan
max age(max:new Date()) Untuk menentukan nilai maksimum
maxLength login(maxLength:5) Untuk menentukan panjang maksimum string atau array
maxSize children(maxSize:25) Untuk menentukan panjang maksimum collection atau angka
notEqual login(notEqual:"Bob") Nilai yang dimasukkan tidak boleh sama dengan nilai yang ditentukan
nullable age(nullable:false) Set ke false jika nilai tidak boleh berupa null
range age(range:minAge..maxAge) Nilai yang dimasukkan harus berada dalam range yang ditentukan
size children(size:5..15) Untuk membatasi ukuran dari collection atau angka sesuai range yang ditentukan
unique login(unique:true) Set ke true jika properti harus unik
url url(url:true) Set ke true jika nilai string adalah alamat URL

Relasi antar Tabel


Grails (via GORM -> Grails Object-Relational Mapping) menyediakan beberapa cara dalam mendefinisikan relasi antar tabel. Misalnya kita mempunyai dua buah tabel yang akan di buat relasi antar tabel seperti tampak pada tabel di bawah ini:


Pengarang Buku
namaPengarang judulBuku

Dan kode untuk kelas domain yang kita buat tampak seperti berikut:



Listing 4.2


class Pengarang {
   String namaPengarang

   static constraints = {
       namaPengarang(size:0..40, nullable: false)
   }
    
   String toString() {
       "$namaPengarang"
   }
}


class Buku {
   String judulBuku

   static constraints = {
       judulBuku(size:0..40, nullable: false)
   }
    
   String toString() {
       "$judulBuku"
   }
}

  • Relasi one-to-one

    • Satu arah (Unidirectional)


      Kita ingin menambahkan relasi dimana setiap buku punya seorang pengarang. Maka kode yang akan kita buat menjadi seperti dibawah ini:



      Listing 4.3


      class Pengarang {
         String namaPengarang
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         String judulBuku
         Pengarang pengarang
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
         
         String toString() {
             "$judulBuku"
         }
      }
      

    • Dua arah (Bi Directional)


      Jika kita ingin membuat relasi dimana seorang pengarang juga mempunyai buku, maka kode yang dibuat menjadi seperti dibawah ini:



      Listing 4.4


      class Pengarang {
         String namaPengarang
         Buku buku
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         String judulBuku
         Pengarang pengarang
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }
      




      Jika anda menginginkan relasi antar tabel saling mempengaruhi pada saat insert/update ke database maka kode yang dibuat menjadi:



      Listing 4.5


      class Pengarang {
         String namaPengarang
         Buku buku
      
         static constraints = {
           namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         static belongsTo = [pengarang:Pengarang]
         String judulBuku
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }
      

      Kata kunci belongsTo pada kode diatas menunjukkan bahwa tabel Buku dimiliki oleh tabel Pengarang. Namun harap di perhatikan, jika anda menghapus satu data Pengarang maka Buku yang berkaitan juga ikut dihapus dari database.

  • Relasi one-to-many/many-to-one

    • Satu arah (Unidirectional)


      Jika anda ingin membuat sebuah relasi dimana seorang Pengarang mempunyai banyak Buku, maka kode yang dibuat menjadi seperti berikut:



      Listing 4.6


      class Pengarang {
         static hasMany = [buku:Buku]
         String namaPengarang     
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         String judulBuku
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }
      

    • Dua arah (Bi Directional)



      Listing 4.7


      class Pengarang {
         static hasMany = [buku:Buku]
         String namaPengarang
      
         static constraints = {
             namaPengarang(size:0..40, nullable: false)
         }
          
         String toString() {
             "$namaPengarang"
         }
      }
      


      class Buku {
         static belongsTo = [pengarang:Pengarang]
         String judulBuku
      
         static constraints = {
             judulBuku(size:0..40, nullable: false)
         }
          
         String toString() {
             "$judulBuku"
         }
      }