Smarty là một hệ thống tạo mẫu web (web template system) được
viết trên nền PHP. Smarty được giới thiệu như là một công cụ cho việc
chia nhỏ các quá trình thiết kế trang web. Đây là một chiến lược thiết
kế cho các ứng dụng web hiện đại. Smarty tạo ra các nội dung web từ các
vị trí đặc biệt được gọi là smarty tag. Các tag này được nằm trong các
mẫu (template). Các tag này sẽ được xử lý và chèn vào với các code khác
nhau.
Các tag này là chỉ thị cho Smarty mà có thể được bao đóng bới tag mở
và tag khóa. Những hướng dẫn này có thể là biến, và được định nghĩa bởi
dấu dollar ($), các chức năng, hàm logic hoặc các luồng điều khiển.
Smarty cho phép các lập trình viên có thể tự định nghĩa các chức năng và
truy cập sử dụng các Smarty tags Smarty là kết quả của việc tối ưu hóa
và phân luồng công việc, cho phép trình diễn các trang web bằng cách
chia nhỏ chúng ở đầu cuối (back-end). Ý tưởng đó đã giúp giảm thiểu rất
nhiều giá thành và sự đồ sộ của các phần mềm. Dưới mỗi một ứng dụng
thành công thì luôn phân chia thành 2 mảng là người thiết kế chính là lá
chắn bảo về mã nguồn sau (back-end coding) và người lập trình php được
bảo vệ bới mã trình diễn. Smarty hỗ trợ một vài ngôn ngữ lập trình bậc
cao, bao gồm:
- điều khiển luồng dữ liệu, foreach
- if, elseif, else
- biến thay đổi
- Người dùng tạo chức năng
Bên cạnh đó, thì một trong những chức năng nổi bật của các Template
Engine là hệ thống tạo mẫu cho phép thay đổi từ mẫu tới mẫu. Thông
thường khi lập trình PHP bạn hay viết lẫn cả phần HTML với mã lệnh PHP
trên một trang. Điều này sẽ dẫn đến rất rối nhất là khi bảo trì. Bạn là
người viết ra và cũng là người bảo trì thì không sao nhưng nếu bạn viết
ra sau đó người khác bảo trì. Chắc họ nhìn vào code của bạn họ sẽ ngất
mất vì quá rối. Mặt khác khi làm nhiều trang web có chức năng như nhau.
Chỉ khác giao diện nên nếu lập trình theo kiểu như vậy bạn phải viết lại
hoàn toàn. Ngoài ra muốn code được bạn phải chờ người thiết kế giao
diện cho bạn sau đó cắt ra file HTML... rồi mới code... Tất cả những
điều này sẽ làm giảm năng xuất công việc của bạn đi rất nhiều. Smarty ra
đời đã giải quyết được các vấn đề nêu trên. Dưới đây là một số ưu điểm
của Smarty:
1.Tốc độ load trang rất nhanh (do tạo được cache)
2.Code ứng dụng của bạn trở lên trong sáng, mạch lạc và dễ bảo trì hơn rất nhiều (do tách biệt phần code và templates).
3.Hiệu quả công việc đạt tối đa (Người thiết kế và người lập trình
làm việc hoàn toàn độc lập. Thay đổi giao diện website nhanh chóng...)
4.Được sử dụng phổ biến (bên Nhật rất ưa chuộng Smarty)
Để 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:
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.
