[Kohana] Bài 3 Cơ bản về View trong kohana

Views

 

Views là những file mà chứa những thông tin thể hiện của ứng dụng . phần lớn view sẽ bao gồm  HTML, CSS và  Javascript nhưng cũng có thể là  XML hay JSON cho AJAX.  Mục đích của View là làm sao giữ thông tin của ứng dụng tách biệt ra với ứng dụng nhằm sau này tùy chỉnh hoặc tối ưu code tốt hơn.

Views bản thân nó chứa code hiển thị dữ liệu mà người lập trình muốn đưa ra. ví dụ, Đưa thông tin của 1 mảng các hàng hóa mà mỗi hàng hóa lại là một bảng thông tin . Nếu thực hiện kiểu bình thường thì giao diện sẽ rất rối. nhưng với view có thể lồng view  của chi tiết sản phẩm một cách dễ dàng. Views vẫn là  tập tin PHP vì thế bạn có thể viết như cách thông thường. tuy nhiên , bạn nên tạo view một cách chi tiết  có thể để thể hiện dữ liệu từ controller gửi đến.

Tạo View

thôi thì bắt đầu tạo view đi chứ nói nhiều quá mất hay

Các tập tin của View được lưu trong thư mục views trong bộ code. tập tin này có phần đuôi là .php. Bạn có thể tạo các thư mục con là những view con khác nhau trong thư mục này luôn để tổ chức quản lý các file view riêng.Ví dụ như sau:

APPPATH/views/home.php //các view chính
APPPATH/views/pages/about.php // Các view dạng trang
APPPATH/views/products/details.php //các view của sản phẩm
MODPATH/error/views/errors/404.php //các view báo lỗi
 

tải  Views

Đối tượng View sẽ được tạo bên trong Controller sử dụng phương thức View::factory . View sẽ được khỏi tạo thông qua thuộc tính  Request::$response  hay những View khác. ví dụ sau là tải 1 view chi tiết sản phẩm

public function action_about()
{
    $this->request->response = View::factory('products/details');
}

Khi một view được khỏi tạo bằng  Request::$response, nó sẽ được render khi cần thiết.  để render kết quả của View cần dùng phương thức  View::render hay chỉ đống vai trò như một string.khi view được render,  thì tập tin view được tải và sinh ra HTML tương ứng.

public function action_index()
{
    $view = View::factory('products/details');
 
    // Render the view
    $detail_product = $view->render();
 
    // Or just type cast it to a string
    $detail_product = (string) $view;
 
    $this->request->response = $detail_product;
}

Biến trong Views

Khi một View được tải, Biến được khởi tạo để sử dụng trong phương thức  View::set và View::bind .

public function action_roadtrip()
{
    $view = View::factory('user/roadtrip')
        ->set('places', array('Rome', 'Paris', 'London', 'New York', 'Tokyo'));
        ->bind('user', $this->user);
 
    // The view will have $places and $user variables
    $this->request->response = $view;
}

sự khác nhau duy nhất giữa set() và  bind() là bind() khởi tạo biến reference (tham khảo). nếu  trong bind() có một biến trước đó đã được định nghĩa ,thì biến sẽ được tạo với giá trị  NULL.

bạn cũng có thể khởi tạo biến bằng cách gán trực tiếp cho đối tượng  View. Nó chỉ định gọi phương thức set();

public function action_roadtrip()
{
    $view = View::factory('user/roadtrip');
 
    $view->places = array('Rome', 'Paris', 'London', 'New York', 'Tokyo');
    $view->user = $this->user;
 
    // The view will have $places and $user variables
    $this->request->response = $view;
}

Biến toàn cục

Một ứng dụng có thể có nhiều tập tin view mà cần truy xuất đến cùng một số biến.  Ví dụ như để thể hiện tiêu đề của trang cả ở header của template và trong thân của nội dung trang (page content). Bạn có thể tạo những biết mà có thể truy xuất trong bất kỳ view thì sử dụng  phương thức  View::set_global và View::bind_global

// Assign $page_title to all views
View::bind_global('page_title', $page_title);

Nếu ứng dụng có 3 view được render cho trang chủ (home page)  templatetemplate/sidebar, và pages/home. thì đầu tiền abstract controller tạo template sẽ được tạo  

If the application has three views that are rendered for the home page: templatetemplate/sidebar, andpages/home. First, an abstract controller to create the template will be created:

abstract class Controller_Website extends Controller_Template {
 
    public $page_title;
 
    public function before()
    {
        parent::before();
 
        // Make $page_title available to all views
        View::bind_global('page_title', $this->page_title);
 
        // Load $sidebar into the template as a view
        $this->template->sidebar = View::factory('template/sidebar');
    }
 
}

tiếp theo thì home controller sẽ kế thừa từ  Controller_Website:

class Controller_Home extends Controller_Website {
 
    public function action_index()
    {
        $this->page_title = 'Home';
 
        $this->template->content = View::factory('pages/home');
    }
 
}

View cùng với view

Nếu như bạn muốn kết hợp view này với những view khác, thì có 2 lựa chọn. Bằng cách gọi View::factory  bạn có thể ???(sandbox) với view kết hợp ấy. Nghĩa là bạn sẽ ophai3 cung cấp tất cả các biến đến view bằng cách sử dung View::set hay View::bind:

// In your view file:
 
// Only the $user variable will be available in "views/user/login.php"
<?php echo View::factory('user/login')->bind('user', $user) ?>

Tùy chọn khác cho việc kết hợp view trực tiếp là tạo tất cả các biến cùng 1 view 

// In your view file:
 
// Any variable defined in this view will be included in "views/message.php"
<?php include Kohana::find_file('views', 'user/login') ?>

Bạn cũng có thể khởi tạo biến từ  view  cha cho  view con trong cùng một conttroller, Ví dụ:

// In your controller:
 
public functin action_index()
{
    $view = View::factory('common/template);
 
    $view->title = "Some title";
    $view->body = View::factory('pages/foobar');
}
 
// In views/common/template.php:
 
<html>
<head>
    <title><?php echo $title></title>
</head>
 
<body>
    <?php echo $body ?>
</body>
</html>

Và tất nhiên bạn cũng có thể tải Tất cả Request cùng với view:

<?php echo Request::factory('user/login')->execute() ?>

đây là một ví dụ của [HMVC], nó có thể được tạo để gỏi từ các  URLs khác trong ứng dụng .

Lược dịch từ http://kohanaframework.org/3.0/guide/kohana/mvc/views