渲染

因为控制器可以无需继承任何基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。

渲染模板最常用的方法是控制器继承 ginkgo\Ctrl 类后调用 fetch 方法:

fetch 方法说明

  1. function fetch( [$template = '' [, $assign = '' [, $value = '']]] )

参数

  • template 模板

    支持如下几种写法:

    | 用法 | 描述 | 规则 | | - | - | - | | 不带任何参数 | 自动定位 | app/tpl/当前模块/当前控制器/当前动作.tpl.php | | 动作 | 常用写法 | app/tpl/当前模块/当前控制器/动作.tpl.php | | 控制器/动作 | 常用写法 | app/tpl/当前模块/控制器/动作.tpl.php | | 完整的模板路径 | 必须包含模板后缀 | 模板后缀必须与系统配置一致,详情请查看 配置 -> 常量配置附录 -> 配置参考 |

  • assign 变量

    支持两种类型:字符串、数组

  • value 变量值

    assign 为字符串时为必须,当 assign 为数组时自动忽略。

下面是一个最典型的用法,不带任何参数:

  1. namespace app\ctrl\index;
  2. use ginkgo\Ctrl;
  3. class Index extends Ctrl {
  4. public function index() {
  5. // 不带任何参数 自动定位当前动作的模板文件
  6. return $this->fetch();
  7. }
  8. }

文件名为实际动作的小写和下划线,如:

  1. namespace app\ctrl\index;
  2. use ginkgo\Ctrl;
  3. class Index extends Ctrl {
  4. public function cateList() {
  5. return $this->fetch();
  6. }
  7. }

模板的文件名为

cate_list.tpl.php

模板的实际位置是

app/tpl/index/index/cate_list.tpl.php

如果没有按照定义规则来定义模板(或者需要调用其他模板),可以使用:

  1. // 指定模板输出
  2. return $this->fetch('edit');

表示调用当前控制器下面的 edit 模板

  1. return $this->fetch('member/read');

表示调用 Member 控制器下面的 read 模板。


跨模块渲染模板及自定义模板路径

渲染输出不需要写模板的路径和后缀。这里的控制器和动作并不一定需要有实际对应的控制器和动作,只是一个目录名称和文件名称而已,例如,你的项目里面可能根本没有 Public 控制器,更没有 Public 控制器的 menu 动作,但是一样可以使用

  1. return $this->fetch('public/menu');

输出这个模板文件。理解了这个,模板输出就清晰了。

支持从设置的根目录开始读取模板,以下是默认设置下的例子:

  1. return $this->fetch('/menu');

表示读取的模板是

app/tpl/当前模块/menu.tpl.php

如果需要调用视图类 ginkgo\View 的其它方法,可以直接使用 $this->obj_view 对象。

如果你的模板位置比较特殊或者需要自定义模板的位置,可以通过写入完整模板路径、调用 ginkgo\ViewsetPath 方法或者修改配置来实现。

自动定位

  1. namespace app\ctrl\index;
  2. use ginkgo\Ctrl;
  3. class Index extends Ctrl {
  4. public function cateList() {
  5. return $this->fetch();
  6. }
  7. }

明确写入模板路径和后缀

  1. return $this->fetch('/web/app/tpl/index/index/cate_list.tpl.php');

调用 setPath 方法

  1. $this->obj_view->setPath('/web/app/tpl/index/');
  2. return $this->fetch('index/cate_list');

以上方式的效果是一致的。

模板配置的 path 参数支持完整路径定义,默认采用 app/tpl/ 作为模板目录

  1. 'tpl' => array(
  2. 'path' => 'default', // 定义模板目录
  3. ...
  4. );

模板的实际目录是

app/tpl/default/

  1. 'tpl' => array(
  2. 'path' => '/web/app/tpl/', // 定义模板根目录
  3. ...
  4. );

模板的实际目录是

/web/app/tpl/


渲染内容

如果希望直接解析内容而不通过模板文件的话,可以使用 display 方法:

  1. namespace app\ctrl\index;
  2. use ginkgo\Ctrl;
  3. class Index extends Ctrl {
  4. public function index() {
  5. // 直接渲染内容
  6. $content = '\<?php echo $name; ?\> - \<?php echo $email; ?\>';
  7. $data = array(
  8. 'name' => 'ginkgo',
  9. 'email' => 'ginkgo@qq.com'
  10. );
  11. return $this->display($content, $data);
  12. }
  13. }