31
1. Giới thiệu (Phần 1) CI là một nền tảng ứng dụng web (web application framework) nguồn mở được dùng để xây dựng các ứng dụng web động tương tác với PHP. Nó cho phép các nhà phát triển xây dựng một ứng dụng web nhanh hơn - so với việc viết mã hỗn tạp - bằng cách cung cấp 1 bộ thư viện đầy đủ cho các tác vụ thông thường, cũng như cung cấp một mô hình tương tác đơn giản và dễ hiểu cho việc kết nối tới những bộ thư viện đó. Phiên bản chính thức đầu tiên của CI được công bố vào 28 tháng 2 năm 2006. Phiên bản mới nhất cho tới bây giờ là 2.0 được công bố chính thức vào ngày 28 tháng 01 năm 2011. CI khuyến khích các lập trình viên sử dụng mô hình model-view- controller architectural pattern cho các ứng dụng web của mình. CI cũng mang một số các khái niệm đặc thù và các tính năng cơ bản của các mô hình MVC khác như Ruby on Rails: * Hỗ trợ kết nối và tương tác đa nền tảng cơ sở dữ liệu. * Tương tác với cơ sở dữ liệu thông qua active records. * Session Management (quản lí Session). * Định dạng và chuẩn hóa form và dữ liệu đầu vào. * Hỗ trợ Caching toàn trang để tăng tốc độ thực thi và giảm tải tối thiểu cho máy chủ. * Scaffolding. * Hỗ trợ Template Engine hoặc sử dụng chính PHP tags để điều hướng trong Views. * Hỗ trợ Hooks, các lớp ngoại (Class Extensions), và các Plugins. Trong số các mô hình framework MVC khác, CI có các ưu điểm sau : * Tương thích hoàn toàn với PHP 4. Nếu sử dụng PHP 5 sẽ dùng được các tính năng hữu ích khác như khả năng gọi phương thức dây chuyền (method chaining ability). * Mô hình code nhẹ cho hệ thống, cải thiện tốc độ thực thi. * Đơn giản trong việc cài đặt, cấu hình và cấu trúc thư mục. * Error Logging. * Mêm dẻo trong việc định tuyến URI (URI Routing).

Gioi Thieu Fw CodeIgniter

Embed Size (px)

Citation preview

Page 1: Gioi Thieu Fw CodeIgniter

1. Giới thiệu (Phần 1)

CI là một nền tảng ứng dụng web (web application framework) nguồn mở được dùng để xây dựng các ứng dụng web động tương tác với PHP. Nó cho phép các nhà phát triển xây dựng một ứng dụng web nhanh hơn - so với việc viết mã hỗn tạp - bằng cách cung cấp 1 bộ thư viện đầy đủ cho các tác vụ thông thường, cũng như cung cấp một mô hình tương tác đơn giản và dễ hiểu cho việc kết nối tới những bộ thư viện đó. Phiên bản chính thức đầu tiên của CI được công bố vào 28 tháng 2 năm 2006. Phiên bản mới nhất cho tới bây giờ là 2.0 được công bố chính thức vào ngày 28 tháng 01 năm 2011.

CI khuyến khích các lập trình viên sử dụng mô hình model-view-controller architectural pattern cho các ứng dụng web của mình.

CI cũng mang một số các khái niệm đặc thù và các tính năng cơ bản của các mô hình MVC khác như Ruby on Rails:

    * Hỗ trợ kết nối và tương tác đa nền tảng cơ sở dữ liệu.    * Tương tác với cơ sở dữ liệu thông qua active records.    * Session Management (quản lí Session).    * Định dạng và chuẩn hóa form và dữ liệu đầu vào.    * Hỗ trợ Caching toàn trang để tăng tốc độ thực thi và giảm tải tối thiểu cho máy chủ.    * Scaffolding.    * Hỗ trợ Template Engine hoặc sử dụng chính PHP tags để điều hướng trong Views.    * Hỗ trợ Hooks, các lớp ngoại (Class Extensions), và các Plugins.

Trong số các mô hình framework MVC khác, CI có các ưu điểm sau :

    * Tương thích hoàn toàn với PHP 4. Nếu sử dụng PHP 5 sẽ dùng được các tính năng hữu ích khác như khả năng gọi phương thức dây chuyền (method chaining ability).    * Mô hình code nhẹ cho hệ thống, cải thiện tốc độ thực thi.    * Đơn giản trong việc cài đặt, cấu hình và cấu trúc thư mục.    * Error Logging.    * Mêm dẻo trong việc định tuyến URI (URI Routing).

Framework này tích hợp thêm vào một số lớp thư viện khác mà các framework khác chưa mặc định tích hợp:

    * Bảo mật và XSS Filtering.    * Gửi Email, hỗ trợ đính kèm, HTML/Text email, đa giao thức(sendmail, SMTP, and Mail) và các thứ khác.    * Thư viện chỉnh sửa ảnh (cắt ảnh, thay đổi kích thước, xoay ảnh, v.v..). Hỗ trợ GD, ImageMagick, và NetPBM.    * Upload file.    * FTP Class - Tương tác với máy chủ thông qua giao thức FTP.    * Localization.    * Phân trang tự động.

Page 2: Gioi Thieu Fw CodeIgniter

    * Mã hóa dữ liệu - Data Encryption.    * Đo lường tốc độ thực thi - Benchmarking.    * Application Profiling.    * Lịch - Calendaring Class.    * User Agent Class.    * Nén - Zip Encoding Class.    * Trackback Class.    * XML-RPC Library.    * Unit Testing Class.    * Search-engine Friendly URLs.    * Một lượng lớn các hàm hỗ trợ (helpers).

Sơ đồ ứng dụng:

Trong đó:

- index.php đóng vai trò tiếp nhận và điều khiển mọi hoạt động của ứng dung.- Routing để định tuyến tất cả các yêu cầu từ HTTP cho ứng dụng.- Caching chỉ được sử dụng khi ứng dụng có sử dụng chức năng lưu bộ đệm (cache).- Lớp xữ lí bảo mật của ứng dụng.- Application Controller (và các models, libraries, helpers, plugins, ...) là các điều khiển, xữ lí của ứng dụng.- View trả về kết quả cho trình duyệt hiển thị. Nếu ứng dụng có sử dụng chức năng cache thì view coi như đã được kich hoạt.

2. Cài đặt và cấu hình (Phần 2)

Để cài đặt CI, các bạn thực hiện những bước sau:

1. Tải bộ framework CI tại http://codeigniter.com/download.php.2. Giải nén gói CI bạn sẽ được 3 thư mục (application, system, user_guide) và 2 file (index.php, license.txt). Trong đó, thư mục user_guide là thư mục chứa tài liệu hướng dẫn sử dụng CI, file license.txt là file license. Toàn bộ gói CI bạn chỉ quan tâm 2 thư mục application, system và file index.php (đây là toàn bộ gói CI).3. Copy 2 thư mục application, system và file index.php vào thư mục webroot của server local (sau này gọi là localhost). Tôi sử dụng Wampserver làm server local nên tôi sẽ copy gói CI vào

Page 3: Gioi Thieu Fw CodeIgniter

thư mục www.4. Truy cập địa chỉ http://localhost. Nếu hiện ra trang welcome của CI thì bạn đã cài đặt thành công bước đầu.5. Cấu hình website với 2 bước:    * Bước 1: Mở file application/config/config.php để cấu hình website. Trong file config.php hiện tại bạn chỉ quan tâm tới $config['base_url']. Đây là cấu hình URL đến thư mục gốc của website. Như vậy, với website của chúng ta thì tôi sẽ cấu hình như sau:Mã: Chọn tất cả$config['base_url'] = 'http://localhost';

Kinh nghiệm:Mã: Chọn tất cả$config['base_url'] = 'http://'.$_SERVER['HTTP_HOST'];

File config.php sau khi cấu hình sẽ như sau:Mã: Chọn tất cả<?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/|| If this is not set then CodeIgniter will guess the protocol, domain and| path to your installation.|*/$config['base_url']    = 'http://'.$_SERVER['HTTP_HOST'];

/*|--------------------------------------------------------------------------| 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:

Page 4: Gioi Thieu Fw CodeIgniter

|| '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;

Page 5: Gioi Thieu Fw CodeIgniter

/*|--------------------------------------------------------------------------| 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/|| By default CodeIgniter enables access to the $_GET array.  If for some| reason you would like to disable it, set 'allow_get_array' to FALSE.|| 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

Page 6: Gioi Thieu Fw CodeIgniter

|| 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['allow_get_array']        = TRUE;$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| application/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';

Page 7: Gioi Thieu Fw CodeIgniter

/*|--------------------------------------------------------------------------| 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 Session class you| MUST set an encryption key.  See the user guide for info.|*/$config['encryption_key'] = '';

/*|--------------------------------------------------------------------------| Session Variables|--------------------------------------------------------------------------|| 'sess_cookie_name'        = the name you want for the cookie| 'sess_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.| 'sess_expire_on_close'    = Whether to cause the session to expire automatically|   when the browser window is closed| 'sess_encrypt_cookie'        = Whether to encrypt the cookie| 'sess_use_database'        = Whether to save the session data to a database| 'sess_table_name'            = The name of the session database table| 'sess_match_ip'            = Whether to match the user's IP address when reading the session data| 'sess_match_useragent'    = Whether to match the User Agent when reading the session data| 'sess_time_to_update'        = how many seconds between CI refreshing Session Information|*/$config['sess_cookie_name']        = 'ci_session';$config['sess_expiration']        = 7200;$config['sess_expire_on_close']    = FALSE;$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;

Page 8: Gioi Thieu Fw CodeIgniter

/*|--------------------------------------------------------------------------| 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;

/*|--------------------------------------------------------------------------| Cross Site Request Forgery|--------------------------------------------------------------------------| Enables a CSRF cookie token to be set. When set to TRUE, token will be| checked on a submitted form. If you are accepting user data, it is strongly| recommended CSRF protection be enabled.|| 'csrf_token_name' = The token name| 'csrf_cookie_name' = The cookie name| 'csrf_expire' = The number in seconds the token should expire.*/$config['csrf_protection'] = FALSE;$config['csrf_token_name'] = 'csrf_test_name';$config['csrf_cookie_name'] = 'csrf_cookie_name';$config['csrf_expire'] = 7200;

/*|--------------------------------------------------------------------------| 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

Page 9: Gioi Thieu Fw CodeIgniter

| 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: ./application/config/config.php */

    * Bước 2: Mở file application/config/database.php để cấu hình thông số kết nối cơ sở dữ liệu. Hiện tại, bạn sẽ quan tâm tới 4 thông số sau:                      - $db['default']['hostname']: Tên host của cơ sở dữ liệu.           - $db['default']['username']: Username để kết nối tới cơ sở dữ liệu.           - $db['default']['password']: Mật khẩu để kết nối tới cơ sở dữ liệu.

Page 10: Gioi Thieu Fw CodeIgniter

           - $db['default']['database']: Tên cơ sở dữ liệu.

Với website này tôi sẽ khai báo như sau:Mã: Chọn tất cả<?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|    ['swap_pre'] A default table prefix that should be swapped with the dbprefix|    ['autoinit'] Whether or not to automatically initialize the database.|    ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections|                            - good for ensuring strict SQL while developing|| 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'] = 'root';$db['default']['password'] = '';$db['default']['database'] = 'project_ci';$db['default']['dbdriver'] = 'mysql';$db['default']['dbprefix'] = '';$db['default']['pconnect'] = TRUE;

Page 11: Gioi Thieu Fw CodeIgniter

$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;

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

Với các bước trên, bạn đã cài đặt và cấu hình cơ bản cho website sử dụng CI. Các cấu hình khác bạn có thể tìm hiểu thêm hoặc reply lại tại topic đã qui định.

3. URLs (Phần 3)

Trong phần này chúng ta sẽ tìm hiểu về cách CI xữ lí URL để gọi các controller, method.

Mặc định, URL của CI được thiết kế thân thiện với các máy tìm kiếm, tối ưu SEO bằng cách sử dụng các phân khúc (gọi là segment) thay vì sử dụng URL kiểu truyền thống (query string).

Bạn có thể xem 1 ví dụ về cách mà CI thiết kế URL:

example.com/news/article/my_article

Tuy nhiên, kiểu URL truyền thống (query string) các bạn cũng có thể sử dụng bằng cách cấu hình trong file application/config/config.php như sau:Mã: Chọn tất cả$config['enable_query_strings'] = TRUE;

►Bây giờ ta sẽ phân tích URL sau:

example.com/index.php/class/function/ID

Với URL trên, ta có 3 segment là class, function và ID. Trong đó:

- Segment class sẽ được CI gọi tới controller tên class (class cũng chính là 1 lớp).- Segment function được CI gọi tới phương thức tên function của lớp class ở trên.- Segment ID được CI hiểu như là 1 biến của phương thức function (Bạn cũng có thể truyền vào nhiều biến).

Để làm việc với các segment của URL, CI đã xây dựng sẳn các helper giúp bạn làm việc với các URI segment 1 cách dễ dàng, vì vậy bạn yên tâm về cách thiết kế URL này của CI.

Với URL trên, chúng ta thấy sự xuất hiện của index.php, bạn cũng có thể bỏ index.php bằng

Page 12: Gioi Thieu Fw CodeIgniter

cách sử dụng .htaccess (chỉ hoạt động trên server Linux). Code .htaccess để loại bỏ index.php như sau:Mã: Chọn tất cảRewriteEngine OnRewriteCond %{HTTP_HOST} ^www\.(.*)$RewriteRule ^(.*)$ http://%1/$1 [R=301,L]RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [L,QSA]

Như vậy, sau khi sử dụng .htaccess ta sẽ có URL thân thiện sau:

example.com/class/function/ID

►Thêm phần mở rộng cho URL:

Bạn thường thấy một số website có đường URL như sau:

codeigniter.com/user_guide/general/urls.html (Phần đuôi .html).

CI cũng có thể làm được như vậy chỉ với 1 cấu hình đơn giản trong file application/config/config.php:Mã: Chọn tất cả$config['url_suffix'] = '.html';

lúc đó URL của chúng ta sẽ là:

example.com/class/function/ID.html

►Kích hoạt query string:

Trong trường hợp bạn muốn sử dụng kiểu URL truyền thống (query string), bạn có thể tiến hành cấu hình kích hoạt trong file application/config/config.php:Mã: Chọn tất cả$config['enable_query_strings'] = TRUE;$config['controller_trigger'] = 'c';//Biến lấy tên controller$config['function_trigger'] = 'm';//Biến lấy tên phương thức

Lúc đó, URL của chúng ta sẽ trở thành:

example.com/index.php?c=class&m=function&id=ID

4. Controllers (Phần 4)

Controller có thể được xem như trái tim của toàn bộ ứng dụng. Nó điều khiển các yêu cầu HTTP từ người dùng. Tất cả mọi xữ lí do người dùng tuơng tác đều được xữ lí tại controller, controller

Page 13: Gioi Thieu Fw CodeIgniter

sẽ làm nhiệm vụ giao tiếp giữa các yêu cầu người dùng (hay chính xác hơn đó là các yêu cầu HTTP) với ứng dụng cũng như với cơ sở dữ liệu.

Controller là 1 file class mà nó được đặt tên sao cho có mối liên hệ với URI. Ví dụ với URL sau:

example.com/blog

Với URL thì CI sẽ tìm và gọi controller blog.php và ta có thể tìm thấy controller này trong thư mục application/controllers/blog.php.

Chúng ta sẽ bắt đầu với ứng dụng đầu tiên "HELLO WORD!":

Chúng ta sẽ tạo 1 controller có tên là blog (blog.php) và save trong thư mục application/controllers/ với nội dung như sau:Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {        echo 'Hello World!';    }}?>

Với controller được tạo ở trên, bạn sẽ gọi controller này với URL như sau:

example.com/blog

Lúc đó, kết quả mà chúng ta thấy sẽ là câu "Hello World!".

Các bạn chú ý về cách tạo 1 controller:

- File controller phải được đặt tên trùng với tên controller (tên class) nhưng luôn luôn là chữ thường và được đặt trong thư mục application/controllers/ (hoặc thư mục con trong application/controllers/).- Tên controller (chính xác hơn đó là tên của class) phải được viết hoa chữ cái đầu tiên như ví dụ mà bạn thấy (Blog) và controller phải được extends class CI_Controller.- Mỗi controller luôn luôn có phương thức khởi tạo __construct() với câu lệnh bên trong như bạn thấy ở ví dụ trên:Mã: Chọn tất cảfunction __construct(){    parent::__construct();}

Page 14: Gioi Thieu Fw CodeIgniter

Bạn thấy với controller blog trên, ta chỉ cần truy cập URL example.com/blog là CI sẽ tự động tìm đến controller blog để thự thi. Vậy tại sao CI hiểu là sẽ gọi tới phương thức index()?. Trả lời: Bởi vì với URL trên thì CI đã hiểu ngầm rằng bạn đang truy cập tới controller blog và đang gọi phương thức index() (Có thể xem phương thức index() là phương thức mà CI sẽ tự động hiểu nếu ta không truyền tên phương thức vào URL).

Chúng ta sẽ xét tiếp 1 ví dụ khác như sau:Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {        echo 'Hello World!';    }

    function comments()    {        echo 'Look at this!';    }}?>

Với ví dụ trên, nếu bạn muốn truy cập tới phương thức comments() để in ra câu "Look at this!" thì bạn sẽ truy cập URL sau:

example.com/blog/comments

Với URL trên, CI sẽ tự động tìm đến controller blog và gọi phương thức comments() để in ra câu "Look at this!".

Tiếp tục xét 1 ví dụ khác, ví dụ lần này ta sẽ truyền vào phương thức comments() biến $id, tức lúc này phương thức sẽ trở thành comments($id):Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {        echo 'Hello World!';    }

    function comments($id)

Page 15: Gioi Thieu Fw CodeIgniter

    {        echo 'Look at this! ID comment is '.$id;    }}?>

Với ví dụ trên, bạn truy cập URL sau:

example.com/blog/comments/12

Lúc này, kết quả bạn sẽ thấy là:Trích dẫn:Look at this! ID comment is 12

Theo mặc định, CI sẽ xữ lí URL và gọi các controller (cũng như phương thức tương ứng) như ta đã thấy ở trên. Ngoài ra, CI còn cung cấp cho chúng ta 1 "công cụ" giúp cho chúng ta hoàn toàn tùy biến việc thiết kế URL, đó là routes. Về routes tôi sẽ hướng dẫn trong 1 phần khác được đề cập sau. Với những gì tôi cung cấp về controller được trình bày ở trên chỉ mang tính cơ bản, các bạn có thể tìm hiểu thêm về controller tại http://codeigniter.com/user_guide/gener ... llers.html.

5. Views (Phần 5)

View là 1 trang web hay 1 phần của trang web như header, footer, sidebar... Bạn hiểu đơn giản, view chỉ là những file HTML định hình trang web (phần lớn đều có chèn code PHP để lấy dữ liệu động). Thông thường, toàn bộ những gì bạn thấy trên trình duyệt thì đó được xem như là 1 view.

Về cơ bản, view không thể được gọi trực tiếp mà nó luôn được gọi thông qua 1 controller theo đúng mô hình MVC mà ta thường biết tới.

►Tạo 1 view:

Bạn tạo 1 file view cho controller blog ở phần 4 với nội dung như sau:

Mã: Chọn tất cả<html><head><title>My Blog</title></head><body>    Welcome to my Blog!</body></html>

Tất cả file view của ứng dụng sẽ được lưu trữ trong thư mục application/views. Như vậy với file

Page 16: Gioi Thieu Fw CodeIgniter

view của chúng ta ở trên, tôi sẽ lưu với tên là blogview.php trong thư mục application/views. Với view trên chỉ đơn thuần là 1 trang HTML đơn giản.

►Gọi 1 view từ controller:

Để gọi view, bạn sử dụng cú pháp lệnh:Mã: Chọn tất cả$this->load->view('view_name');

Với view_name là tên file view bạn muốn load nhưng không kèm theo phần mở rộng (.php). Như vậy, với file blogview.php đã tạo ở trên chúng ta sẽ có cú pháp gọi file blogview.php như sau:Mã: Chọn tất cả$this->load->view('blogview');

Và ta sẽ có controller blog với nội dung lệnh như sau:Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {        //Load view        $this->load->view('blogview');    }}?>

Khi bạn truy cập URL sau:

example.com/blog

Kết quả sẽ là:Trích dẫn:Welcome to my Blog!

Bạn cũng có thể load nhiều view trong 1 controller như ví dụ sau:Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {

Page 17: Gioi Thieu Fw CodeIgniter

        //Load view        $this->load->view('header');        $this->load->view('menu');        $this->load->view('blogview');        $this->load->view('footer');    }}?>

Trường hợp bạn tạo view bên trong 1 thư mục con của thư mục application/views (ví dụ tôi đặt file blogview.php trong thư mục application/views/subfolder) bạn có thể sử dụng cú pháp lệnh sau để gọi view:Mã: Chọn tất cả$this->load->view('subfolder/blogview');

Truyền dữ liệu từ controller ra view:

Toàn bộ quá trình xữ lí tương tác dữ liệu đều được thực hiện ở controller (trừ việc lấy dữ liệu từ database là thực hiện ở model sẽ nói sau) nên kết quả trả về sẽ nằm trong controller. Vậy làm cách nào để truyền dữ liệu này ra ngoài view để ta có thể trình bày theo ý muốn? Với CI thì công việc này rất đơn giản: Bạn chỉ việc gán toàn bộ các dữ liệu muốn truyền ra view vào 1 mãng và truyền vào tham số thứ 2 của phương thức load view như ví dụ dưới đây:Mã: Chọn tất cả$data = array(               'title' => 'My Title',               'heading' => 'My Heading',               'message' => 'My Message'          );

$this->load->view('blogview', $data);

Với ví dụ trên, khi ra ngoài blogview bạn sẽ có các biến $title, $heading và $message để sử dụng.

Chúng ta xét ví dụ hoàn chỉnh sau:

Tạo controller blog (application/controllers/blog.php) với nội dung sau:Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {        $data['title'] = 'Tiêu đề website';        $data['messagge'] = 'Hello word!';                //Load view        $this->load->view('blogview', $data);

Page 18: Gioi Thieu Fw CodeIgniter

    }}?>

Tạo view blogview (application/views/blogview.php) với nội dung sau:Mã: Chọn tất cả<html><head><title><?php echo $title; ?></title></head><body>    <?php echo $messagge; ?></body></html>

Bạn truy cập URL:

example.com/blog

Chúng ta sẽ có kết quả:Trích dẫn:Hello word!

(Lưu ý: Chuổi "Tiêu đề" thì xuất hiện trên thanh tiêu đề của trình duyệt).

Khi dữ liệu được truyền từ controller ra view sẽ vẫn giữ nguyên kiểu dữ liệu. Ví dụ kiểu dự trong controller là chuổi (string) thì ngoài view cũng sẽ là chuổi. Tương tự, kiểu mãng (array), kiểu đối tượng (object)... khi truyền ra view vẫn giữ nguyên kiểu dữ liệu.

6. Models (Phần 6)

Model là 1 lớp PHP được thiết kế để tương tác với cơ sở dữ liệu của bạn. Chẳng hạn như bạn viết 1 trang blog sử dụng CI thì thường bạn sẽ có các thao tác với cơ sở dữ liệu như select, thêm, xóa, sửa... Và tất nhiên, vai trò của model là để thực hiện những công việc này.

Chúng ta xét 1 ví dụ dưới đây:Mã: Chọn tất cảclass Blogmodel extends CI_Model {

    var $title   = '';    var $content = '';    var $date    = '';

    function __construct()    {        // Call the Model constructor        parent::__construct();    }    

Page 19: Gioi Thieu Fw CodeIgniter

    function get_last_ten_entries()    {        $query = $this->db->get('entries', 10);        return $query->result();    }

    function insert_entry()    {        $this->title   = $_POST['title']; // please read the below note        $this->content = $_POST['content'];        $this->date    = time();

        $this->db->insert('entries', $this);    }

    function update_entry()    {        $this->title   = $_POST['title'];        $this->content = $_POST['content'];        $this->date    = time();

        $this->db->update('entries', $this, array('id' => $_POST['id']));    }

}

Với vị dụ trên, model Blogmodel đã định nghĩa ra các phương thức như get_last_ten_entries(), insert_entry() hay update_entry(). Tất cả các phương thức này đều tương tác với cơ sở dữ liệu để lấy dữ liệu lên hay thêm mới, chỉnh sửa dữ liệu.

Một model (hay còn gọi class model) được tạo và đặt trong thư mục application/models. Và 1 điều lưu ý, tên file phải trùng với tên của class model nhưng viết thường (giống với controller). Với ví dụ trên thì ta sẽ có file application/models/blogmodel.php. Ngoài ra 1 class model luôn luôn extends CI_Model. Một class model có nội dung tương tự như sau:Mã: Chọn tất cảclass Model_name extends CI_Model {

    function __construct()    {        parent::__construct();    }}

Để sử dụng 1 model, trước tiên bạn phải load model đó. Ví dụ để sử dụng blogmodel ở trên, bạn sẽ phải load blogmodel trước khi sử dụng các phương thức như get_last_ten_entries(), insert_entry() hay update_entry() với cú pháp sau:Mã: Chọn tất cả$this->load->model('blogmodel');

Chúng ta xét lại controller blog ở phần 5, các bạn muốn sử dụng blogmodel cho controller blog thì controller blog sẽ có nội dung như sau:Mã: Chọn tất cả

Page 20: Gioi Thieu Fw CodeIgniter

class Blog extends CI_Controller {

     function __construct()    {        parent::__construct();    }

    function index()    {        $this->load->model('Blogmodel');

        $data['query'] = $this->Blogmodel->get_last_ten_entries();

        $this->load->view('blog', $data);    }}

Trong ví dụn trên, ngoài cú pháp load blogmodel thì bạn còn cần phải chú ý tới câu lệnh sau:Mã: Chọn tất cả$data['query'] = $this->Blogmodel->get_last_ten_entries();

Đây là câu lệnh gọi tới phương thức get_last_ten_entries() và gán cho $data['query']. Như vậy để gọi tới các phương thức được định nghĩa trong 1 model, CI đã thiết kế 1 cách gọi như sau:Mã: Chọn tất cả$this->model_name->method();

Bạn chú ý: model_name là tên của model và phải viết thường và method() là 1 phương thức trong class model. Đây cũng là cách sử dụng chung cho các thư viện của CI.

Để làm việc với model, các bạn còn phải tìm hiểu thêm về thư viện Database mà tôi sẽ đề cập sau. Thư viện Database định nghĩa sẳn các phương thức tương tác an toàn với cơ sở dữ liệu và có lẽ đây là một thư viện chứa nhiều phương thức nhất của CI.

7. Helper Functions (Phần 7)

Những phần trước các bạn đã làm quen với CI, chỉ với những phần trên bạn đã có thể viết ứng dụng web của mình bằng CI rôi. Ở phần này, tôi sẽ giới thiệu về các hàm (function) trợ giúp (gọi là helper) giúp cho công việc viết code của bạn trở nên đơn giản hơn rất nhiều.

Helper đó là cách gọi dành cho các function đã được CI (hoặc kể cả người dùng) định nghĩa sẳn để sử dụng trong ứng dụng của mình 1 cách nhanh chóng. CI đã cung cấp sẳn rất nhiều helper giúp bạn làm việc với CI nhanh chóng hơn nhiều, 1 vài helper được CI định nghĩa và theo tôi nó được sử dụng thường xuyên nhất đó là: url, form, language, captcha, email ...

Việc sử dụng 1 helper rất đơn giản, trước tiên bạn phải load helper cần sử dụng bằng cú pháp sau:

Mã: Chọn tất cả$this->load->helper('name_helper');

Page 21: Gioi Thieu Fw CodeIgniter

Ví dụ bạn muốn load helper url trong controller blog, bạn sẽ có đoạn code như sau:Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {        $this->load->helper('url');//Load helper url                echo base_url();//Sử dụng 1 hàm trong helper url    }}?>

Như ví dụ trên, helper url được load bởi câu lệnh $this->load->helper('url'); và hàm base_url() trong helper url được sử dụng với lời gọi hàm bình thường mà chúng ta vẫn biết trong PHP.

Chúng ta cũng có thể load 1 lúc nhiều helper bằng cú pháp lệnh như sau:Mã: Chọn tất cả$this->load->helper( array('helper1', 'helper2', 'helper3') );

Ví dụ, bạn muốn load các helper url, form, language bạn sẽ có cú pháp như sau:Mã: Chọn tất cả$this->load->helper( array('url', 'form', 'language') );

Việc sử dụng các hàm được định nghĩa sẳn trong helper như tôi đã nói ở trên là chúng ta sẽ gọi hàm bình thường như trong PHP.

Ngoài những helper do CI định nghĩa sẳn (và được lưu trong thư mục system/helpers) thì chúng ta cũng có thể tự tạo ra các helper với qui tắc như sau:1. Tên file helper phải là chữ thường và có subfix (phần đuôi) là _helper. Ví dụ tôi muốn tạo 1 helper có tên là blog thì tôi sẽ tạo 1 file có tên là blog_helper.php và được lưu trong thư mục application/helpers hoặc lưu vào thư mục system/helpers cũng được (nhưng tôi khuyên bạn không nên can thiệp vào thư mục system của CI).2. Tất cả các hàm bạn định nghĩa trong helper của bạn (ví dụ ở đây là helper blog) phải là duy nhất (không được trùng với các hàm của các helper khác).

8. Libraries (Phần 8)

Library là thư viện được CI tạo ra nhầm tạo ra các class chức năng giúp cho bạn làm việc nhanh chóng với ứng dụng. Có thể xem library có vai trò giống với helper.

Page 22: Gioi Thieu Fw CodeIgniter

Mỗi library là 1 class được định nghĩa sẳn các phương thức tiện ích. Tất cả các library do CI định nghịa được đặt trong thư mục system/libraies. Ngoài ra, chúng ta cũng có thể tự định nghĩa 1 library riêng của chính mình. Những library do chúng ta định nghĩa, có thể được lưu trong thư mục system/libraries nhưng tôi khuyên bạn nên đặt trong thư mục application/libraries.

Việc sử dụng 1 library tương tự như sử dụng helper với cú pháp như sau:Mã: Chọn tất cả$this->load->library('class_name');

Ví dụ, CI đã định nghĩa sẳn library upload, bây giờ chúng ta muốn sử dụng library upload trong controller blog thì controller blog sẽ có nội dung sau:Mã: Chọn tất cả<?phpclass Blog extends CI_Controller {    function __construct()    {        parent::__construct();    }

    function index()    {        $this->load->library('upload');//Load library upload    }}?>

Tuy nhiên, sử dụng các phương thức của các library này đòi hỏi bạn phải tìm hiểu về library đó. Docs về các libary đã được CI trình bày khá rõ ràng, các bạn có thể tham khảo tại http://codeigniter.com/user_guide. Về chi tiết cách sử dụng các library tôi sẽ hướng dẫn ở những phần sau.

Chúng ta cũng có thể load 1 lúc nhiều library (giống như helper) với cú pháp như sau:Mã: Chọn tất cả$this->load->library(array('class_name_1', 'class_name_2'));

Ví dụ, tôi muốn load 2 library upload và cart thì tôi sẽ có cú pháp như sau:Mã: Chọn tất cả$this->load->library(array('upload', 'cart'));

Vấn đề tạo 1 library cho riêng bạn, bạn cần tuân theo các qui tắc sau:

1. Tên file phải trùng với tên của class và phải là chữ thường. Ví dụ tôi muốn tạo ra library payment thì tôi sẽ tạo 1 file có tên là payment.php và lưu vào thư mục application/libraries (hoặc thư mục system/libraries). File payment.php sẽ chứa class có tên là Payment (lưu ý chữ cái đầu tiên của class luôn là chữ hoa).2. Tên của library là duy nhất (không trùng với các library khác).

Page 23: Gioi Thieu Fw CodeIgniter

9. URI Routing (Phần 9)

Thông thường thì CI tạo ra 1 mối quan hệ 1 - 1 giữa URI với các controller (class) và các phương thức (method) theo kiểu class/method. Cách phân đoạn của CI có thể biểu diễn bởi ví dụ sau:

example.com/class/function/id

Với ví dụ trên thì chúng ta đang gọi tới controller (hay còn gọi class) tên là class với phương thức được gọi là function và biến id của function.

Đấy là cách gọi mặc định của CI. Chúng ta cũng đã biết, CI cung cấp nhiều tiện ích giúp cho chúng ta có thể tự do tùy biến ứng dụng của mình và trường hợp này CI cũng cung cấp 1 chức năng đó là routing (định tuyến) giúp cho chúng ta có thể điều khiển URI 1 cách dễ dàng mà không nhất thiết phải theo khuông mẫu như ví dụ trên.

Ví dụ, nếu chúng ta có controller blog và function là index() thì URL mà chúng ta truy cập sẽ phải là:

example.com/blog/index

Nhưng bây giờ tôi muốn đổi URL trên thành:

example.com/ca-nhan/tai-khoan

Với URL mới này tôi cũng truy cập vào controller blog và gọi phương thức index() thì sao? Tất nhiên, chúng ta có thể làm điều đó với routing. Với ví dụ trên thì chúng ta sẽ có routing như sau:Mã: Chọn tất cả$route['ca-nhan/tai-khoan'] = "blog/index";

Để thiết kế routing này, CI đã cung cấp 1 file application/config/routes.php. Bạn chỉ việc mở file này lên và thêm vào mẫu routing trên.

Nội dung file routes.php mặc định bạn chỉ cần quan tâm tới 2 dòng lệnh sau:Mã: Chọn tất cả$route['default_controller'] = "welcome";$route['404_override'] = '';

Dòng lệnh $route['default_controller'] = "welcome"; là dòng lệnh định nghĩa controller mặc định khi truy cập website. Ở đây, mặc định là controller welcome sẽ được gọi với phương thức là index() (Nếu là phương thức index() được gọi thì chúng ta có thể không cần thiết khai báo).Dòng lệnh $route['404_override'] = ''; là dòng lệnh gọi tới trang lỗi 404. Nếu để rỗng thì CI sẽ gọi tới trang 404 mặc định.

Như vậy, với ví dụ trên thì file application/config/routes.php của chúng ta sẽ có nội dung như sau:

Page 24: Gioi Thieu Fw CodeIgniter

Mã: Chọn tất cả$route['default_controller'] = "welcome";$route['404_override'] = '';$route['ca-nhan/tai-khoan'] = "blog/index";

HoặcMã: Chọn tất cả$route['default_controller'] = "welcome";$route['404_override'] = '';$route['ca-nhan/tai-khoan'] = "blog";

Hai nội dung trên khác nhau ở dòng lệnh thứ 3 (các bạn cố gắng tìm xem sự khác biệt đó nha ).

Như vậy, với controller blog và file routes.php trên thì chúng ta có thể truy cập controller blog bằng 1 trong 2 cách sau:

example.com/blog/index

Hoặc

example.com/ca-nhan/tai-khoan

Routing của CI cho phép bạn sử dụng các Regular Expressions của PHP. Ngoài ra, CI cũng cung cấp 2 Regular Expressions mặc định đó là:

:num Chỉ chấp nhận số.:any Chấp nhận tất cả các ký tự.