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 cheeky

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

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ỉ blush

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 LayoutAction 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.

Hãy để lại link bài viết gốc khi chia sẻ bài viết này, mình sẽ report DMCA với những website lấy nội dung mà không để nguồn hoặc copy bài với số lượng lớn.

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Group Facebook để được hỗ trợ nhanh nhất.