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


Posted in PHP onMarch 29, 2016

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

创建视图

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

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\LoginForm */

$this->title = 'Login';
?>
<h1><?= Html::encode($this->title) ?></h1>

<p>Please fill out the following fields to login:</p>

<?php $form = ActiveForm::begin(); ?>
  <?= $form->field($model, 'username') ?>
  <?= $form->field($model, 'password')->passwordInput() ?>
  <?= Html::submitButton('Login') ?>
<?php ActiveForm::end(); ?>

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

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

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

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

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

<?php
use yii\helpers\Html;
?>

<div class="username">
  <?= Html::encode($user->name) ?>
</div>

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

<?php
use yii\helpers\HtmlPurifier;
?>

<div class="post">
  <?= HtmlPurifier::process($post->text) ?>
</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() 方法来自定义视图文件默认目录。

渲染视图

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

/**
 * @param string $view 视图名或文件路径,由实际的渲染方法决定
 * @param array $params 传递给视图的数据
 * @return string 渲染结果
 */
methodName($view, $params = [])

控制器中渲染

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

  • yii\base\Controller::render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。
  • yii\base\Controller::renderPartial(): 渲染一个 视图名 并且不使用布局。
  • yii\web\Controller::renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
  • yii\base\Controller::renderFile(): 渲染一个视图文件目录或别名下的视图文件。

例如:

namespace app\controllers;

use Yii;
use app\models\Post;
use yii\web\Controller;
use yii\web\NotFoundHttpException;

class PostController extends Controller
{
  public function actionView($id)
  {
    $model = Post::findOne($id);
    if ($model === null) {
      throw new NotFoundHttpException;
    }

    // 渲染一个名称为"view"的视图并使用布局
    return $this->render('view', [
      'model' => $model,
    ]);
  }
}

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

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

<?php $this->beginWidget('path.to.WidgetClass'); ?>
...可能会由小物件获取的内容主体...
<?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()
  {
    // 此方法会被 CController::beginWidget() 调用
  }
 
  public function run()
  {
    // 此方法会被 CController::endWidget() 调用
  }
}

小物件可以像一个控制器一样拥有它自己的视图.默认情况下,小物件的视图文件位于包含了小物件类文件目录的 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');
PHP 相关文章推荐
模板引擎正则表达式调试小技巧
Jul 20 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
PHP操作文件的一些基本函数使用示例
Nov 18 PHP
PHP文件缓存类示例分享
Jan 30 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 PHP
php插入含有特殊符号数据的处理方法
Nov 24 PHP
PHP简单读取xml文件的方法示例
Apr 20 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
PHP实现网站应用微信登录功能详解
Apr 11 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 #PHP
php ajax异步读取rss文档数据
Mar 29 #PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 #PHP
详解PHP匿名函数与注意事项
Mar 29 #PHP
php ajax实现文件上传进度条
Mar 29 #PHP
php $_SESSION会员登录实例分享
Jan 19 #PHP
PHP实现163邮箱自动发送邮件
Mar 29 #PHP
You might like
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
javascript 必知必会之closure
2009/09/21 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
JavaScript动态加载重复绑定问题
2018/04/01 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
新闻专业应届生求职信
2013/10/31 职场文书
运动会表扬稿大全
2014/01/16 职场文书
遗体告别仪式主持词
2014/03/20 职场文书
小学同学聚会感言
2015/07/30 职场文书
关于环保的广播稿
2015/12/17 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
oracle索引总结
2021/09/25 Oracle