Tích hợp Smarty vào CodeIgniter

Ngày 12 tháng 4 năm 2013 Trương Chương Dương
Smarty là một công cụ vô cùng hữu ích cho việc xử lý view trong mô hình MVC, và nó là thứ hầu như không thể thiếu được cho những người lập trình web UI chuyên nghiệp.

Với cơ chế render đặc biệt cộng với chế độ hỗ trợ cache cực kỳ tiện lợi và nhanh gọn, smarty là công cụ tuyệt vời để tiết kiệm thời gian code và tăng tốc xử lý cho website của bạn.

Cụ thể smarty là gì thì mọi người xem ở đây (mình không nhắc lại do nó khá dài):
http://vi.wikipedia.org/wiki/Smarty
http://www.ttv.vn/What-is-Smarty-Smarty-la-gi.html

Để tích hợp smarty vào CI, bạn hãy làm các bước sau:

1. Download smarty ở đây http://www.smarty.net/
2. Bạn giải nén file đã download sẽ được thư mục Smarty-3.1.13 (các con số tuỳ phiên bản của smarty, mình đang dùng phiên bản số 3.1.13)
3. Copy thư mục đa giải nén vào trong thư mục application/third_party. Lúc này bạn có Smarty.class.php ở vị trí như sau: application/third_party/Smarty-3.1.13/libs/Smarty.class.php (nhớ kiểm tra lại để bảo đảm điều này là chính xác nhé).
4. Trong thư mục application/libraries bạn thêm file Core_smarty.php với nội dung code như sau:
PHP Code:
<?php
if (!defined('BASEPATH'))
    exit(
'No direct script access allowed');
/**
 * Core_Smarty Class
 *
 * @package    CodeIgniter
 * @subpackage    Libraries
 * @category    Parser
 * @author    Truong Chuong Duong
 * @copyright    Copyright (c) 2012, Truong Chuong Duong. (http://chuongduong.net/)
 * @license    http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
 * @link    http://chuongduong.net
 * @email    info@chuongduong.net
 * @since    Version 0.1
 */
/**
 * See http://www.smarty.net/docs/en/installing.smarty.extended.tpl.
 */

require APPPATH '/third_party/Smarty-3.1.13/libs/Smarty.class.php';

class 
Core_Smarty extends Smarty {
   
    
$templateExt "php";

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

        
/* GHI CHU 1 */
        
$this->caching Smarty::CACHING_LIFETIME_CURRENT;
        
$smarty->setCompileCheck(false);
        
$this->setCompileDir(APPPATH 'cache' DS "smarty" DS "compile" DS);
        
$this->setCacheDir(APPPATH 'cache' DS "smarty" DS "cache" DS);
        
$this->setTemplateDir(APPPATH 'views' DS);
    }

    
/**
     * Parse a template
     *
     * Parses pseudo-variables contained in the specified template view,
     * replacing them with the data in the second param
     *
     * @param    string
     * @param    array
     * @param    bool
     * @return    string
     */
    
public function parse($template$data = array(), $return FALSE) {
        if (!empty(
$data)) {
            foreach (
$data as $key => $val) {
                
$this->assign($key$val);
            }
        }

        
/* GHI CHU 2 */
        
$cache_id $template"_" md5(json_encode($data));
        
$compile_id null;
        
        return 
$this->fetch("$template.$this->templateExt"$cache_id$compile_idnull, !$returnTRUE);
    }

    public function 
display($template NULL$cache_id NULL$compile_id NULL$parent NULL) {
        return 
$this->parse($template);
    }

    
/* GHI CHU 3 */
    
public function __set($key$value) {
        
$this->assign($key$value);
    }

}


/* GHI CHU 4 */
//Auto init and replace the default parser

$CI = & get_instance();
$CI->parser = new Core_Smarty();
$CI->view = &$CI->parser;

/* End of file Core_smarty.php */
Trong đó, bạn lưu ý một số đoạn mình có thêm chữ GHI CHU X. Cụ thể:
  • GHI CHÚ 1: Đây là đoạn khởi tạo chế độ lưu cache của smarty, nhược điểm của smarty là render chậm (như bất kỳ library render view nào khác) nên tối ưu cache sẽ tăng tốc website của bạn lên rất nhiều. Cụ thể phần này các bạn xem ở đây http://www.smarty.net/docs/en/caching.tpl
    Để đơn giản, hãy lựa chọn các kiểu hình mẫu sau:
    Chạy khi bạn đang viết code:
    PHP Code:
            $this->caching Smarty::CACHING_OFF;
            
    $smarty->setCompileCheck(false); 
    Chạy khi lên production:
    PHP Code:
            $this->caching Smarty::CACHING_LIFETIME_CURRENT;
            
    $smarty->setCompileCheck(false); 
  • GHI CHÚ 2: Do để tối ưu tốc độ tạo và kiểm tra cache nên nếu bạn chỉ có một lượng thay đổi nhỏ dữ liệu thì smarty sẽ không render lại mà nó trả về cái đã cache luôn nên kết quả có thể không như mong muốn. Ví dụ bạn render cái view tên là menu.tpl, trước khi login cũng cái menu này những sẽ có link "Login", sau khi login thì sẽ đổi thành "Logout". Tuy nhiên như thông thường, smarty sẽ trả về cả 2 đều có link "Login" do nó đã cache rằng view "menu.tpl" sẽ có kết quả là như lần đầu.
    Để tránh lỗi sai này mình đã thêm các dòng sau nhằm xác định chính xác liệu dữ liệu có thay đổi không, với mỗi dữ liệu + view tương ứng sẽ có một file cache tương ứng:
    PHP Code:
            $cache_id $template"_" md5(json_encode($data));
            
    $compile_id null
    Hãy thử và cảm nhận ;)
  • GHI CHÚ 3, GHI CHÚ 4: Mình viết phương thức này nhằm phục vụ cho những bạn đã quen hay thích phong cách assign biến vào view kiểu như của Zend thay vì quăng vào array truyền thống của CI. Cụ thể lúc này trong controller bạn có thể viết như sau:
    PHP Code:
    $this->view->bienRaView "value 1";
    $this->view->bienRaView2 = array("item 1""item 2");

    $this->view->render("view");
    //hoặc
    //$this->view->display("view");
    //$this->parser->render("view");
    //$this->parser->display("view"); 
    Thay vì kiểu truyền thống của CI:
    PHP Code:
    $data['bienRaView'] = "value 1";
    $data['bienRaView2'] = array("item 1""item 2");

    $this->view->render("view"$data); 

5. Để tự động load smarty, bạn tìm file application/config/autoload.php
Bổ sung core_smarty vào autoload libraries, lưu ý phân biệt hoa thường, tên ở đây phải hoàn toàn trùng khớp với tên file và tên class đã tạo.
$autoload['libraries'] = array('Core_smarty');

6. Vậy là xong. Bây giờ smarty đã sẵn sàng cho bạn.
Đang tải dữ liệu...