Bài 06: Tạo template dùng chung trong Phalcon
Trong Phalcon ngoài Main Template thì nó còn có một chức năng tạo một Template có thể được dùng cho toàn site, đây là một chức năng khá hay mà mình thấy không có trong Codeigniter Framework, áp dụng vào dự án thì còn gì bằng
1. Tạo cấu trúc Layouts trước tiên
Trước tiên chúng ta quay lại cấu trúc folder hôm trước đã nhé.
project_name/ /app/ /cache/ /config/ /controllers/ /NewsController.php /models/ /views/ /layouts/ /news.phtml /news/ /detail.phtml /newslist.phtml /index.phtml /public/ /css/ /js/ /index.php
Đây chính là sơ đồ cấu trúc folder của bài mô hình layouts của View trong Phalcon, nội dung như thế nào thì bạn quay lại và xem nhé.
2. Tạo template dùng chung trong Phalcon.
Như mô hình layouts trên thì mỗi khi chương trình chạy thì Controller sẽ xem xét và load Main Layout trước, nếu trong Main Layout có load child content thì nó sẽ tiêp tục load Controller Layout, tương tự nếu Controller Layout có load child content thì nó sẽ tiếp tục load Action View. Nghĩa là quy trình load sẽ là Main Layout -> Controller Layout -> Action View
Bài viết này được đăng tại [free tuts .net]
Nhưng nếu ta khai báo template thì nó sẽ có một cách load hơi khác chút xíu như sau: Main Layout -> Template -> Controller Layout -> Action View. Ta làm ngay cho nóng nhỉ
Bạn tạo thêm một file tên là shared.phtml
nằm trong folder app/views/layouts/
.
project_name/ /app/ /views/ /layouts/ /news.phtml /shared.phtml
Bạn mở file shared.phtml
lên và gõ nội dung sau vào:
<h2>TRANG LAYOUT CỦA CONTROLLER</h2>
Tiếp theo mở NewsController.php lên và sửa lại như sau:
class NewsController extends Phalcon\Mvc\Controller { public function detailAction(){ $this->view->setTemplateAfter('shared'); } public function newslistAction(){ $this->view->setTemplateAfter('shared'); } }
Ra trình duyệt gõ đường dẫn:
- http://localhost/project_name/news/detail
- http://localhost/project_name/news/newslist
Và bạn sẽ thấy kết quả nó có load file shared.phtml trước rồi mới đến các file Controller Layout và Action View phải không nào. Như vậy cơ chế của nó không có gì khác biệt, nếu bỏ đoạn code $this->view->setTemplateAfter('shared');
thì nó sẽ không chạy file shared.phtml.
Có một lưu ý là bạn đặt đoạn code <?php echo $this->getContent(); ?>
vào file shared.phtml thì nó mới load tiếp các mức còn lại nhé. Và nếu trong tất cả các action đều sử dụng template này thì bạn có thể đặt nó trong hàm khởi tạo có tên là initialize.
class NewsController extends Phalcon\Mvc\Controller { // Thêm ham này public function initialize(){ $this->view->setTemplateAfter('shared'); } public function detailAction(){ } public function newslistAction(){ } }
Có thể bạn thắc mắc tại sao không đặt trong hàm khởi tạo (construct), lý do là trong Phalcon hàm khởi tạo đó đã ở dạng final nên không thể rewrite lại được nữa, thay vào đó nó cung cấp hàm initialize để thay thế.
Và cuối cùng ta có kết luận như sau:
- Ta sử dụng hàm
$this->view->setTemplateAfter('template_name');
để load template với tham số là tên của template - Các file template phải đặt trong folder
app/view/layouts
# Lời kết
Cơ chế template này giúp chúng ta có thể quản lý các template một cách tốt hơn nên các bạn nên áp dụng nó vào ứng dụng nếu cần thiết. Bài này cũng tương đối ngắn nhưng mình viết hơi dài dòng là vì mình muốn bạn hiểu bản chất của nó. Cám ơn vì đã đọc tuts của mình.