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: [email protected]
*/
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.
Hì hì bạn có ý tưởng hay đó nhưng tại sao bạn có thể làm thế thì làm luôn cái template tổng thể ?
Cái đó là main layout rồi gọi dến nó như là một helper để nó luôn hoạt động nếu bạn muốn và tắt đi nếu ko cần nữa?
(Tớ ko thích thằng zend vì hơi cồng kềng như bạn nghĩ đó)
Hì, chào bạn. Ý bạn là main layout đó đã có sẵn header, left sidebar, right sidebar, footer.? Mình chỉ cần parse cái content vào khung ở giữa? Cách này tớ rất hay dùng (nhưng không phải với ZF) & nhận thấy nó cũng có chỗ hơi bất tiện nếu gặp phải dự án yêu cầu giao diện “động”, tức là ứng với mỗi trường hợp cụ thể thì các thành phần như header, sidebar… lại có cách hiển thị khác nhau.
Mà bạn đang dùng framework gì vậy? Đừng nói với mình là bạn tự viết để dùng riêng nhé ^^
“Ý bạn là main layout đó đã có sẵn header, left sidebar, right sidebar, footer.? Mình chỉ cần parse cái content vào khung ở giữa?”
he he. mình cũng toàn dùng kiểu này thôi. Đặc biệt là Smarty, Nhưng đang chuẩn bị join vào cái Pubdirectory viết bằng xtemplates (cái này mình chưa viết bao giờ! tìm hiểu 1 hôm cũng lơ mơ viết được nhưng chả rõ có làm tiếp vào project được cùng mọi người ko nữa !). Ah mà bác Khánh có cái site đơn giản nào = Zend framework thì share lên để mọi người cùng học với.
Hóa ra bác Mạnh ở Qsoft 🙂
Smarty bác dùng được thì chẳng có lý do nào Xtemplate bác lại không dùng được cả 😉 An tâm.
Còn việc share site viết bằng ZF thì rất tiếc là tớ không có (như đã nói ở trên, không khoái viết ZF :-p).
Welcome bác chuẩn bị xuống phòng PHP 😀
he he he. Bác không khoái ZF thì cũng phải viết thôi. Em thấy bác ở trong group Bigsplash mà.Cái này làm bằng ZF & smarty.Em mới nhập môn ZF nên lơ ngơ lắm.Có gì chưa biết nhờ ae chỉ bảo nhé.
Ở đây toàn người lơ ngơ mà bác ;))
anh noi do hon chi tiet hon duoc khong em cam on nhe
em huyen
chao ban minh cam thay document rat good cam on nhe
anh Khánh cho e hỏi về cái CI vs ạh. Tình hình là e đang nghiên cứu FW này nhưng không hiểu về khoản template của nó thì mình có sử dụng smarty dc không hay là nên dùng template parser class của nó.
và nếu dùng parser của nó thì sử dụng như thế nào ạh, a có thể giúp e một bài tut về khoản này dc hok 😀
cám ơn a nhiều
Hi em, sorry vì giờ mới reply cho em được (line internet bị đứt :()
Lâu lắm rồi anh cũng ko sử dụng CI nữa, em thử làm theo mấy bài viết dưới đây xem được không?
http://codeigniter.com/forums/viewthread/60050
http://codeigniter.com/forums/viewthread/44719
http://www.devcha.com/2007/12/smarty-as-template-engine-in-code.html