This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
khosb/includes/kohana/modules/userguide/guide/zh-cn/using.views.md
2011-05-03 09:49:01 +10:00

4.6 KiB
Raw Blame History

视图的使用

视图是包含输出显示信息内容的文件。通常大多数情况下是 HTMLCSS 和 Javascript 或者其他任何内容(包括调用 AJAX 的 XML 或 JSON 的输出)。其主要目的是为了从程序中分离逻辑以获得可复用性和整洁代码。

然而事实上,视图本身也能传递变量等代码并输出数据。比如,循环产品信息的数组并输出每个产品的信息。视图仍然是 PHP 文件因此你可以正常的写任何代码。

创建视图文件

视图文件存在文件系统中的 views 目录。你也可以在 views 目录下面创建子目录组织你的文件。下面所有的例子都是合理的视图文件:

APPPATH/views/home.php
APPPATH/views/pages/about.php
APPPATH/views/products/details.php
MODPATH/error/views/errors/404.php
MODPATH/common/views/template.php

加载视图

[View] 对象通常在 [Controller] 内部通过使用 [View::factory] 方法创建。一般视图被赋值给 [Request::$response] 属性或其他视图。

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

当视图对象如同上面的例子赋值给 [Request::$response],必要时它会自动输出呈现。如果想获得视图输出的内容,你可以调用 [View::render] 方法或者强制转为字符串类型。当时视图输出呈现时,视图会被加载并生成 HTML 代码。

public function action_index()
{
    $view = View::factory('pages/about');

    // Render the view
    $about_page = $view->render();

    // Or just type cast it to a string
    $about_page = (string) $view;

    $this->request->response = $about_page;
}

视图变量

一旦视图已经被加载,我们可以通过 [View::set] 和 [View::bind] 方法赋值变量。

public function action_roadtrip()
{
    $view = View::factory('user/roadtrip')
        ->set('places', array('Rome', 'Paris', 'London', 'New York', 'Tokyo'));
        ->bind('user', $this->user);

    // 视图拥有 $places 和 $user 变量
    $this->request->response = $view;
}

[!!] set()bind() 方法的区别在于 bind() 是引用赋值。如果你在变量定义之前使用 bind() 绑定了它。变量默认会被当作 NULL 创建。

全局变量

在程序中可能有多个视图文件而同时调用同样的变量。比如,在两个模板的 header 块中显示一个页面的相同标题而不同的内容。通过 [View::set_global] 和 [View::bind_global] 方法创建全局变量。

// 赋值 $page_title 到所有的视图
View::bind_global('page_title', $page_title);

假如程序中首页有三个视图需要输出呈现:templatetemplate/sidebarpages/home。首先,创建一个抽象类控制器去初始化视图模板:

abstract class Controller_Website extends Controller_Template {

    public $page_title;

    public function before()
    {
        parent::before();

        // 定义 $page_title 变量到所有视图中使用
        View::bind_global('page_title', $this->page_title);

        // 加载视图为 $sidebar 变量到模板
        $this->template->sidebar = View::factory('template/sidebar');
    }

}

下一步,在 home 控制器继承 Controller_Website:

class Controller_Home extends Controller_Website {

    public function action_index()
    {
        $this->page_title = 'Home';

        $this->template->content = View::factory('pages/home');
    }

}

视图嵌套

如果你想在视图中加载另外一个视图,这里提供两个方案。通过调用 [View::factory] 你可以实现沙盒加载视图。这意味着你可以使用 [View::set] 或 [View::bind] 赋值:

// 只有 $user 变量可用在 "views/user/login.php" 视图文件
<?php echo View::factory('user/login')->bind('user', $user) ?>

另外一种选择是直接加载视图,这会使得当前所有变量加载并在视图中使用:

// 所有定义在此视图中的变量都会加载到 "views/message.php" 文件
<?php include Kohana::find_file('views', 'user/login') ?>

另外,你也可以在整个 [Request] 中加载一个视图中:

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

这是一个 HMVC 的例子已确保它可以创建并从程序其他的 URL 调用。

升级 v2.x 版本

不同于 Kohana v2.x 版本,视图不在 [Controller] 环境中加载,因此你不能够把 $this 当作加载视图的控制器访问。传递控制器到视图必须这样实现:

$view->bind('controller', $this);