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