CodeIgnitor: View
View là một trang web hay một phần của trang web như header, footer, sidebar... Bạn hiểu đơn giản, view chỉ là những file HTML định hình trang web (phần lớn đều có chèn code PHP để lấy dữ liệu động). Thông thường, toàn bộ những gì bạn thấy trên trình duyệt thì đó được xem như là 1 view.
Về cơ bản, view không thể được gọi trực tiếp mà nó luôn được gọi thông qua một controller theo đúng mô hình MVC nổi tiếng.
Tạo view
Bạn tạo một tập tin (chẳng hạn tên là blogview.php) trong thư mục application/views như sau:
<html>
<head>
<title>My Blog</title>
</head>
<body>
Welcome to my Blog!
</body>
</html>
Gọi view từ controller
Để gọi view, bạn sử dụng cú pháp sau:
$this->load->view('name');
Với view_name là tên file view bạn muốn load nhưng không kèm theo phần mở rộng (.php). Như vậy, với file blogview.php đã tạo ở trên chúng ta sẽ có cú pháp gọi file blogview.php như sau:
$this->load->view('blogview');
Bạn tạo một controller blog với nội dung lệnh như sau:
<?php class Blog extends CI_Controller { public function index(){ $this->load->view('blogview'); } }
Khi bạn truy cập URL sau:
example.com/index.php/blog
Kết quả sẽ là:
Welcome to my Blog!
Tải nhiều view
Bạn cũng có thể load nhiều view trong 1 controller như ví dụ sau:
<?php class Page extends CI_Controller { public function index(){ $data['page_title'] = 'Your title'; $this->load->view('header'); $this->load->view('menu'); $this->load->view('content', $data); $this->load->view('footer'); } } ?>
Lưu trữ view trong thư mục con
Trường hợp bạn tạo view bên trong một thư mục con của thư mục application/views (ví dụ tôi đặt file blogview.php trong thư mục application/views/subfolder) bạn có thể sử dụng cú pháp lệnh sau để gọi view:
$this->load->view('subfolder/blogview');
Truyền dữ liệu từ controller ra view
Toàn bộ quá trình xử lý tương tác dữ liệu đều được thực hiện ở controller (trừ việc lấy dữ liệu từ database là thực hiện ở model sẽ nói sau) nên kết quả trả về sẽ nằm trong controller. Vậy làm cách nào để truyền dữ liệu này ra ngoài view để ta có thể trình bày theo ý muốn? Với CI thì công việc này rất đơn giản: Bạn chỉ việc gán toàn bộ các dữ liệu muốn truyền ra view vào 1 mảng và truyền vào tham số thứ 2 của phương thức load view như ví dụ dưới đây:
$data = array(
'title' => 'HTML5',
'heading' => 'Giới thiệu HTML5',
'message' => 'Thông báo'
);
$this->load->view('blogview', $data);
Với ví dụ trên, khi ra ngoài blogview bạn sẽ có ngay các biến là $title, $heading và $message (tương ứng với tên chỉ số của phần tử mảng) để sử dụng.
Chúng ta xét ví dụ hoàn chỉnh sau:
Tạo controller blog (application/controllers/blog.php) với nội dung sau:
<?php
class Blog extends CI_Controller {
function __construct()
{
parent::__construct();
}
function index()
{
$data = array(
'title' => 'HTML5',
'heading' => 'Giới thiệu HTML5',
'message' => 'Thông báo'
);
//Load view
$this->load->view('blogview', $data);
}
}
?>
Tạo view blogview (application/views/blogview.php) với nội dung sau:
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<h1><?php echo $heading; ?></h1>
<?php echo $messagge; ?>
</body>
</html>
Bạn truy cập URL:
example.com/blog
Chúng ta sẽ có kết quả:
Giới thiệu HTML5
Thông báo
(Lưu ý: Chuỗi "HTML5" thì xuất hiện trên thanh tiêu đề của trình duyệt).
Khi dữ liệu được truyền từ controller ra view sẽ vẫn giữ nguyên kiểu dữ liệu. Ví dụ kiểu dự trong controller là chuỗi (string) thì ngoài view cũng sẽ là chuỗi. Tương tự, kiểu mảng (array), kiểu đối tượng (object),... khi truyền ra view vẫn giữ nguyên kiểu dữ liệu.
Tạo vòng lặp
Mảng dữ liệu truyền tới view không chỉ giới hạn ở các biến đơn. Ta có thể truyền nhiều mảng động để từ đó có thể tiến hành lặp để tạo nhiều hàng. Ví dụ, nếu bạn lấy dữ liệu từ database thì dữ liệu sẽ có dạng là một mảng đa chiều.
Dưới đây là một ví dụ minh họa.
Bạn đưa đoạn code sau vào controller:
<?php
class Blog extends CI_Controller {
public function index(){
$data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');
$data['title'] = "My Real Title";
$data['heading'] = "My Real Heading";
$this->load->view('blogview', $data);
}
}
Bạn mở view để tạo một vòng lặp:
<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
<h1><?php echo $heading;?></h1>
<h3>My Todo List</h3>
<ul>
<?php foreach ($todo_list as $item):?>
<li><?php echo $item;?></li>
<?php endforeach;?>
</ul>
</body>
</html>
Trả về view dưới dạng dữ liệu
Trong lời gọi view từ controller có tham số tùy chọn thứ ba, tham số này giúp ta thay đổi hành vi của phương thức theo đó phương thức sẽ trả về dữ liệu dưới dạng chuỗi chứ không phải là gửi nó tới trình duyệt. Điều này có thể có ích nếu ta muốn xử lý dữ liệu theo một hướng nào đó. Nếu bạn đặt tham số thứ ba này là TRUE (boolean) thì việc gọi view sẽ tương ứng với việc trả về dữ liệu. Mặc định thì phương thức sẽ trả về FALSE và thông tin sẽ được gửi tới trình duyệt. Bạn cần gán giá trị trả về cho một biến nếu bạn muốn sử dụng dữ liệu trả về đó. Cú pháp cụ thể như sau:
$string = $this->load->view('myfile', '', TRUE);