NTM Solutions

Facebook Youtube Google+

Thứ Năm, 22 tháng 11, 2018

Tự học CodeIgniter-Bài 04-Views

#hoccodeigniter

01 view đơn giản là 01 trang web, hoặc 01 phần trong 01 trang như phần header, footer, sidebar,... Nói nào ngay, các views có thể được nhúng vào bên trong các views khác nếu bạn cần dạng hệ thống phân cấp.

Các Views không bao giờ được gọi trực tiếp, chúng phải được tải bởi 01 controller. Hãy nhớ rằng trong 01 framework MVC, Controller đóng vai cảnh sát giao thông , vì thế nó có nhiệm vụ nạp vào 01 view thích hợp. Bạn cần đọc: bài 02-Controllers trước khi đọc tiếp bài này.
Ta sử dụng lại controller Blog đã tạo trong bài 02-controller và bây giờ ta thêm vào view cho nó.
Tạo View

Các bạn tạo tập tin application/views/blogview.php và dán vào đoạn mã sau:
<html>
<head>
        <title>Lophocvitinh.COM</title>
</head>
<body>
        <h1>Lophocvitinh.COM chào mừng bạn!</h1>
</body>
</html>

Tải View

Để tải 01 view ta sẽ dùng phương thức sau:
$this->load->view('tenview');

Ở đây tenview chính là tên tập tin view.
Ghi chú:
Phần mở rộng .php không cần phải ghi vào trừ khi bạn dùng loại tập tin không phải là .php
Bây giờ, mở tập tin controller Blog.php mà ta đã tạo trong bài 02-controller, và thay câu lệnh echo bằng câu lệnh tải view trong phương thức index()
<?php

class Blog extends CI_Controller {

        public function index()
        {
                $this->load->view('blogview');
        }
}

Ta sẽ dùng URL để vào controller blog như vầy:
example.com/index.php/blog/

Tải nhiều views

CodeIgniter có khả năng xử lý nhiều lệnh gọi $this->load->view() từ bên trong 01 controller. Nếu điều đó xảy ra các views mới sẽ tự động chèn vào bên dưới view trước đó. Ví dụ vầy cho dễ hiểu, bạn muốn có 01 header view, 01 menu view, 01 content view,và 01 footer view. Ta sẽ làm điều đó như 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');
        }
}

Trong ví dụ trên, chúng ta đang dùng cách “thêm dữ liệu vào 01 cách động”, mà ta sẽ thấy dưới đây.
Lưu Views bên trong thư mục con

Các tập tin view cũng có thể lưu trong các thư mục con nếu bạn cần tổ chức lại chúng. Khi làm như vầy bạn cần thêm vào đường dẫn tên thư mục khi tải view. Ví dụ:
$this->load->view('tên_thư_mục/tên_tập_tin');

Thêm dữ liệu động vào View

Dữ liệu được truyền từ controller vào view thông qua 01 mảng hoặc 01 đối tượng trong tham số thứ 02 của phương thức tải view. Đây là 01 ví dụ dùng mảng để truyền vào view:
$data = array(

        'title' => 'My Title',
        'heading' => 'My Heading',
        'message' => 'My Message'
);

$this->load->view('blogview', $data);

Và đây là 01 ví dụ dùng đối tượng để truyền vào view:
$data = new Someclass();

$this->load->view('blogview', $data);

Chú ý:
Nếu bạn dùng 01 đối tượng, các biến của lớp sẽ chuyển thành phần tử mảng.
Ta hãy thử với tập tin controller Blog.php
<?php

class Blog extends CI_Controller {

        public function index()
        {
                $data['title'] = "My Real Title";
                $data['heading'] = "My Real Heading";
                $this->load->view('blogview', $data);
        }
}

Bây giờ mở tập tin view và thay đổi các dòng văn bản( cặp thẻ <title> và <h1>) thành các biến tương ứng với các khóa của mảng trong biến $data
<html>
<head>
        <title><?php echo $title;?></title>
</head>
<body>
        <h1><?php echo $heading;?></h1>
</body>
</html>

Sau đó ta tải lại URL đến controller Blog và thấy các giá trị các biến đã được thay vào.
Tạo Loops

Mảng $data bạn truyền vào tập tin view không bị giới hạn chỉ là những biến đơn . Bạn có thể truyền mảng nhiều chiều -> phải lặp để hiển thị giá trị trên nhiều dòng. Ví dụ nếu bạn kéo dữ liệu từ cơ sở dữ liệu , nó thường có dạng mảng nhiều chiều.
Sau đây là 01 ví dụ giản đơn trong controller Blog
<?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ây giờ ta sẽ tạo 01 vòng lặp trong tập tin view
<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>

Chú ý:
Trong ví dụ trên chúng ta đang dùng cú pháp hoán đổi của . Nếu muốn tìm hiểu thêm bạn có thể đọc thêm ở mục user_guide/general/alternative_php.html
Trả về views như dữ liệu

Có 01 tùy chọn thứ 03 cho phép bạn thay đổi hành vi của phương thức -> làm cho nó trả về 01 chuỗi thay vì gửi đến trình duyệt. Điều này có thể hữu dụng nếu bạn muốn xử lý dữ liệu theo cách nào đó. Nếu bạn thiết lập tham số là TRUE (boolean) nó sẽ trả về dữ liệu. Giá trị mặc định là false, nghĩa là nó sẽ gửi kết quả đến trình duyệt. Hãy nhớ gán nó vào 01 biến nếu bạn muốn trả về dữ lieu:
$string = $this->load->view('myfile', '', TRUE);

+Các tập tin đã tạo và sửa trong bài viết này:
·         application/views/blogview.php

·         application/controllers/Blog.php

·         application/controllers/Page.php
Ghi chú:
Để sử dụng hình ảnh, tài liệu,css… trong view ta có 02 cách:
1.       Dùng đường dẫn trực tiếp: http://localhost/thư_mục_CI/thư_mục_tài_nguyên

2.       Dùng đường dẫn nội bộ CI cần làm 02 việc:
·         Tải thư viện trong lớp khởi tạo controller: $this->load->helper('url');

·         Dùng câu lệnh sau để dán đường dẫn thư mục gốc CI trước thư mục tài nguyên:
<?php echo base_url();?>tên_thư_mục_tài_nguyên

XEM MỤC LỤC CÁC BÀI VIẾT CODE IGNITER

Nếu vẫn chưa rõ các bạn xem thêm video clip sau:


By #tiensim
Nguồn: User Guide – General Topics