Getting Started with Zend Framework
Nghe nói về Zend Framework (ZF) rất nhiều nhưng không hề muốn động vào nó tý nào :p Cũng chẳng biết tại sao lại thế? Do nó "cồng kềnh" quá chăng? Tôi vẫn khoái dùng CodeIgniter hơn (đã viết xong 1 blog & chạy khá ngon - tuy nhiên giờ thì lại dùng...WP ).
Nhưng sáng nay "bác" PM bắt đầu assign tôi vào dự án của ZF team. Vậy là download ngay latest version, install & ngâm kíu thôi
Bước đầu tra manual + tutorial thì thấy dùng cũng không quá khó (tất nhiên là ko 100% APIs của ZF). "Moi" lại code của dự án thấy vấn đề đầu tiên & khá nổi cộm là việc dùng Smarty kết hợp với ZF. Sẽ không có gì đáng nói nếu như "ai đó" parse template theo kiểu mỗi action ứng với 1 template (html), và mỗi template này lại bê nguyên xi những cái không thay đổi (hoặc rất ít) vào
Cách sửa đơn giản nhất là viết lại template kiểu như:
{include file='header.tpl'}
vào đầu mỗi template của action. Nhưng nếu làm như vậy thì vẫn chưa tiện vì mỗi trang template tôi vẫn phải viết thêm các dòng code ở trên ứng với header, footer, sidebar (những cái luôn xuất hiện). Mà tính tôi thì lười. Đã quen với kiểu nhiều script 1 trang, chứ ko quen kiểu mỗi script một trang.
Đằng nào cũng là ngồi "tự sướng", vậy là tôi quyết định viết 1 cái class nhỏ xíu, để parse template giống như thằng CodeIgniter (cả Drupal) nữa. Mất cũng hơn nửa tiếng loay hoay vì cứ nghĩ cái method bên dưới là của Smarty:
$this->view->render('templateDir/templateFile.html');
hoá ra method render là của thằng Zend_View.
Và class tôi viết lại đơn giản như sau:
/* * Created on Apr 14, 2008 * * @author: Do Nam Khanh * @email: donamkhanh@gmail.com */
class dnkTemplate extends Smarty_View {
function __contructor() {}
function parseTpl($tplFile,$data) { $templates = array('header','content','footer'); $output = ""; if(is_array($data)) { foreach($data as $dataKey => $dataVal) { $this->assign($dataKey,$dataVal); } foreach ($templates as $file) { if ($file <> "content") { $output .= $this->fetch($file . '.html',null,null,false); } else { $output .= $this->fetch($tplFile. '.html',null,null,false); } } echo $output; } else { die('Could not parse template'); } } }
Thật ra thì ý tưởng này tôi lấy của InkType, giờ chỉ modify lại cho nó tương thích với framework này mà thôi :p Cách dùng thì rất đơn giản:
$this->view = new dnkTemplate(); ... $dataRow = array( 'title' => 'List CDs', 'base_url' => $this->base_url, 'list_cd_link' => $this->list_cd_link, 'add_cd_link' => $this->add_cd_link, 'data' => $data );
$this->view->parseTpl('list',$dataRow);
Tuy nhiên, muốn áp dụng vào project hiện tại không phải đơn giản, vì các thành viên khác sẽ phải viết lại toàn bộ template & sửa lại PHP code. Một khối lượng không nhỏ
Ngoài lề: Trong Ubuntu, mỗi lần tôi sửa file bằng Gedit thì sau khi save lại thấy xuất hiện 1 file backup kiểu như file_name.txt~. Cứ nghĩ là hệ điều hành có tính năng đó. Hoá ra là tính năng của thằng Gedit => disable ngay, ngứa mắt lắm:
It's in the preferences. In Gedit, go to to Edit > Preferences and uncheck the option about automatically creating a backup file.