状态 草稿
Todo Fill in empty topics
官方最后更新时间 2008/12/15 08:59

视图(Views)

开发过程中其详细内容请查询 View 核心类。

概述

视图(View)代表用户交互界面,对于 Web 应用来说,可以概括为HTML界面,但有可能为 HTML、 CSS 和 JavaScript 还有其他的类型如 XML、Json 和 Ajaxd 的输出。视图的目的是为系统提供界面呈现并把获得到的行为分发给下面的控制器,而且方便的可重用性和代码整洁性。

MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。但是视图仍然是 PHP 文件,所以你可以添加任何的可执行的代码。视图在控制器中被执行让您可以把所有的资源通过 $this→ 加载进去。

当视图被调用呈现的时候,所有加载进入视图的 PHP 和输出的内容都会返回(或者发送到浏览器上面)

创建视图

视图是必须放在 views 目录下面。文件名和代码类的类名一致。并且视图可以放在子目录下面,加载时需要指明路径。

实例

// 文件:home.php
$view = new View('home');
 
// 文件 list.php 在 'view/products' 下面
$view = new View('products/list');

加载视图

有3种方式可以加载视图,注意下面说的这一点很重要:如果视图文件没有被读并且没有创建输出,需要 render 方法。

New object

使用 New 创建视图

$view = new View('welcome');

Factory

使用 factory() 静态方法。基本和使用 New 创建视图是一样的,除了它是立即返回。

$view = View::factory('welcome');

传递数据到视图

从控制器数据传递到视图也是一种创建视图的方。

首先看控制器:

class Welcome_Controller extends Controller {
 
    function index()
    {
        // 加载视图
        $view = new View('yourview');
 
        // 添加变量到对象里面,这将可以在试图中显示
        $view->title   = "Welcome to Kohana !";
        $view->heading = "My Heading";
        $view->content = "My content here.";
 
        // 呈现试图
        $view->render(TRUE);
    }
}

现在,打开视图文件并添加下面代码:

<html>
    <head>
        <title><?php echo $title;?></title>
    </head>
    <body>
        <h1><?php echo $heading;?></h1>
        <p><?php echo $content;?></p>
    </body>
</html>

提示:

使用数组方法(CodeIgniter风格)在 Kohana 系统也是允许的,请看下面的实例

提示:

不能使用 $view→data = $data;

视图中的视图

加载视图中的视图:

// 控制器的方法的演示代码
$view = new View('template');
 
$view->header  = new View('header');
$view->content = new View('content');
$view->footer  = new View('footer');
 
$view->header->title     = 'Title of page';     // 视图 header.php 文件中的 $title 字符串变量。
$view->content->heading  = 'Heading of your page'; // 视图 content.php 文件中的 $heading 字符串变量。
$view->footer->copyright = 'Copyright';         // 视图 footer.php 文件中的 $copyright 字符串变量。
 
$view->render(TRUE);

视图文件: template.php

<?php echo $header; ?>
<?php echo $content; ?>
<?php echo $footer; ?>

视图文件: header.php

<html>
  <head>
    <title><?php echo $title; ?></title>
  </head>

视图文件: content.php

  <body>
  <h1><?php echo $heading; ?></h1>

视图文件: footer.php

  <?php echo $copyright; ?>
  </body>
</html>

输出:

<html>
  <head>
    <title>Title of page</title>
  </head>
  <body>
  <h1>Heading of your page</h1>
  Copyright
  </body>
</html>

当然,使用 CSS + Div 格式化输出的效果。你也可以使用自定义的辅助函数生成导航,面包屑(breadcrumbs)以及动态的内容(Banners,自定义广告)。

提示: 也可以考虑使用 Template_Controller,它可以把 header.php 和 footer.php 合并到一个文件当中。

Data scope

Rendering

在视图实例执行 render 方法。

实例

实例 1: Render on View instance

$view = new View('sample');
$view->render(TRUE);

实例 2: Render on View::factory

View::factory('sample')->render(TRUE);

完整实例

控制器: products.php

$products = array(
    array(
        'name' => 'Product1',
        'quantity' => '3'
    ),
    array(
        'name' => 'Product2',
        'quantity' => '7'
    )
);
 
$view = new View('products/list');
$view->title = 'Products';
$view->set('products', $products);
$view->render(TRUE);

首先定义 product 数组。 加载 products 目录下的 list 文件,并设置标题(title)和产品(products),并 rendered 输出到浏览器。

视图文件: products/list.php

<html>
<head>
    <title><?= $title ?></title>
</head>
<body>
    <h1><?= $title ?></h1>
    <table>
        <? foreach ($products as $product): ?> 
            <tr><td><;?= $product['name'] ?>;</td><td><?= $product['quantity'] ?>;</td></tr> 
        <? endforeach; ?>
    </table>
</body>
</html>

显示标题(title)并以表格的方式输出产品的内容。

显示:

<html>
<head>
    <title>Products</title>
</head>
<body>
    <h1>Products</h1>
    <table>
        <tr><td>Product1</td><td>3</td></tr>
        <tr><td>Product2</td><td>7</td></tr>
    </table>
</body>
</html>
general/views.txt · 最后更改: 2008/12/15 17:43 由 icyleaf