MVC View Helper (Bài trước)
(Bài tiếp) MVC Hủy Template

Template trong ViewModel

Khi bạn trả về dữ liệu với biến ViewModel từ action của controller, Zend Framework sẽ biết được file template đi kèm với nó.

Trong đối tượng ViewModel có lưu tên biến template là tên để dẫn tới file template (có chế tìm đến file template có thể tên đã được gán trong config, hay là tên nằm trong thư mục thiết lập chứa template), có phương thức getter/setter trên thuộc tính này.

  • setTemplate($template) thiết lập tên template vào ViewModel
  • getTemplate($template) lấy tên template của ViewModel

Nếu khi action trả về ViewModel mà không thiết lập giá trị cụ thể tên template cho ViewModel, thì ZF tự động xác định tên template căn cứ theo tên Controller và tên Action. Như aboutAction() trong IndexController của module Application thì ZF3 tự động sử dụng 'application/index/about'. Còn nếu trước khi trả về, action sử dụng phương thức setTemplte để thiết lập, thì giá trị thiết lập sẽ được sử dụng.

Resolver

ZF làm thế nào để tìm được đến các file template, nó sử dụng cơ chế xác định file gọi là Resolver, chi tiết về Resolver xem tại: PhpRender trong ZF

Cơ bản thì có hai kiểu: TemplateMapResolver và TemplatePathStack

  • TemplateMapResolver tập hợp ánh xạ giữa tên đặt và đường dẫn vật lý chính xác đến file (Resolver sẽ tìm tên trong tập hợp này trước)
  • TemplatePathStack tập hợp các thư mục mà Resolver sẽ tìm theo cấu trúc tương đối.

Cấu hình các thông số này đều khai báo trong module.config.php, tại vị trí phần tử view_manager, bạn hãy mở file đó ra, và nội dung phần này là:

<?php
return [
    //...

    'view_manager' => [
        //...

        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ],
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

Như vậy bạn thấy, đầu tiên Resolver sẽ tìm các key trong template_map, nếu thấy sẽ sử dụng template theo đường dẫn, ví dụ nếu template name thiết lập là application/index/index thì sẽ thấy trong template_map đường dẫn đầy đủ đến file là: __DIR__ . '/../view/application/index/index.phtml'

Khi không thấy trong template_map sẽ tìm theo đường dẫn với thông số là tìm các thư mục định nghĩa trong template_path_stack. Ví dụ nếu tên template là 'application/index/about', ta thấy nó sẽ tìm trong template_path_stack vì trong template_map không thấy. Lúc này thì nó sẽ quét các thư mục trong template_path_stack, đến khi tìm thấy một file mà có cấu trúc đường dẫn tương đối trùng với application/index/about thì trả về file đó, tất nhiên chỉ tìm trong các thư mục chỉ ra trong config, ví dụ trên là: __DIR__ . '/../view'

Đổi Template

Với phương thức setTemplate($template) bạn có thể thay đổi file template mong muốn, thậm chí thay cả layout file.

public function aboutAction()
{

    $template_custome = 'application/index/about1.phtml';
    $layout_custome = 'application/index/layoutnew.phtml';



    $view = new ViewModel();

    //Đổi template
    $view->setTemplate($template_custome);


    //Thậm chí đổi layout, nhớ là layout mới phải có
    //đoạn code: echo $this->content;
    $this->layout()->setTemplate($layout_custome);


    return $view;
}

Đăng ký nhận bài viết mới
MVC View Helper (Bài trước)
(Bài tiếp) MVC Hủy Template