Tìm hiểu CodeIgniter framework

filiallion

Thành viên thân thiết
Thành viên thân thiết
Tham gia
22/10/2014
Bài viết
136
Sau khi các bạn đọc và học theo hai bài hướng dẫn về lập trình từ PHP cơ bản đến PHP nâng cao của tôi thông qua việc hoàn thiện 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.

Bài hướng dẫn này được đăng trên trang Facebook của tôi tại địa chỉ https://facebook.com/gextend.net. Mọi thắc mắc, hỏi đáp các bạn vui lòng phản hồi trên trang Facebook của tôi hoặc chát với tôi qua Messenger để được hỗ trợ sớm nhất. Tại topic này, tôi chỉ ưu tiên việc đăng bài chứ không hỗ trợ các bạn.

Trong quá trình theo dõi bài hướng dẫn các bạn có thể tham gia đóng góp ý kiến để bài viết ngày càng hoàn thiện hơn.

Chân thành cảm ơn sự quan tâm của các bạn!
 
Hiệu chỉnh:
GIỚI THIỆU (PHẦN 1)

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://www.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 tháng 02 năm 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.0 được công bố chính thức vào ngày 30 tháng 03 năm 2015.

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:

- 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 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.
- 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, v.v..). 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.0 hiện tại yêu cầu phiên bản PHP 5.4+. Tuy nhiên, CodeIgniter 3.0 vẫn "hoạt động được" với phiên bản PHP 5.2.4+ 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.
 
CÀI ĐẶT VÀ CẤU HÌNH (PHẦN 2)

Để 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://www.codeigniter.com/download (Tải phiên bản 3.0).
2. Giải nén gói CodeIgniter bạn sẽ được ba thư mục application, system, user_guide và file 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 hai thư mục application, system và file index.php (Đây là gói thư viện CodeIgniter).
3. Copy hai 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 CodeIgniter vào thư mục www.
4. Truy cập địa chỉ https://localhost. Nếu hiện ra trang welcome của CodeIgniter thì bạn đã cài đặt thành công bước đầu.
5. Để khai báo thông tin kết nối đến cơ sở dữ liệu (DB), các bạn mở file application/config/database.php và khai báo các thông tin sau:

- $db['default']['hostname']: Tên host của cơ sở dữ liệu.
- $db['default']['username']: Tài khoản 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.
- $db['default']['database']: Tên cơ sở dữ liệu.
- $db['default']['dbdriver']: Trình điều khiển cơ sở dữ liệu (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']: Prefix của các bảng dữ liệu (Ví dụ tbl_).
- $db['default']['pconnect']: Kết nối DB sử dụng pconnect (Nên khai báo TRUE).
- $db['default']['swap_pre']: Chuỗi thay thế cho dbprefix khi viết SQL (Ví dụ {PRE}).

Ví dụ tôi tạo DB có tên "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 file application/config/database.php như sau:
PHP:
$db['default'] = array(
 'dsn' => '',
 'hostname' => 'localhost',
 'username' => 'root',
 'password' => '',
 'database' => 'codeigniter_1',
 'dbdriver' => 'mysql',
 'dbprefix' => '',
 'pconnect' => TRUE,
 'db_debug' => TRUE,
 'cache_on' => FALSE,
 'cachedir' => '',
 'char_set' => 'utf8',
 'dbcollat' => 'utf8_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 dbprefix và cũng không bật cache.

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 CodeIgniter framework. Các cấu hình khác bạn có thể tìm hiểu thêm hoặc phản hồi lại tôi sẽ giải đáp cho các bạn.
 
URLS (PHẦN 3)

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, phương thức và tham số.

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:

https://localhost/news/title-news

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:
PHP:
$config['enable_query_strings'] = TRUE;

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

https://localhost/index.php/class/function/id

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

- Segment class được CodeIgniter gọi tới controller tên là class (class cũng chính là một lớp).
- Segment function được CodeIgniter gọi tới phương thức tên là function của lớp class ở trên.
- Segment 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 segment của URL, CodeIgniter đã xây dựng sẳn các helper giúp bạn làm việc với các segment một 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 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 file .htaccess như sau:
Mã:
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 sau:

https://localhost/class/function/id

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

https://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 file application/config/config.php:
PHP:
$config['url_suffix'] = '.html';

Trong trường hợp bạn sử dụng kiểu URL truyền thống (Query string). Lúc đó, URL của chúng ta sẽ trở thành:

https://localhost/index.php?c=class&m=function&id=id

Khi đó bạn chỉ việc lấy giá trị các biến truyền trên URL bằng $_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://www.codeigniter.com/user_guide/general/urls.html.
 
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 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:

https://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 file 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, bạn sẽ gọi controller này với URL như sau:

https://localhost/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 controller:

- File 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à bạn thấy (Blog) và controller phải được extends lớp CI_Controller.

Bạn thấy với controller blog trên, ta chỉ cần truy cập URL https://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 bạn đ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 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:

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

https://localhost/blog/comments/30

Lúc này, kết quả sẽ là:
Mã:
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ư ta đã 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://www.codeigniter.com/user_guide/general/controllers.html.
 
VIEWS (PHẦN 5)

View là một trang HTML trình bày giao diện như header, footer, sidebar... Bạn hiểu đơn giản, view chỉ là những file PHP chứa mã HTML định hình trang web (Có chèn code PHP để trình bà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à 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à ta thường biết tới.

Tạo file view cho controller blog ở phần 4 với nội dung như sau:
Mã:
<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 và tên file phải hoàn toàn là chữ thường. Như vậy, với file 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. Để gọi view từ controller, bạn sử dụng cú pháp lệnh:
Mã:
$this->load->view('Tên_view');

Tại phương thức index của controller blog, bạn chỉnh lại như sau:
PHP:
public function index()
{
 $this->load->view('blog-view');
}

Khi bạn truy cập địa chỉ sau:

https://localhost/blog

Kết quả sẽ là:

Welcome to my Blog!

Bạn cũng có thể load 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 bạn tạo view bên trong thư mục con của thư mục application/views, bạn có thể sử dụng cú pháp lệnh sau để gọi view:
Mã:
$this->load->view('Thư_mục_con/Tên_view');

ví dụ tôi đặt file blog-view.php ở trên trong thư mục application/views/blog, tôi sẽ điều chỉnh lại lệnh load 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 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 (File application/controllers/Blog.php) như sau:
PHP:
<?php
class Blog extends CI_Controller {
 function index()
 {
 //Gán dữ liệu
 $data['title'] = 'Tiêu đề website';
 $data['messagge'] = 'Hello word!';
 
 //Load view
 $this->load->view('blog-view', $data);
 }
}

Nội dung view blog (File application/views/blog-view.php) như sau:
PHP:
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
 <?php echo $messagge; ?>
</body>
</html>

Khi bạn truy cập địa chỉ sau:

https://localhost/blog

Kết quả sẽ là:

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 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 tìm hiểu thêm về views tại địa chỉ https://www.codeigniter.com/user_guide/general/views.html.
 
Hiệu chỉnh:
MODELS (PHẦN 6)

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:
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 hay 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 file 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ó file application/models/Blog_model.php. Ngoài ra, lớp model phải extends 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 bạn phải load model đó với cú pháp lệnh sau:
Mã:
$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 load blog_model như sau:
PHP:
public function index()
{
 //Load blog_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();
 
 //Load view
 $this->load->view('blog-view', $data);
}

Trong ví dụ trên, ngoài cú pháp để load 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:
Mã:
$this->Tên_model->Tên_phương_thức();

Lưu ý, khi load 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 tìm hiểu thêm về models tại địa chỉ https://www.codeigniter.com/user_guide/general/models.html.
 
Hiệu chỉnh:
HELPERS (PHẦN 7)

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 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 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 bạn phải load helper cần sử dụng bằng cú pháp sau:
Mã:
$this->load->helper('Tên_helper');

Ví dụ bạn muốn load helper url trong phương thức index của controller blog, bạn sẽ có đoạn code như sau:
PHP:
public function index()
{
 //Load 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 load 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à chúng ta vẫn biết trong PHP.

Các bạn cũng có thể load một lúc nhiều helper bằng cú pháp lệnh như sau:
Mã:
$this->load->helper(array('Tên_helper_1', 'Tên_helper_2', 'Tên_helper_n'));

Ví dụ, bạn muốn load các helper url, form, language bạn sẽ có cú pháp 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 file helper phải là chữ thường và có phần đuôi (Subfix) 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 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 CodeIgniter).
- 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).

Các bạn có thể truy cập địa chỉ https://www.codeigniter.com/user_guide/helpers/index.html để xem danh sách các helper mà CodeIgniter cung cấp sẳn và tìm hiểu thêm về helpers tại địa chỉ https://www.codeigniter.com/user_guide/general/helpers.html.
 
LIBRARIES (PHẦN 8)

CodeIgniter tạo ra các lớp chức năng giúp cho 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 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:
Mã:
$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 code 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 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://www.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ể load một lúc nhiều library (Giống như helper) với cú pháp như sau:
Mã:
$this->load->library(array('Tên_library_1', 'Tên_library_2', 'Tên_library_n'));

Ví dụ, tôi muốn load hai library upload và cart thì tôi sẽ có cú pháp 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 file 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 file có tên là Payment.php và lưu vào thư mục application/libraries. File 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 bạn override các library có sẳn của CodeIgniter thì bạn cần thêm tiền tố (Prefix) MY_ trước tên file và tên lớp library. Tiền tố MY_ được khai báo trong file 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 load, các bạn sử dụng theo cú pháp sau:
Mã:
$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 tìm hiểu thêm về libraries tại địa chỉ https://www.codeigniter.com/user_guide/general/libraries.html.
 
URI ROUTING (PHẦN 9)

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 ví dụ sau:

https://localhost/class/method/id

Với 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ông 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à:

https://localhost/blog/index

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

https://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 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 hai 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ì file 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à file routes.php trên thì các bạn có thể truy cập controller blog bằng một trong hai cách sau:

https://localhost/blog/index

Hoặc

https://localhost/ca-nhan/danh-sach

Routing của CodeIgniter cho phép bạn sử dụng các regular expressions của PHP. Ngoài ra, CodeIgniter cũng cung cấp hai 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 tìm hiểu thêm về URI routing tại địa chỉ https://www.codeigniter.com/user_guide/general/routing.html.
 
DATABASE (PHẦN 10)

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 hai 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:
Mã:
$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ó prefix (Tiền tố) và khi sử dụng các bạn có thể dễ dàng thay đổi prefix của bảng dữ liệu mà không cần thiết phải chỉnh sửa lại code của mình.

Nếu các bạn có sử dụng prefix 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 prefix đó như sau:
Mã:
$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 prefix 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 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ỹ hai 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ư hai 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 hai 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:
Mã:
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. Insert:

CodeIgniter sẽ tự động tạo ra một chuỗi truy vấn để insert 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:
Mã:
INSERT INTO tbl_blog (title, status, author) VALUES ('title', 'active', 'filiallion')

Dữ liệu insert 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 insert 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. 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:
PHP:
UPDATE tbl_blog SET title = 'New title', status = 'inactive', author = 'Lê Trung Hiếu' WHERE id = 1

Về điều kiện update, các bạn khai báo trong phương thức $this->db->where().

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

3. 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:
Mã:
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 tìm hiểu thêm về database tại địa chỉ https://www.codeigniter.com/user_guide/database/index.html.
 
SESSION (PHẦN 11)

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 file application/config/config.php như sau:
Mã:
$config['encryption_key'] = 'Key_mã_hóa';

Để sử dụng session các bạn phải load thư viện session bằng câu lệnh:
PHP:
$this->load->library('session');

Sau khi load 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:
Mã:
$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 ba 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:
Mã:
$this->session->userdata('Tên_session');

Hoặc
Mã:
$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:
Mã:
$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 unset.

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:
Mã:
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 file 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 tìm hiểu thêm về session tại địa chỉ https://www.codeigniter.com/user_guide/libraries/sessions.html.
 
EMAIL CLASS (PHẦN 12)

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 load thư viện email bằng câu lệnh:
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 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 như sau:
PHP:
$config['protocol'] = 'smtp';
$config['smtp_host'] = 'Tên_server_mail';
$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.gmail.com';
$config['smtp_user'] = 'sender@gmail.com';
$config['smtp_pass'] = '1234567890';
$config['smtp_port'] = '465';
$config['smtp_crypto'] = 'ssl';

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

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

$this->email->send();

Các bạn tìm hiểu thêm về email class tại địa chỉ Email Class — CodeIgniter 3.0.3 documentation.
 
FILE UPLOADING CLASS (PHẦN 13)

Để 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:
Mã:
$config['upload_path'] = 'Đường_dẫn_lưu_file_upload';
$config['allowed_types'] = 'Phần_mở_rộng_được_phép_upload';
$config['max_size'] = Dung_lượng_file_tối_đa_được_phép_upload;

Sau đó, các bạn load 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'] = './userfile/';
 $config['allowed_types'] = 'gif|jpg|png';
 $config['max_size'] = 1024;
 
 $this->load->library('upload', $config);
 
 if($this->upload->do_upload('userfile'))
 {
 $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 view 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="userfile">
 </p>
 <p>
 <input type="submit" value="Upload">
 </p>
</form>

3. Tạo thư mục tên là userfile ở thư mục gốc của website (Cùng cấp với file index.php) để chứa file upload.

Các bạn truy cập địa chỉ https://localhost/upload để kiểm tra.

Các bạn tìm hiểu thêm về file uploading class tại địa chỉ https://www.codeigniter.com/user_guide/libraries/file_uploading.html.
 
PAGINATION CLASS (PHẦN 14)

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'] = '[URL]https://localhost/blog/page/[/URL]';
$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 load 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: Link phân trang. Các bạn lưu ý ở ví dụ trên, mẫu đường link https://localhost/blog/page/ các bạn phải khai báo route thì link 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:
Mã:
$this->pagination->initialize(Mãng_cấu_hình);

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 tìm hiểu thêm về pagination class tại địa chỉ https://www.codeigniter.com/user_guide/libraries/pagination.html.
 
SHOPPING CART CLASS (PHẦN 15)

Đố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ũng như các thư viện khác, trước khi sử dụng các bạn phải load 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_567ZYX',
 '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 hai 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 gọi tự động.

Các bạn tìm hiểu thêm về shopping cart class tại địa chỉ https://www.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 ở các phần tương ứng.

Chân thành cảm ơn sự quan tâm của các bạn!
 
Cho các bạn quan tâm!
 
×
Quay lại
Top