Basic Tìm hiểu CodeIgniter framework

Language
Tiếng Việt
Sau khi các bạn đọc và học theo hai bài hướng dẫn về lập trình PHP từ cơ bản đến nâng cao của tôi thông qua việc hoàn thành website giới thiệu sản phẩm thì ngay bây giờ, các bạn có thể tiếp tục tìm hiểu về một PHP framework rất phổ biến và dễ sử dụng hiện nay là CodeIgniter. Về bài hướng dẫn này tôi chỉ hướng dẫn các bạn các bước để cài đặt cũng như sử dụng các thành phần chính của CodeIgniter mà thôi. Để phát triển một website bằng CodeIgniter thì các bạn còn phải tìm hiểu thêm nhiều hơn nữa và tôi cũng sẽ viết tiếp loạt bài hướng dẫn các bạn phát triển một website hoàn chỉnh với CodeIgniter framework.

Nội dung bài hướng dẫn này do tôi biên soạn lại từ tài liệu của CodeIgniter tại địa chỉ https://codeigniter.com/user_guide.

CodeIgniter là một mã nguồn mở dùng để phát triển ứng dụng web trên nền tảng ngôn ngữ lập trình 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 ngay từ đầu bằng cách cung cấp một 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 CodeIgniter được công bố vào ngày 28/02/2006. Phiên bản mới nhất cho tới lúc tôi viết bài hướng dẫn này là 3.1.6 được công bố chính thức vào ngày 25/09/2017.

CodeIgniter 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ư:
  • 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.
  • Định dạng, chuẩn hóa form và dữ liệu đầu vào.
  • Hỗ trợ bộ đệm toàn trang (Full page caching) để tăng tốc độ thực thi và giảm tải tối thiểu cho máy chủ.
  • Bảo mật và bộ lọc XSS.
  • Quản lí session.
  • Hỗ trợ template engine hoặc sử dụng chính PHP tags để điều hướng trong views.
  • Hỗ trợ search engine friendly URLs, application profiling, hooks, các lớp ngoại (Class extensions)...
Trong số các mô hình MVC framework, CodeIgniter có các ưu điểm sau:
  • Mô hình mã lệnh 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.
  • Hỗ trợ bộ đệm toàn trang giúp tăng tốc độ thực thi và giảm tải cho máy chủ.
  • Mềm dẻo trong việc định tuyến URI (URI routing).
  • Hỗ trợ error logging.
CodeIgniter được tích hợp thêm vào nhiều lớp thư viện hữu ích khác như:
  • Bảo mật và bộ lọc XSS.
  • Gửi email, hỗ trợ đính kèm, HTML/Text email, đa giao thức (SMTP, sendmail, 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...). Hỗ trợ GD, ImageMagick, và NetPBM.
  • Upload file.
  • Tương tác với máy chủ thông qua giao thức FTP.
  • Phân trang tự động (Pagination).
  • Mã hóa dữ liệu (Data encryption).
  • Đo lường tốc độ thực thi (Benchmarking).
  • Application profiling.
  • Lịch (Calendar).
  • User agent.
  • Nén (Zip encoding).
  • Trackback.
  • XML-RPC library.
  • Unit testing.
  • Search engine friendly URLs.
  • Một lượng lớn các hàm hỗ trợ (Helper).
  • Và rất nhiều các thư viện khác.
Các bạn cần lưu ý, phiên bản CodeIgniter 3.x hiện tại yêu cầu phiên bản PHP 5.6+, MySQL 5.1+ (Chi tiết các bạn tham khảo tại địa chỉ https://codeigniter.com/user_guide/general/requirements.html). Tuy nhiên, CodeIgniter 3.x vẫn "hoạt động được" với phiên bản PHP 5.3.7+ nhưng sẽ không tối ưu về bảo mật cũng như một số tính năng không thể hoạt động.

Những giới thiệu ban đầu về CodeIgniter framework chỉ ngắn gọn như vậy, trong thời gian tới tôi sẽ trình bày chi tiết các thành phần chính của CodeIgniter framework để các bạn có đủ kiến thức sử dụng framework này thực hiện các dự án web của mình.

Chân thành cảm ơn sự quan tâm của các bạn!
 
PHẦN 1: CÀI ĐẶT VÀ CẤU HÌNH

Để cài đặt CodeIgniter, các bạn thực hiện các bước sau:
  1. Tải bộ CodeIgniter framework tại địa chỉ https://codeigniter.com/download (Tải phiên bản 3.x).
  2. Giải nén gói CodeIgniter bạn sẽ được 3 thư mục application, system, user_guide và tập tin index.php. Trong đó, thư mục user_guide chứa tài liệu hướng dẫn sử dụng CodeIgniter. Toàn bộ gói CodeIgniter bạn chỉ quan tâm 2 thư mục application, system và tập tin index.php (Đây là gói thư viện CodeIgniter).
  3. Sao chép thư mục application, system và tập tin index.php vào thư mục gốc của máy chủ (Sau này gọi là localhost). Tôi sử dụng Wampserver làm máy chủ nên tôi sẽ sao chép gói CodeIgniter vào thư mục www.
  4. Truy cập địa chỉ http://localhost. Nếu hiện ra trang "welcome" của CodeIgniter thì bạn đã cài đặt thành công bước đầu.
Để khai báo thông tin kết nối đến cơ sở dữ liệu (DB), các bạn mở tập tin application/config/database.php và khai báo các thông tin sau:
  • $db['default']['hostname']: Tên máy chủ DB.
  • $db['default']['username']: Tài khoản kết nối tới DB.
  • $db['default']['password']: Mật khẩu kết nối tới DB.
  • $db['default']['database']: Tên DB.
  • $db['default']['dbdriver']: Trình điều khiển DB (MySQL, MySQLi, PDO,...).
Các bạn cũng có thể tìm hiểu thêm một số thông tin cấu hình khác như:
  • $db['default']['dbprefix']: Tiền tố của các bảng dữ liệu (Ví dụ tbl_).
  • $db['default']['swap_pre']: Chuỗi thay thế cho tiền tố bảng dữ liệu khi viết SQL (Ví dụ {PRE}).
  • $db['default']['pconnect']: Kết nối DB sử dụng pconnect (Nên khai báo TRUE).
Ví dụ tôi tạo DB có tên "training_codeigniter_1" trên Wampserver với tài khoản kết nối MySQL là "root", mật khẩu là rỗng (Không có mật khẩu) thì các bạn khai báo thông tin cấu hình trong tập tin application/config/database.php như sau:
PHP:
$db['default'] = array(
    'dsn' => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'training_codeigniter_1',
    'dbdriver' => 'mysql',
    'dbprefix' => '',
    'pconnect' => TRUE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8mb4_general_ci',
    'swap_pre' => '',
    'encrypt'  => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);
Với khai báo trên, tôi không sử dụng tiền tố bảng dữ liệu và cũng không bật bộ đệm (Cache).

Với các bước trên, các bạn đã cài đặt và cấu hình cơ bản cho website sử dụng CodeIgniter framework. Các cấu hình khác các bạn có thể tìm hiểu thêm.
 
PHẦN 2: URLs

Trong phần này chúng ta sẽ tìm hiểu về cách CodeIgniter xử lý URL để gọi các controller.

Mặc định, URL của CodeIgniter đượ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 một ví dụ về cách mà CodeIgniter thiết kế URL:
Code:
http://localhost/news/title-news
Tuy nhiên, kiểu URL truyền thống các bạn cũng có thể sử dụng bằng cách cấu hình trong tập tin application/config/config.php như sau:
PHP:
$config['enable_query_strings'] = TRUE;
Bây giờ ta sẽ phân tích URL sau:
Code:
http://localhost/index.php/class/function/id
Với URL trên, ta có 3 phân khúc là class, function và id. Trong đó:
  • Phân khúc class được CodeIgniter gọi tới controller tên là class (class cũng chính là một lớp).
  • Phân khúc function được CodeIgniter gọi tới phương thức tên là function của lớp class ở trên.
  • Phân khúc id được CodeIgniter hiểu như là một 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 phân khúc của URL, CodeIgniter đã xây dựng sẳn các hàm trợ giúp (Helper) giúp làm việc với các phân khúc một cách dễ dàng, vì vậy các bạn yên tâm về cách thiết kế URL này của CodeIgniter.

Với URL trên, chúng ta thấy sự xuất hiện của index.php, các bạn cũng có thể bỏ index.php bằng cách sử dụng .htaccess. Nội dung tập tin .htaccess như sau:
Code:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Như vậy, sau khi sử dụng .htaccess ta sẽ có URL thân thiện như sau:
Code:
http://localhost/class/function/id
Các bạn thường thấy một số website có URL như sau:
Code:
http://localhost/class/function/id.html (Phần đuôi .html).
CodeIgniter cũng có thể làm được như vậy chỉ với một cấu hình đơn giản trong tập tin application/config/config.php:
PHP:
$config['url_suffix'] = '.html';
Trong trường hợp các bạn sử dụng kiểu URL truyền thống. Lúc đó, URL sẽ trở thành:
Code:
http://localhost/index.php?c=class&m=function&id=id
Khi đó, các bạn chỉ việc lấy giá trị các biến truyền trên URL bằng biến $_GET của PHP là được.

Các bạn có thể tìm hiểu thêm về URLs tại địa chỉ https://codeigniter.com/user_guide/general/urls.html.
 
PHẦN 3: CONTROLLERS

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 tương tác đều được xử lý tại controller, controller 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 DB.

Controller là một lớp PHP mà nó được đặt tên sao cho có mối liên hệ với URL. Ví dụ với URL sau:
Code:
http://localhost/blog
Với URL trên thì CodeIgniter sẽ tìm và gọi controller blog (Blog.php) và các bạn có thể tìm thấy controller này trong thư mục application/controllers.

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

Tạo một controller có tên là blog và lưu trong thư mục application/controllers. Nội dung tập tin application/controllers/Blog.php như sau:
PHP:
<?php
class Blog extends CI_Controller
{
    public function index()
    {
        echo 'Hello World!';
    }
}
Với controller được tạo ở trên, các bạn sẽ gọi controller này với URL như sau:
Code:
http://localhost/blog
Lúc đó, kết quả mà các bạn thấy sẽ là câu "Hello World!".

Các bạn chú ý về cách tạo controller:
  • Tập tin controller phải được đặt tên trùng với tên controller (Kể cả chữ hoa và chữ thường hoặc dấu phân cách...) 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 lớp) phải được viết hoa chữ cái đầu tiên như ví dụ mà các bạn thấy (Blog) và controller phải kế thừa lớp CI_Controller.
Các bạn thấy với controller blog trên, ta chỉ cần truy cập URL http://localhost/blog là CodeIgniter sẽ tự động tìm đến controller blog để thự thi. Vậy tại sao CodeIgniter hiểu là sẽ gọi tới phương thức index? Bởi vì với URL trên thì CodeIgniter đã hiểu ngầm rằng ta đang truy cập tới controller blog và đang gọi phương thức index. Như vậy, có thể xem phương thức index là phương thức mà CodeIgniter sẽ tự động gọi nếu ta không truyền tên phương thức vào URL.

Xét tiếp một ví dụ khác như sau:
PHP:
<?php
class Blog extends CI_Controller
{
    public function index()
    {
        echo 'Hello World!';
    }
    
    public function comments()
    {
        echo 'Look at this!';
    }
}
Với ví dụ trên, nếu các bạn muốn truy cập tới phương thức comments để in ra câu "Look at this!" thì các bạn sẽ truy cập URL sau:
Code:
http://localhost/blog/comments
Với URL trên, CodeIgniter 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 ví dụ khác, ví dụ lần này sẽ truyền vào phương thức comments biến $id như sau:
PHP:
<?php
class Blog extends CI_Controller
{
    public function index()
    {
        echo 'Hello World!';
    }
    
    public function comments($id)
    {
        echo 'Look at this! ID is ' . $id;
    }
}
Với ví dụ trên, các bạn truy cập URL sau:
Code:
http://localhost/blog/comments/30
Lúc này sẽ in ra câu "Look at this! ID is 30".

Theo mặc định, CodeIgniter sẽ xử lý URL và gọi các controller (Cũng như phương thức tương ứng) như các bạn đã thấy ở trên. Ngoài ra, CodeIgniter còn cung cấp một 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 một 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ề controllers tại địa chỉ https://codeigniter.com/user_guide/general/controllers.html.
 
PHẦN 4: VIEWS

View là một trang HTML trình bày giao diện như header, footer, sidebar... Các bạn hiểu đơn giản, view chỉ là những tập tin PHP chứa mã HTML định hình trang web (Có chèn mã lệnh PHP để trình bày dữ liệu động). Thông thường, toàn bộ những gì các bạn thấy trên trình duyệt thì đó được xem như là một 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 controller theo đúng mô hình MVC mà các bạn thường biết tới.

Tạo tập tin view cho controller blog ở phần trước với nội dung như sau:
PHP:
<html>
<head>
<title>My Blog</title>
</head>
<body>
Welcome to my Blog!
</body>
</html>
Tất cả tập tin view của ứng dụng sẽ được lưu trữ trong thư mục application/views và tên tập tin phải hoàn toàn là chữ thường. Như vậy, với tập tin view ở trên, tôi sẽ lưu với tên là blog-view.php trong thư mục application/views.

View hoạt động được thông qua lệnh gọi từ controller. Để nạp view từ controller, các bạn sử dụng cú pháp lệnh như sau:
Code:
$this->load->view('Tên_view');
Tại phương thức index của controller blog, các bạn chỉnh lại như sau:
PHP:
public function index()
{
    $this->load->view('blog-view');
}
Khi các bạn truy cập địa chỉ http://localhost/blog thì dòng "Welcome to my Blog!" sẽ được hiển thị.

Các bạn cũng có thể nạp nhiều view trong một phương thức của controller như ví dụ sau:
PHP:
public function index()
{
    $this->load->view('header-view');
    $this->load->view('blog-view');
    $this->load->view('footer-view');
}
Trường hợp các bạn tạo view bên trong thư mục con của thư mục application/views, các bạn có thể sử dụng cú pháp lệnh sau để nạp view:
Code:
$this->load->view('Thư_mục_con/Tên_view');
ví dụ tôi đặt tập tin blog-view.php ở trên trong thư mục application/views/blog, tôi sẽ điều chỉnh lại lệnh nạp view như sau:
PHP:
$this->load->view('blog/blog-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ừ DB 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 để có thể trình bày theo ý muốn? Với CodeIgniter thì công việc này rất đơn giản, các bạn chỉ việc gán toàn bộ các dữ liệu muốn truyền ra view vào một mãng và truyền vào tham số thứ hai của phương thức $this->load->view() như ví dụ dưới đây:
PHP:
$data = array(
    'title' => 'My Title',
    'heading' => 'My Heading',
    'message' => 'My Message'
);

$this->load->view('blog-view', $data);
Với ví dụ trên, khi ra ngoài blog-view.php các bạn sẽ có các biến $title, $heading và $message để sử dụng.

Xét ví dụ hoàn chỉnh sau:

Nội dung controller blog (Tập tin application/controllers/Blog.php) như sau:
PHP:
<?php
class Blog extends CI_Controller
{
    function index()
    {
        //Gán dữ liệu
        $data['title'] = 'Website title';
        $data['messagge'] = 'Hello word!';
       
        //Nạp view
        $this->load->view('blog-view', $data);
    }
}
Nội dung view blog (Tập tin application/views/blog-view.php) như sau:
PHP:
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $messagge; ?>
</body>
</html>
Khi các bạn truy cập địa chỉ http://localhost/blog kết quả sẽ là "Hello word!".

Khi dữ liệu được truyền từ controller ra view vẫn giữ nguyên kiểu dữ liệu. Ví dụ kiểu dữ liệu 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.

Các bạn có thể tìm hiểu thêm về views tại địa chỉ https://codeigniter.com/user_guide/general/views.html.
 
PHẦN 5: MODELS

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

Xét ví dụ sau:
PHP:
<?php
class Blog_model extends CI_Model
{
    public $title;
    public $content;
    public $date;
 
    public function __construct()
    {
        parent::__construct();
    }
 
    public function get_last_ten()
    {
        //Query
        $query = $this->db->get('tbl_blog', 10);
     
        //Lấy kết quả và trả về
        return $query->result();
    }
 
    public function insert()
    {
        //Nhận dữ liệu post từ form
        $this->title = $_POST['title'];
        $this->content = $_POST['content'];
        $this->date = time();
     
        //Thực hiện thêm mới
        $this->db->insert('tbl_blog', $this);
    }
 
    public function update()
    {
        //Nhận dữ liệu post từ form
        $this->title = $_POST['title'];
        $this->content = $_POST['content'];
        $this->date = time();
     
        //Thực hiện cập nhật
        $this->db->update('tbl_blog', $this, array(
            'id' => $_POST['id']
        ));
    }
}
Với ví dụ trên, model blog_model đã định nghĩa các phương thức get_last_ten, insert và update. Tất cả các phương thức này đều tương tác với DB để lấy dữ liệu hay thêm mới, chỉnh sửa dữ liệu.

Một model được tạo và đặt trong thư mục application/models. Lưu ý, tên tập tin phải trùng với tên của lớp model (Kể cả chữ hoa và chữ thường hoặc dấu phân cách...). Với ví dụ trên thì ta sẽ có tập tin application/models/Blog_model.php. Ngoài ra, lớp model phải kế thừa CI_Model và phải có phương thức khởi tạo (__construct) với nội dung như ví dụ ở trên.

Để sử dụng model trong controller, trước tiên các bạn phải nạp model đó với cú pháp lệnh như sau:
Code:
$this->load->model('Tên_model');
Ví dụ trong controller blog, các bạn muốn sử dụng blog_model ở phương thức index thì trong phương thức index sẽ phải nạp blog_model như sau:
PHP:
public function index()
{
    //Nạp model
    $this->load->model('blog_model');

    //Gọi phương thức get_last_ten và gán vào mãng $data
    $data['list_last_ten'] = $this->blog_model->get_last_ten();

    //Nạp view
    $this->load->view('blog-view', $data);
}
Ở ví dụ trên, ngoài cú pháp để nạp blog_model thì các bạn còn cần phải chú ý tới câu lệnh sau:
PHP:
$data['list_last_ten'] = $this->blog_model->get_last_ten();
Đây là câu lệnh gọi tới phương thức get_last_ten và gán cho $data['list_last_ten']. Như vậy, để gọi tới các phương thức được định nghĩa trong model, CodeIgniter đã thiết kế một cách gọi như sau:
Code:
$this->Tên_model->Tên_phương_thức();
Lưu ý, khi nạp model hoặc sử dụng model thì tên model phải viết chữ thường toàn bộ như ví dụ trên. Đây cũng là cách sử dụng chung cho các thư viện của CodeIgniter.

Để 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 DB mà tôi sẽ đề cập sau. Thư viện DB định nghĩa sẳn các phương thức tương tác an toàn với DB và có lẽ đây là một thư viện chứa nhiều phương thức nhất của CodeIgniter.

Các bạn có thể tìm hiểu thêm về models tại địa chỉ https://codeigniter.com/user_guide/general/models.html.
 
PHẦN 6: HELPERS

Những phần trước các bạn đã làm quen với CodeIgniter, chỉ với những phần trước các bạn đã có thể viết ứng dụng web của mình bằng CodeIgniter rồi. Ở phần này, tôi sẽ giới thiệu về các hàm trợ giúp (Gọi là helper) giúp cho công việc viết code của các 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 hàm đã được CodeIgniter (Hoặc người dùng) định nghĩa sẵn để sử dụng trong ứng dụng của mình một cách nhanh chóng. CodeIgniter đã cung cấp sẵn rất nhiều helper giúp các bạn làm việc với CodeIgniter nhanh chóng hơn nhiều, một vài helper được CodeIgniter định nghĩa và theo tôi các helper được sử dụng thường xuyên nhất đó là: url, form, language, captcha, email...

Việc sử dụng một helper rất đơn giản, trước tiên các bạn phải nạp helper cần sử dụng bằng cú pháp sau:
Code:
$this->load->helper('Tên_helper');
Ví dụ các bạn muốn nạp helper url trong phương thức index của controller blog, các bạn sẽ có đoạn mã lệnh như sau:
PHP:
public function index()
{
    //Nạp helper url
    $this->load->helper('url');
  
    //Gọi một hàm trong helper url
    echo site_url();
}
Như ví dụ trên, helper url được nạp bởi câu lệnh "$this->load->helper('url');" và hàm site_url trong helper url được sử dụng với lời gọi hàm bình thường mà các bạn biết trong PHP.

Các bạn cũng có thể nạp một lúc nhiều helper bằng cú pháp như sau:
Code:
$this->load->helper(array('Tên_helper_1', 'Tên_helper_2', 'Tên_helper_n'));
Ví dụ, các bạn muốn nạp các helper url, form, language các bạn sẽ có đoạn mã lệnh như sau:
PHP:
$this->load->helper(array('url', 'form', 'language'));
Các bạn lưu ý, tên helper phải được viết hoàn toàn bằng chữ thường.

Ngoài những helper do CodeIgniter định nghĩa sẵn (Và được lưu trong thư mục system/helpers) thì các bạn cũng có thể tự tạo ra các helper với quy tắc như sau:
  • Tên tập tin helper phải là chữ thường và có phần đuôi (Suffix) là "_helper". Ví dụ tôi muốn tạo một helper có tên là blog thì tôi sẽ tạo một tập tin 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 các bạn không nên can thiệp vào thư mục system của CodeIgniter).
  • Tất cả các hàm các bạn định nghĩa trong helper của các 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).
Các bạn có thể truy cập địa chỉ https://codeigniter.com/user_guide/helpers/index.html để xem danh sách các helper mà CodeIgniter cung cấp và tìm hiểu thêm về helpers tại địa chỉ https://codeigniter.com/user_guide/general/helpers.html.
 
PHẦN 7: LIBRARIES

CodeIgniter tạo ra các lớp chức năng giúp cho các bạn làm việc nhanh chóng với ứng dụng được gọi là library (Thư viện). Có thể xem library có vai trò giống với helper.

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

Việc sử dụng một library tương tự như sử dụng helper với cú pháp như sau:
Code:
$this->load->library('Tên_library');
Ví dụ, CodeIgniter đã định nghĩa sẵn library upload, bây giờ các bạn muốn sử dụng library upload trong phương thức index của controller blog, các bạn sẽ có đoạn mã lệnh như sau:
PHP:
public function index()
{
    $this->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 các bạn phải tìm hiểu về library đó. Tài liệu về các libary đã được CodeIgniter trình bày khá rõ ràng, các bạn có thể tham khảo tại địa chỉ https://codeigniter.com/user_guide/libraries/index.html. Về chi tiết cách sử dụng các library tôi sẽ hướng dẫn ở những phần sau.

Các bạn cũng có thể nạp một lúc nhiều library (Giống như helper) với cú pháp như sau:
Code:
$this->load->library(array('Tên_library_1', 'Tên_library_2', 'Tên_library_n'));
Ví dụ, tôi muốn nạp 2 library upload và cart thì tôi sẽ có đoạn mã lệnh như sau:
PHP:
$this->load->library(array('upload', 'cart'));
Các bạn cũng có thể tạo các library để thực hiện một việc gì đó với quy tắc sau:

- Tên tập tin phải trùng với tên của lớp (Kể cả chữ hoa và chữ thường hoặc dấu phân cách...). Ví dụ tôi muốn tạo library payment thì tôi sẽ tạo một tập tin có tên là Payment.php và lưu vào thư mục application/libraries. Tập tin Payment.php sẽ chứa lớp có tên là Payment.
- Tên của library là duy nhất (Không trùng với các library khác). Trường hợp các bạn override các library có sẵn của CodeIgniter thì các bạn cần thêm tiền tố (Prefix) "MY_" trước tên tập tin và tên lớp library. Tiền tố "MY_" được khai báo trong tập tin application/config/config.php tại dòng lệnh:
PHP:
$config['subclass_prefix'] = 'MY_';
Các bạn có thể khai báo tiền tố này theo ý của các bạn.

Để sử dụng các phương thức trong library đã được nạp, các bạn sử dụng theo cú pháp sau:
Code:
$this->Tên_library->Tên_phương_thức();
Lưu ý, tên library phải được viết hoàn toàn bằng chữ thường.

Ví dụ tôi gọi phương thức do_upload của library upload như sau:
PHP:
$this->upload->do_upload();
Các bạn có thể tìm hiểu thêm về libraries tại địa chỉ https://codeigniter.com/user_guide/general/libraries.html.
 
PHẦN 8: URI ROUTING

Thông thường thì CodeIgniter tạo ra một mối quan hệ 1 - 1 giữa URL với controller và phương thức theo kiểu "class/method". Cách phân đoạn của CodeIgniter có thể biểu diễn bởi URL ví dụ sau:
Code:
http://localhost/class/method/id
Với URL ví dụ trên thì chúng ta đang gọi tới controller tên là class với phương thức được gọi là method và biến id của method.

Đấy là cách gọi mặc định của CodeIgniter. Các bạn cũng đã biết, CodeIgniter 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 CodeIgniter cũng cung cấp một chức năng đó là routing (Định tuyến) giúp cho chúng ta có thể tùy biến URL một cách dễ dàng mà không nhất thiết phải theo khuôn mẫu như ví dụ trên.

Ví dụ, nếu các bạn có controller blog và phương thức là index thì URL mà các bạn truy cập sẽ phải là:
Code:
http://localhost/blog/index
Nhưng bây giờ tôi muốn đổi URL trên thành:
Code:
http://localhost/ca-nhan/danh-sach
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, các bạn có thể làm điều đó với routing. Với ví dụ trên thì các bạn sẽ có routing như sau:
PHP:
$route['ca-nhan/danh-sach'] = 'blog/index';
Để thiết kế routing này, CodeIgniter đã cung cấp một tập tin application/config/routes.php. Các bạn chỉ việc mở tập tin này lên và thêm vào mẫu routing trên.

Nội dung tập tin application/config/routes.php mặc định các bạn chỉ cần quan tâm tới 2 dòng lệnh sau:
PHP:
$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ì các bạn 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ì CodeIgniter sẽ gọi tới trang 404 mặc định.

Như vậy, với ví dụ trên thì tập tin application/config/routes.php sẽ có nội dung như sau:
PHP:
$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['ca-nhan/danh-sach'] = 'blog/index';
Như vậy, với controller blog và tập tin application/config/routes.php thì các bạn có thể truy cập controller blog bằng một trong hai cách sau:
Code:
http://localhost/blog/index
Hoặc
Code:
http://localhost/ca-nhan/danh-sach
Routing của CodeIgniter cho phép các bạn sử dụng các regular expressions của PHP. Ngoài ra, CodeIgniter 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ự ngoại trừ dấu gạch chéo "/".
Các bạn có thể tìm hiểu thêm về URI routing tại địa chỉ https://codeigniter.com/user_guide/general/routing.html.
 
PHẦN 9: DATABASE

CodeIgniter cung cấp rất nhiều phương thức hỗ trợ lập trình viên tương tác với DB nhanh chóng. Việc sử dụng các phương thức tương tác với DB cũng được chia làm 2 nhóm chính:
  • Nhóm thực thi câu SQL thuần.
  • Nhóm sử dụng query builder.
Tôi sẽ trình bày theo cách truy vấn SQL thuần trước để các bạn dễ nắm bắt vấn đề.

Để thực thi một câu lệnh SQL các bạn thực hiện như sau:
Code:
$this->db->query('Nội_dung_SQL');
CodeIgniter cung cấp sẵn cho các bạn việc khai báo các bảng dữ liệu có tiền tố (Prefix) và khi sử dụng các bạn có thể dễ dàng thay đổi tiền tố của bảng dữ liệu mà không cần thiết phải chỉnh sửa lại mã lệnh của các bạn.

Nếu các bạn có sử dụng tiền tố cho bảng dữ liệu, các bạn sẽ phải dùng câu lệnh sau để lấy tên bảng theo tiền tố đó như sau:
Code:
$this->db->dbprefix('Tên_bảng_dữ_liệu');
Ví dụ các bạn có bảng dữ liệu tên là tbl_blog (Với tiền tố là "tbl_") thì khi sử dụng các bạn chỉ việc gọi như sau:
PHP:
$this->db->dbprefix('blog');
Cậu lệnh trên sẽ tự động hiểu ngầm là các bạn đang dùng tới bản tbl_blog.

Nhược điểm của việc thực thi SQL theo kiểu này đó là khả năng bị tấn công SQL injection nên các bạn cần phải sử dụng thêm các phương thức sau để lọc dữ liệu đầu vào như sau:

1. $this->db->escape():

Phương thức này sẽ lọc các ký tự có thể gây ra lỗi SQL như dấu ` ' " ...

Khi sử dụng phương thức này thì sẽ tự động chèn dấu nháy đơn ở 2 đầu của chuổi nên các bạn không cần phải làm điều này.

Ví dụ:
PHP:
$sql = "INSERT INTO tbl_blog (title) VALUES(" . $this->db->escape($title) . ")";
2. $this->db->escape_str():

Phương thức này tương tự như phương thức "$this->db->escape()" chỉ khác là phương thức này sẽ không tự động thêm dấu nháy đơn.

Ví dụ:
PHP:
$sql = "INSERT INTO tbl_blog (title) VALUES('" . $this->db->escape_str($title) . "')";
Các bạn để ý thật kỹ 2 ví dụ trên các bạn sẽ thấy được sự khác biệt về việc sử dụng dấu nháy đơn.

3. $this->db->escape_like_str():

Phương thức này cũng có chức năng tương tự như 2 phương thức trên nhưng nó được sử dụng cho trường hợp LIKE.

Và vấn đề cuối cùng cho cách sử dụng này là sử dụng theo kiểu binding như sau:

Các bạn xem 2 dòng lệnh dưới đây:
PHP:
$sql = "SELECT * FROM tbl_blog WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(1, 'active', 'filiallion'));
Ở đây, tôi không gán trực tiếp "id = 1" hay "status = active" mà sẽ thay giá trị bằng dấu hỏi "?" và sẽ gán nó ở tham số thứ hai của "$this->db->query()" bằng một mãng giá trị và sắp xếp theo đúng thứ tự. Tức là câu SQL trên sẽ được dịch lại thành:
SQL:
SELECT * FROM tbl_blog WHERE id = 1 AND status = 'active' AND author = 'filiallion'
Với cách sử dụng này thì các bạn sẽ không cần phải sử dụng các hàm an toàn ở trên vì CodeIgniter đã xử lý giúp các bạn.

Ngoài cách sử dụng theo SQL thuần như trên thì CodeIgniter còn cung cấp rất nhiều phương thức giúp việc truy vấn SQL trở nên nhanh chóng và an toàn hơn gọi là query builder. Sau đây tôi sẽ trình bày với các bạn một số phương thức theo kiểu query builder để cập nhật dữ liệu như sau:

1. $this->db->insert():

CodeIgniter sẽ tự động tạo ra một chuỗi truy vấn để thêm mới dữ liệu vào DB thông qua một mãng dữ liệu đầu vào theo ví dụ:
PHP:
$data = array(
    'title' => 'title' ,
    'status' => 'active',
    'author' => 'filiallion'
);

$this->db->insert('tbl_blog', $data);
Khối lệnh trên tương ứng với câu lệnh SQL sau:
SQL:
INSERT INTO tbl_blog (title, status, author) VALUES ('title', 'active', 'filiallion')
Dữ liệu thêm mới có thể là một mãng hoặc một đối tượng đều được.

Nếu các bạn muốn thực hiện thêm mới nhiều dòng dữ liệu cùng lúc, các bạn có thể tìm hiểu thêm phương thức "$this->db->insert_batch()".

2. $this->db->update():

Các bạn xét ví dụ sau:
PHP:
$data = array(
    'title' => 'New title' ,
    'status' => 'inactive',
    'author' => 'Lê Trung Hiếu'
);

$this->db->where('id', 1);
$this->db->update('tbl_blog', $data);
Khối lệnh trên tương ứng với câu lệnh SQL sau:
SQL:
UPDATE tbl_blog SET title = 'New title', status = 'inactive', author = 'Lê Trung Hiếu' WHERE id = 1
Về điều kiện cập nhật, các bạn khai báo trong phương thức "$this->db->where()".

Dữ liệu cập nhật có thể là một mãng hoặc một đối tượng đều được.

3. $this->db->delete():

Các bạn xét ví dụ sau:
PHP:
$this->db->delete('tbl_blog', array('id' => 1));
Câu lệnh trên tương ứng với câu SQL sau:
SQL:
DELETE FROM tbl_blog WHERE id = 1
Ngoài cách truyền điều kiện xóa vào tham số thứ hai, các bạn còn có thể thực hiện điều kiện xóa bằng phương thức "$this->db->where()" như ví dụ sau:
PHP:
$this->db->where('id', 1);
$this->db->delete('tbl_blog');
Các bạn có thể tìm hiểu thêm về database tại địa chỉ https://codeigniter.com/user_guide/database/index.html.
 
PHẦN 10: SESSION

Về cơ bản, CodeIgniter lưu thông tin session lên cookie của trình duyệt web nhưng đó là cấu hình mặc định của CodeIgniter, CodeIgniter cũng cho phép các bạn lưu session vào DB.

Session được lưu trong DB sẽ giúp ứng dụng an toàn hơn bởi CodeIgniter chỉ lưu session ID trên cookie và sẽ so sánh ID này giữa cookie và trong DB để đảm bảo hợp lệ cho người dùng.

Các bạn cần lưu ý rằng, khi sử dụng session của CodeIgniter các bạn phải khai báo chuỗi mã hóa trong tập tin application/config/config.php như sau:
PHP:
$config['encryption_key'] = 'Chuỗi_mã_hóa';
Để sử dụng session các bạn phải nạp thư viện session bằng câu lệnh:
PHP:
$this->load->library('session');
Sau khi nạp thư viện session, các bạn sử dụng session thông qua các phương thức sau:

1. $this->session->set_userdata():

Phương thức này để tạo session với cú pháp:
Code:
$this->session->set_userdata('Tên_session', Giá_trị_session);
Phương thức này cũng cho phép các bạn tạo cùng lúc nhiều session thông qua một mãng dữ liệu như ví dụ sau:
PHP:
$data = array(
    'username' => 'filiallion',
    'email' => 'filiallion@gmail.com',
    'logged_in' => TRUE
);

$this->session->set_userdata($data);
Với khối lệnh trên, các bạn đã tạo ra 3 session là username, email và logged_in với các giá trị tương ứng như trên.

2. $this->session->userdata():

Phương thức này dùng để lấy session đã tạo ở phương thức "$this->session->set_userdata()" với cú pháp:
Code:
$this->session->userdata('Tên_session');
Hoặc
Code:
$this->session->Tên_session;
Ví dụ:
PHP:
$this->session->userdata('username');
Ngoài ra, các bạn cũng có thể lấy toàn bộ session đã được tạo bằng phương thức "$this->session->all_userdata()".

3. $this->session->unset_userdata():

Phương thức này dùng để xóa session với cú pháp:
Code:
$this->session->unset_userdata('Tên_session');
Ví dụ:
PHP:
$this->session->unset_userdata('username');
4. $this->session->set_flashdata():

CodeIgniter cung cấp thêm kiểu session thứ hai đó là flash session, tức là session chỉ tồn tại một lần sau khi tải lại trang và sẽ tự động mất đi mà không cần phải xoá.

Flash session thường được dùng để lưu các câu thông báo thao tác thành công, thất bại chẳng hạn...

Ví dụ:
PHP:
$this->session->set_flashdata('item', 'value');
5. $this->session->flashdata():

Phương thức này dùng để lấy flash session các bạn đã tạo theo phương thức "$this->session->set_flashdata()".

Ví dụ:
PHP:
$this->session->flashdata('item');
6. $this->session->sess_destroy():

Phương thức này dùng để hủy toàn bộ session các bạn đã tạo.

Các phương thức trên sẽ giúp các bạn thao tác dễ dàng và tiện lợi với session trong CodeIgniter. Như tôi đã nói ở trên là session của CodeIgniter mặt định được lưu trong cookie nhưng nếu các bạn muốn an toàn hơn các bạn sẽ phải lưu session vào DB.

Để lưu session vào DB, các bạn cần tạo một bảng dữ liệu lưu session theo cấu trúc được CodeIgniter cung cấp với khối lệnh SQL sau:
SQL:
CREATE TABLE IF NOT EXISTS `ci_sessions` (
    `id` varchar(40) NOT NULL,
    `ip_address` varchar(45) NOT NULL,
    `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
    `data` blob NOT NULL,
    PRIMARY KEY (id),
    KEY `ci_sessions_timestamp` (`timestamp`)
);
Như vậy, các bạn sẽ tạo một bảng dữ liệu tên là ci_sessions trong DB của các bạn với các trường dữ liệu như trên.

Bước tiếp theo là cấu hình lại tập tin application/config/config.php để CodeIgniter biết đang sử dụng session lưu trong DB như sau:
PHP:
$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions';
Các bạn có thể tìm hiểu thêm về session tại địa chỉ https://codeigniter.com/user_guide/libraries/sessions.html.
 
PHẦN 11: EMAIL

Các phần trước tôi đã hướng dẫn các bạn hầu hết các thành phần cần thiết để lập trình một website bằng CodeIgniter. Từ phần này, tôi sẽ hướng dẫn bổ sung một số thư viện thường dùng khi lập trình một website và trong số đó là lớp thư viện email.

Để sử dụng thư viện email, các bạn cần phải nạp thư viện email bằng câu lệnh sau:
PHP:
$this->load->library('email');
Và khai báo một số thông tin cần thiết như:
  • Người gửi.
  • Người nhận.
  • Tiêu đề.
  • Nội dung.
  • Và một số thông tin mở rộng khác.
Các bạn xem ví dụ sau:
PHP:
$this->load->library('email');

$this->email->from('sender@example.com','Sender Name');
$this->email->to('recipient@example.com');
$this->email->subject('Email subject');
$this->email->message('Email message');

$this->email->send();
Với khối lệnh trên, các bạn đã gửi đi một email bằng cách đơn giản nhất.

Tuy nhiên, trên thực tế các bạn gửi email như vậy có thể sẽ không thành công và phần lớn email sẽ vào spam. Hiện nay, các lập trình viên thường sử dụng giao thức SMTP để gửi email trong các website và CodeIgniter cũng cung cấp cho các bạn giao thức gửi email bằng SMTP phổ biến này.

Trước khi khai báo các thông tin để gửi email như ví dụ trên, các bạn cần phải khai báo một số thông tin cấu hình SMTP theo mẫu sau:
Code:
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'Tên_máy_chủ_SMTP';
$config['smtp_user'] = 'Tài_khoản_SMTP';
$config['smtp_pass'] = 'Mật_khẩu_SMTP';
$config['smtp_port'] = 'Cổng_SMTP';
$config['smtp_crypto'] = 'Kiểu_mã_hóa_SMTP';

$this->email->initialize($config);
Sau khi khai báo các thông tin cấu hình SMTP như trên, các bạn có thể viết các câu lệnh gửi email.

Ví dụ để gửi email bằng giao thức SMTP như sau:
PHP:
$this->load->library('email');

$config['protocol'] = 'smtp';
$config['smtp_host'] = 'smtp.example.com';
$config['smtp_user'] = 'sender@example.com';
$config['smtp_pass'] = '1234567890';
$config['smtp_port'] = '465';
$config['smtp_crypto'] = 'ssl';

$this->email->initialize($config);

$this->email->from('sender@example.com','Sender Name');
$this->email->to('recipient@example.com');
$this->email->subject('Email subject');
$this->email->message('Email message');

$this->email->send();
Các bạn có thể tìm hiểu thêm về lớp thư viện email tại địa chỉ https://codeigniter.com/user_guide/libraries/email.html.
 
PHẦN 12: FILE UPLOADING

Để sử dụng thư viện file uploading, các bạn trước tiên khai báo các thông tin cấu hình upload như sau:
Code:
$config['upload_path'] = 'Đường_dẫn_lưu_tập_tin_upload';
$config['allowed_types'] = 'Phần_mở_rộng_được_phép_upload';
$config['max_size'] = Dung_lượng_tập_tin_tối_đa_được_phép_upload;
Sau đó, các bạn nạp thư viện file uploading và nạp cấu hình ở trên như sau:
PHP:
$this->load->library('upload', $config);
Thực hiện upload và lấy dữ liệu trả về khi upload thành công hoặc thông báo lỗi nếu thất bại:
PHP:
if ($this->upload->do_upload()) {
    $data = $this->upload->data();
} else {
    $error = $this->upload->display_errors();
}
Bây giờ, tôi sẽ hướng dẫn các bạn tạo một trang upload hoàn chỉnh với các bước dưới đây:

1. Tạo controller upload:
PHP:
<?php
class Upload extends CI_Controller
{
    public function index()
    {
        $this->load->view('upload');
    }
    
    public function do_upload()
    {
        $config['upload_path'] = './userfiles/';
        $config['allowed_types'] = 'jpg|png|gif';
        $config['max_size'] = 1024;
        
        $this->load->library('upload', $config);
        
        if ($this->upload->do_upload('file')) {
            $data = array(
                'data' => $this->upload->data()
            );
            
            $this->load->view('upload', $data);
        } else {
            $data = array(
                'error' => $this->upload->display_errors()
            );
            
            $this->load->view('upload', $data);
        }
    }
}
2. Tạo giao diện với form HTML để upload:
PHP:
<?php
if (isset($data)) {
    foreach ($data as $key => $value) {
        echo '<p>' . $key . ': ' . $value . '</p>';
    }
} elseif (isset($error)) {
    echo $error;
}
?>

<form name="upload" method="post" enctype="multipart/form-data" action="upload/do_upload">
    <p>
        <input type="file" name="file">
    </p>
    <p>
        <input type="submit" value="Upload">
    </p>
</form>
3. Tạo thư mục tên là userfiles ở thư mục gốc của website (Cùng cấp với tập tin index.php) để chứa tập tin upload.

Các bạn truy cập trang upload, ví dụ như http://localhost/upload để kiểm tra.

Các bạn có thể tìm hiểu thêm về thư viện file uploading tại địa chỉ https://codeigniter.com/user_guide/libraries/file_uploading.html.
 
PHẦN 13: PAGINATION

Phân trang là một phần không thể thiếu khi lập trình một website. CodeIgniter cung cấp riêng một thư viện để các bạn phân trang được gọi là pagination.

Các bạn xem ví dụ sau đây:
PHP:
$this->load->library('pagination');

$config['base_url'] = 'http://localhost/blog/page/';
$config['total_rows'] = 200;
$config['per_page'] = 20;

$this->pagination->initialize($config);

echo $this->pagination->create_links();
Ví dụ trên thực hiện phân trang cho blog với tổng số dòng dữ liệu là 200, số dòng trên một trang là 20 và biến lưu trang tôi đặt tên là page.

Để sử dụng thư viện pagination trước tiên các bạn cũng phải nạp thư viện này bằng câu lệnh:
PHP:
$this->load->library('pagination');
Khai báo một số thông tin cấu hình bắt buộc như ví dụ trên:
  • base_url: URL dùng để phân trang. Các bạn lưu ý ở ví dụ trên, mẫu URL http://localhost/blog/page/ các bạn phải khai báo route thì URL này mới hoạt động.
  • total_rows: Tổng số dòng dữ liệu các bạn sẽ hiển thị trên các trang. Phần này các bạn sẽ phải viết một phương thức trong model để đếm.
  • per_page: Số dòng dữ liệu trên một trang.
  • Ngoài ra, còn nhiều thông tin khác các bạn có thể tìm hiểu thêm.
Nạp các thông tin cấu hình đã khai báo bằng câu lệnh:
PHP:
$this->pagination->initialize($config);
Trong đó, biến $config là một mãng các cấu hình phân trang.

Và cuối cùng kết quả phân trang sẽ được trả về dưới dạng HTML bằng câu lệnh:
PHP:
$this->pagination->create_links();
Các bạn sẽ nhận kết quả này và gán vào một biến rồi truyền ra ngoài view để hiển thị ở vị trí các bạn muốn.

Thư viện pagination cung cấp cho các bạn nhiều khai báo cấu hình để điều khiển phân trang theo ý lập trình kể cả việc thay đổi giao diện HTML mà thư viện trả về.

Các bạn có thể tìm hiểu thêm về thư viện pagination tại địa chỉ https://codeigniter.com/user_guide/libraries/pagination.html.
 
PHẦN 14: SHOPPING CART

Đối với các bạn muốn phát triển hoàn thiện một website bán hàng trực tuyến thì chức năng giỏ hàng là không thể thiếu. CodeIgniter cung cấp cho các bạn lập trình viên thư viện giỏ hàng (Cart) để giúp việc phát triển giỏ hàng cho website được nhanh chóng và tốt hơn.

Các bạn lưu ý là theo khuyến cáo của nhà phát triển CodeIgniter thì thư viện cart này sẽ bị loại bỏ sau này.

Cũng như các thư viện khác, trước khi sử dụng các bạn phải nạp thư viện bằng câu lệnh:
PHP:
$this->load->library('cart');
Trước tiên tôi sẽ hướng dẫn các bạn thực hiện thêm một sản phẩm vào giỏ hàng như ví dụ sau:
PHP:
$data = array(
    'id' => 'sku_123ABC',
    'qty' => 1,
    'price' => 39.95,
    'name' => 'T-Shirt',
    'options' => array(
        'Size' => 'L',
        'Color' => 'Red'
    )
);

$this->cart->insert($data);
Với khối lệnh trên thì các bạn đã thêm vào giỏ hàng một sản phẩm với các thông tin như trên.

Các thành phần của mãng dữ liệu bao gồm:
  • id: ID của sản phẩm.
  • qty: Số lượng sản phẩm.
  • price: Giá sản phẩm.
  • name: Tên sản phẩm.
  • options: Các tùy chọn thông tin của sản phẩm.
Các bạn cũng có thể thêm nhiều sản phẩm vào giỏ hàng cùng lúc như ví dụ sau:
PHP:
$data = array(
    array(
        'id' => 'sku_123ABC',
        'qty' => 1,
        'price' => 39.95,
        'name' => 'T-Shirt',
        'options' => array(
            'Size' => 'L',
            'Color' => 'Red'
        )
    ),
    array(
        'id' => 'sku_567XYZ',
        'qty' => 2,
        'price' => 9.95,
        'name' => 'Coffee Mug'
    )
);

$this->cart->insert($data);
Với khối lệnh trên thì các bạn đã thêm vào giỏ hàng 2 sản phẩm.

Tiếp theo, các bạn sẽ hiển thị danh sách sản phẩm trong giỏ hàng khi khách hàng duyệt giỏ hàng như sau:
PHP:
$i = 1;

foreach ($this->cart->contents() as $items) {
    echo $items['qty'];
    echo $items['name'];
    
    if ($this->cart->has_options($items['rowid']) == TRUE) {
        foreach ($this->cart->product_options($items['rowid']) as $option_name => $option_value) {
            echo $option_name . ': ' . $option_value;
        }
    }
    
    echo $this->cart->format_number($items['price']);
    echo $this->cart->format_number($items['subtotal']);
    
    $i++;
}
Các bạn lưu ý là khối lệnh trên các bạn sẽ trình bày ngoài view và có giao diện phù hợp. Ở đây tôi chỉ trình bày cho các bạn các thông tin mà thư viện cart lưu trữ thôi.

Trong quá trình mua hàng, khách hàng có thể cập nhật lại số lượng cần mua. CodeIgniter cũng cung cấp cho các bạn chức năng cập nhật này như ví dụ sau:
PHP:
$data = array(
    'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
    'qty' => 3
);

$this->cart->update($data);
Như các bạn thấy ở trên, phần tử rowid chứa thông tin là ID của sản phẩm trong giỏ hàng (Khác với ID của sản phẩm lưu trong DB) nên khi cập nhật số lượng của sản phẩm nào trong giỏ hàng thì các bạn khai báo rowid tương ứng của sản phẩm đó.

Các bạn cũng có thể sử dụng phương thức update ở trên để xóa một (Hoặc nhiều) sản phẩm ra khỏi giỏ hàng bằng cách khai báo phần tử "qty = 0".

Lưu ý với các bạn là thư viện cart sử dụng session để lưu trữ nên các thông tin liên quan tới giỏ hàng đều được lưu trong session. Việc này đồng nghĩa rằng khi các bạn gọi sử dụng thư viện cart thì thư viện session cũng sẽ được nạp tự động.

Các bạn có thể tìm hiểu thêm về thư viện shopping cart tại địa chỉ https://codeigniter.com/user_guide/libraries/cart.html.

Như vậy, tới đây tôi đã kết thúc loạt bài viết "Tìm hiểu CodeIgniter framework". Hi vọng rằng loạt bài viết này sẽ giúp ích được cho các bạn bước đầu mới làm quen với CodeIgniter framework nói riêng cũng như PHP framework nói chung.

Mọi vấn đề liên quan tới loạt bài hướng dẫn này, các bạn vui lòng gửi bình luận tại đây.

Chân thành cảm ơn sự quan tâm của các bạn!
 
Back
Top