首页 > 网站 > 建站经验 > 正文

PHP的Yii框架中创建视图和渲染视图的方法详解

2024-08-30 19:06:49
字体:
来源:转载
供稿:网友

视图是 MVC 模式中的一部分。 它是展示数据到终端用户的代码,在网页应用中,根据视图模板来创建视图,视图模板为PHP脚本文件, 主要包含HTML代码和展示类PHP代码,通过yii/web/View应用组件来管理, 该组件主要提供通用方法帮助视图构造和渲染,简单起见,我们称视图模板或视图模板文件为视图。

创建视图

如前所述,视图为包含HTML和PHP代码的PHP脚本,如下代码为一个登录表单的视图, 可看到PHP代码用来生成动态内容如页面标题和表单,HTML代码把它组织成一个漂亮的HTML页面。

  1. <?php 
  2.  
  3. use yii/helpers/Html; 
  4.  
  5. use yii/widgets/ActiveForm; 
  6.  
  7. /* @var $this yii/web/View */ 
  8.  
  9. /* @var $form yii/widgets/ActiveForm */ 
  10.  
  11. /* @var $model app/models/LoginForm */ 
  12.  
  13. $this->title = 'Login'
  14.  
  15. ?> 
  16.  
  17. <h1><?= Html::encode($this->title) ?></h1> 
  18.  
  19. <p>Please fill out the following fields to login:</p> 
  20.  
  21. <?php $form = ActiveForm::begin(); ?> 
  22.  
  23.   <?= $form->field($model'username') ?> 
  24.  
  25.   <?= $form->field($model'password')->passwordInput() ?> 
  26.  
  27.   <?= Html::submitButton('Login') ?> 
  28.  
  29. <?php ActiveForm::end(); ?> 

在视图中,可访问 $this 指向 yii/web/View 来管理和渲染这个视图文件。

除了 $this之外,上述示例中的视图有其他预定义变量如 $model, 这些变量代表从控制器或其他触发视图渲染的对象 传入 到视图的数据。

技巧: 将预定义变量列到视图文件头部注释处,这样可被IDE编辑器识别,也是生成视图文档的好方法。

安全

当创建生成HTML页面的视图时,在显示之前将用户输入数据进行转码和过滤非常重要, 否则,你的应用可能会被跨站脚本 攻击。

要显示纯文本,先调用 yii/helpers/Html::encode() 进行转码,例如如下代码将用户名在显示前先转码:

  1. <?php 
  2.  
  3. use yii/helpers/Html; 
  4.  
  5. ?> 
  6.  
  7. <div class="username"
  8.  
  9.   <?= Html::encode($user->name) ?> 
  10.  
  11. </div> 

要显示HTML内容,先调用 yii/helpers/HtmlPurifier 过滤内容,例如如下代码将提交内容在显示前先过滤:

  1. <?php 
  2.  
  3. use yii/helpers/HtmlPurifier; 
  4.  
  5. ?> 
  6.  
  7. <div class="post"
  8.  
  9.   <?= HtmlPurifier::process($post->text) ?> 
  10.  
  11. </div> 

技巧:HTMLPurifier在保证输出数据安全上做的不错,但性能不佳,如果你的应用需要高性能可考虑 缓存 过滤后的结果。

组织视图

与 控制器 和 模型 类似,在组织视图上有一些约定:

控制器渲染的视图文件默认放在 @app/views/ControllerID 目录下, 其中 ControllerID 对应 控制器 ID, 例如控制器类为PostController,视图文件目录应为 @app/views/post, 控制器类 PostCommentController对应的目录为@app/views/post-comment, 如果是模块中的控制器,目录应为 yii/base/Module::basePath 模块目录下的views/ControllerID 目录;

对于 小部件 渲染的视图文件默认放在 WidgetPath/views 目录, 其中 WidgetPath 代表小部件类文件所在的目录;

对于其他对象渲染的视图文件,建议遵循和小部件相似的规则。

可覆盖控制器或小部件的 yii/base/ViewContextInterface::getViewPath() 方法来自定义视图文件默认目录。

渲染视图

可在 控制器, 小部件, 或其他地方调用渲染视图方法来渲染视图, 该方法类似以下格式:

  1. /** 
  2.  
  3.  * @param string $view 视图名或文件路径,由实际的渲染方法决定 
  4.  
  5.  * @param array $params 传递给视图的数据 
  6.  
  7.  * @return string 渲染结果 
  8.  
  9.  */ 
  10.  
  11. methodName($view$params = []) 

控制器中渲染

在 控制器 中,可调用以下控制器方法来渲染视图:

yii/base/Controller::render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。

yii/base/Controller::renderPartial(): 渲染一个 视图名 并且不使用布局。

yii/web/Controller::renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。

yii/base/Controller::renderFile(): 渲染一个视图文件目录或别名下的视图文件。

例如:

  1. namespace app/controllers; 
  2.  
  3.   
  4.  
  5. use Yii; 
  6.  
  7. use app/models/Post; 
  8.  
  9. use yii/web/Controller; 
  10.  
  11. use yii/web/NotFoundHttpException; 
  12.  
  13.   
  14.  
  15. class PostController extends Controller 
  16.  
  17.  
  18.   public function actionView($id
  19.  
  20.   { 
  21.  
  22.     $model = Post::findOne($id); 
  23.  
  24.     if ($model === null) { 
  25.  
  26.       throw new NotFoundHttpException; 
  27.  
  28.     } 
  29.   
  30.  
  31.     // 渲染一个名称为"view"的视图并使用布局 
  32.  
  33.     return $this->render('view', [ 
  34.  
  35.       'model' => $model
  36.  
  37.     ]); 
  38.  
  39.   } 
  40.  

小物件

小物件是 CWidget 或其子类的实例.它是一个主要用于表现数据的组件.小物件通常内嵌于一个视图来产生一些复杂而独立的用户界面.例如,一个日历小物件可用于渲染一个复杂的日历界面.小物件使用户界面更加可复用.

我们可以按如下视图脚本来使用一个小物件:

  1. <?php $this->beginWidget('path.to.WidgetClass'); ?> 
  2.  
  3. ...可能会由小物件获取的内容主体... 
  4.  
  5. <?php $this->endWidget(); ?> 

或者

  1. <?php $this->widget('path.to.WidgetClass'); ?> 

后者用于不需要任何 body 内容的组件.

小物件可通过配置来定制它的表现.这是通过调用 CBaseController::beginWidget 或 CBaseController::widget 设置其初始化属性值来完成的.例如,当使用 CMaskedTextField 小物件时,我们想指定被使用的 mask (可理解为一种输出格式,译者注).我们通过传递一个携带这些属性初始化值的数组来实现.这里的数组的键是属性的名称,而数组的值则是小物件属性所对应的值.正如以下所示 :

  1. <?php 
  2.  
  3. $this->widget('CMaskedTextField',array
  4.  
  5.   'mask'=>'99/99/9999' 
  6.  
  7. )); 
  8.  
  9. ?> 

继承 CWidget 并覆盖其init() 和 run() 方法,可以定义一个新的小物件:

  1. class MyWidget extends CWidget 
  2.  
  3.  
  4.   public function init() 
  5.  
  6.   { 
  7.  
  8.     // 此方法会被 CController::beginWidget() 调用 
  9.  
  10.   } 
  11.  
  12.   public function run() 
  13.  
  14.   { 
  15.  
  16.     // 此方法会被 CController::endWidget() 调用 
  17.  
  18.   } 
  19.  

小物件可以像一个控制器一样拥有它自己的视图.默认情况下,小物件的视图文件位于包含了小物件类文件目录的 views 子目录之下.这些视图可以通过调用 CWidget::render() 渲染,这一点和控制器很相似.唯一不同的是,小物件的视图没有布局文件支持。另外,小物件视图中的$this指向小物件实例而不是控制器实例。

视图中渲染

可以在视图中渲染另一个视图,可以调用yii/base/View视图组件提供的以下方法:

yii/base/View::render(): 渲染一个 视图名.

yii/web/View::renderAjax(): 渲染一个 视图名 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。

yii/base/View::renderFile(): 渲染一个视图文件目录或别名下的视图文件。
例如,视图中的如下代码会渲染该视图所在目录下的 _overview.php 视图文件, 记住视图中 $this 对应 yii/base/View 组件:

<?= $this->render('_overview') ?>

其他地方渲染

在任何地方都可以通过表达式 Yii::$app->view 访问 yii/base/View 应用组件, 调用它的如前所述的方法渲染视图,例如:

// 显示视图文件 "@app/views/site/license.php"

echo /Yii::$app->view->renderFile('@app/views/site/license.php');

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表