视图
视图是一个包含了主要的用户交互元素的PHP脚本.他可以包含PHP语句,但是我们建议这些语句不要去改变数据模型,且最好能够保持其单纯性(单纯作为视图)!为了实现逻辑和界面分离,大部分的逻辑应该被放置于控制器或模型里,而不是视图里.
视图有一个当其被渲染(render)时用于用于校验的名称.视图的名称与其脚本名称是一样的.例如:视图 edit
的名称出自一个名为 edit.php
的脚本文件.通过 CController::render() 调用视图的名称可以渲染一个视图.这个方法将在 protected/views/ControllerID
目录下寻找对应的视图文件.
在视图脚本内部,我们可以通过 $this
来访问控制器实例.我们可以在视图里以 $this->propertyName
的方式 pull
控制器的任何属性.
我们也可以用以下 push
的方式传递数据到视图里:
- $this->render('edit', array(
- 'var1'=>$value1,
- 'var2'=>$value2,
- ));
在以上的方式中, render() 方法将提取数组的第二个参数到变量里.其产生的结果是,在视图脚本里,我们可以直接访问变量 $var1
和 $var2
.
1. 布局
布局是一种特殊的视图文件用来修饰视图.它通常包含了用户交互过程中常用到的一部分视图.例如:视图可以包含header和footer的部分,然后把内容嵌入其间.
- ......header here......
- <?php echo $content; ?>
- ......footer here......
而 $content
则储存了内容视图的渲染结果.
当使用 render() 时,布局是固定的被提供的.视图脚本 protected/views/layouts/main.php
是默认的布局文件.它可以通过改变 CWebApplication::layout 或者 CWebApplication::layout 来实现定制 . 通过调用 renderPartial() 可以不依赖布局而渲染视图.
2. 组件
组件是 CWidget 或其子类都实例.它是一个主要用于描述意图的组成部分.组件通常内嵌于一个视图来产生一些复杂却独立的用户界面.例如,一个日历组件可以用于渲染一个复杂的日历界面.组件可以在用户界面上更好的实现重用.
我们可以按如下视图脚本来使用一个组件:
- <?php $this->beginWidget('path.to.WidgetClass'); ?>
- ...body content that may be captured by the widget...
- <?php $this->endWidget(); ?>
或者
- <?php $this->widget('path.to.WidgetClass'); ?>
后者用于不需要任何 body 内容的组件.
组件可以通过配置来定制它的表现.这些是通过调用 CBaseController::beginWidget 或者 CBaseController::widget 设置他们(组件)的初始化属性值来完成的.例如,当使用 CMaskedTextField 组件时,我们想指定被使用的 mask .我们通过传递一个携带这些属性初始化值的数组来实现.这里的数组的键是属性的名称,而数组的值则是组件属性所对应的值.正如以下所示 :
- <?php
- $this->widget('CMaskedTextField',array(
- 'mask'=>'99/99/9999'
- ));
- ?>
继承 CWidget 以及重载它的init() 和 run() 方法,可以定义一个新的组件:
- class MyWidget extends CWidget
- {
- public function init()
- {
- // this method is called by CController::beginWidget()
- }
- public function run()
- {
- // this method is called by CController::endWidget()
- }
- }
组件可以像一个控制器一样拥有它自己都视图.默认的,组件的视图文件位于包含了组件文件的 views
子目录之下.这些视图可以通过调用 CWidget::render() 渲染,这一点和控制器很相似.唯一不同的是,组件的视图没有布局文件支持.
3. 系统视图
系统视图的渲染通常用于展示 Yii 的错误和日志信息.例如,当用户请求来一个不存在的控制器或动作时,Yii 会抛出一个异常来解释这个错误. 这时,Yii 就会使用一个特殊的系统视图来展示这个错误.
系统视图的遵从了一些规则.比如像 errorXXX
这样的名称就是用于渲染展示错误号 XXX
的 CHttpException 的视图.例如,如果 CHttpException 抛出来一个 404错误,那么 error404
就会被展示出来.
在 framework/views
下, Yii 提供了一系列默认的系统视图. 他们可以通过在 protected/views/system
下创建同名视图文件来实现定制.