Tích hợp Smarty vào CodeIgniter
Ngày 12 tháng 4 năm 2013
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_id, null, !$return, TRUE);
}
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 */
-
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:Chạy khi lên production:PHP Code:$this->caching = Smarty::CACHING_OFF;
$smarty->setCompileCheck(false);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:Hãy thử và cảm nhận ;)PHP Code:$cache_id = $template. "_" . md5(json_encode($data));
$compile_id = null; -
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:Thay vì kiểu truyền thống của CI: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");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...