MVC Controller Plugin (Bài trước)
(Bài tiếp) MVC View Helper

View

Các view là layer hiện thị dữ liệu, trình diễn dữ liệu (xuất trang HTML trả về cho người dùng). Zend Framework 2,3 View chính là các file template mà phần mở rộng là .phtml (PHP + HTML)

Các file template có phần mở rộng .phtml bởi vì chúng trộn lẫn code PHP và mã HTML để phát sinh trang web. Trong ZF các template được đặt trong thư mục view của module, như hình dưới bạn nhìn thấy file template index.phtml, 404.phtml, layout.phtml ...

.phtml
Bạn chú ý là các template (.phtml) được chứa trong thư mục view của module, về nguyên tắc thì bạn có thể đặt ở bất kỳ đầu nhưng làm điều này bạn thật sự hiểu mục đích làm của mình, ví dụ nếu đặt trong thư mục src do cơ chế autoload của PHP có thể dẫn tới xung đột. Mặt khác các template được ZF3 cấu hình với resolver để tự động quét các thư mục view để có được template phù hợp.

Các template có thể có các ứng sử khác nhau, dựa trên biến được chuyển tới từ các action của controller. Dữ liệu chuyển tới template bằng đối tượng chứa biến ViewModel

Khi action trả về ViewModel (chứa dữ liệu), hệ thống quản lý module, controller tự động phân tích và nạp template tương ứng sau đó chuyển cho nó ViewModel để nó dựng HTML.

Giờ bạn sẽ thực hành tạo ra một action mới và template mới để tìm hiểu cơ bản về hoạt động của template. Bạn mở ứng dụng Skeleton Zend phần trước để thực hành.

Với cách thiết lập mục router trong module.config.php (bạn có thể mở ra xem) thì nếu nhập địa chỉ tương đối / (http://localhost/zf3/) sẽ thi hành controller và action tương ứng là Application/Index, khi địa chỉ tương đối /application/actionname (http://localhost/zf3/application/actionname) thì sẽ thi hành Application/actionname. Tạm thời bạn chấp nhận nguyên tắc như vậy, sau nay khi đến phần router ta xem biết chi tiết tại sao lại vậy.

Giờ bạn gõ vào trình duyệt: http://localhost/zf3/application/about, một lỗi 404 hiện ra cho biết Application\Controller\IndexController không thi hành được.

Nguyên nhân là do action với tên about chưa có trong controller. Giờ bạn thêm action có tên about vào controller Application

//module/Application/src/Controller/IndexController.php
//...
public function aboutAction()
{
    $data = [
      'appname' => 'Ứng dụng Zend Framework Skeleton',
      'content' => 'Hellow world! 2017',
    ];

    $view = new ViewModel($data);
    return $view;
}
//..

Chạy lại: http://localhost/zf3/application/about, aboutAction đã chạy, tuy nhiên có một exception hiện thị ra:

Zend\View\Renderer\PhpRenderer::render: Unable to render template "application/index/about"; resolver could not resolve to a file

Lỗi này là do khi action aboutAction chuyển ViewModel cho template, nó tự động chuyển cho template có tên application/index/about mà template này bạn chưa tạo.

Giờ bạn tạo template about.phtml trong thư mục view module, vị trí application/index/about = module/Application/view/application/index/index.phtml với nội dung:

<h1>Giới thiệu</h1>

<p>Đây là ví dụ về template .phtml</p>

<p>Tên ứng dụng: <?= $this->escapeHtml($appName); ?></p>
<p>Nội dung: <?=$content?>.</p>

Chú ý ViewModel là túi chứa biến từ controller truyền vào View (PhpRender), từ .phtml truy cập biến truyền đến bằng $this->varname hoặc $varname xem thêm về túi chứa biến

Chạy lại: http://localhost/zf3/application/about, kết quả đã như mong muốn:

zend

Kết luận cơ bản về View

  • Trên đây là thực hành hết sức cơ bản về View, bạn đã thấy Action trong Controller đã chuyển dữ liệu mảng vào ViewModel và ở Template đã nhận được biến đó ($appname, $content)
  • Cấu hình mặc định nếu với module tên Namemodule controller tên NameController, action có tên nameaction thì ViewModel sẽ tự động chuyển đến template ở vị trí /view/namemodule/namecontroller/nameaction.phtml
  • Khi template chạy thực tế là đối PhpRender chạy để dựng HTML, sau này để nâng cao bạn đọc chi tiết tại ZF PphRender
  • Để biết cách phối hợp PHP + HTML trong một file, hãy đọc phần Khối điều khiển thay thế PHP + HTML

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