<!-- 控制器传值 -->
<?php $view = Yii::$app->view->params['data'] = '这是要传递的数据';?>
<!-- foreach 变例数组 -->
<?php foreach ($this->params['data'] as $result):?>
<li>
<?php echo"<li><a href=".$result['url']." >".$result['catname']."</a></li>";?>
</li>
<?php endforeach; ?>
<!-- 控制器传值 -->
return $this->render('index',[
'name'=>'12312',
]);
<!-- view 变例数组 -->
<?= $name ?>
render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。
renderPartial(): 渲染一个 视图名 并且不使用布局。
renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
别名下的视图文件。
安全
当创建生成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在保证输出数据安全上做的不错,但性能不佳,如果你的应用需要高性能可考虑 缓存 过滤后的结果。
使用数据块
数据块可以在一个地方指定视图内容在另一个地方显示,通常和布局一起使用, 例如,可在内容视图中定义数据块在布局中显示它。
调用 beginBlock() 和 endBlock() 来定义数据块, 使用 $view->blocks[$blockID]
访问该数据块, 其中 $blockID
为定义数据块时指定的唯一标识ID。
如下实例显示如何在内容视图中使用数据块让布局使用。
首先,在内容视图中定一个或多个数据块:
...
<?php $this->beginBlock('block1'); ?>
...content of block1...
<?php $this->endBlock(); ?>
...
<?php $this->beginBlock('block3'); ?>
...content of block3...
<?php $this->endBlock(); ?>
然后,在布局视图中,数据块可用的话会渲染数据块, 如果数据未定义则显示一些默认内容。
...
<?php if (isset($this->blocks['block1'])): ?>
<?= $this->blocks['block1'] ?>
<?php else: ?>
... default content for block1 ...
<?php endif; ?>
...
<?php if (isset($this->blocks['block2'])): ?>
<?= $this->blocks['block2'] ?>
<?php else: ?>
... default content for block2 ...
<?php endif; ?>
...
<?php if (isset($this->blocks['block3'])): ?>
<?= $this->blocks['block3'] ?>
<?php else: ?>
... default content for block3 ...
<?php endif; ?>
...
控制器中渲染
在 控制器 中,可调用以下控制器方法来渲染视图:
- render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。
- renderPartial(): 渲染一个 视图名 并且不使用布局。
- renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
-
别名下的视图文件。
- renderContent(): renders a static string by embedding it into the currently applicable layout. This method is available since version 2.0.1.
例如:
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,
]);
}
}
小部件中渲染
在 小部件 中,可调用以下小部件方法来渲染视图:
例如:
namespace app\components;
use yii\base\Widget;
use yii\helpers\Html;
class ListWidget extends Widget
{
public $items = [];
public function run()
{
// 渲染一个名为 "list" 的视图
return $this->render('list', [
'items' => $this->items,
]);
}
}
视图中渲染
可以在视图中渲染另一个视图,可以调用view component视图组件提供的以下方法:
- render(): 渲染一个 视图名.
- renderAjax(): 渲染一个 视图名 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
-
别名下的视图文件。
例如,视图中的如下代码会渲染该视图所在目录下的 _overview.php
视图文件, 记住视图中 $this
对应 view 组件:
<?= $this->render('_overview') ?>
其他地方渲染
在任何地方都可以通过表达式 Yii::$app->view
访问 view 应用组件, 调用它的如前所述的方法渲染视图,例如:
// 显示视图文件 "@app/views/site/license.php"
echo \Yii::$app->view->renderFile('@app/views/site/license.php');
如控制器中渲染一节描述, 当控制器调用render() 方法渲染视图时,会同时使用布局到渲染结果中,默认会使用@app/views/layouts/main.php
布局文件。
可配置yii\base\Application::$layout 或 yii\base\Controller::$layout 使用其他布局文件, 前者管理所有控制器的布局,后者覆盖前者来控制单个控制器布局。 例如,如下代码使 post
控制器渲染视图时使用 @app/views/layouts/post.php
作为布局文件, 假如 layout
属性没改变, 控制器默认使用 @app/views/layouts/main.php
作为布局文件。
namespace app\controllers;
use yii\web\Controller;
class PostController extends Controller
{
public $layout = 'post';
// ...
}
对于模块中的控制器,可配置模块的 layout 属性指定布局文件应用到模块的所有控制器。
由于layout
可在不同层级(控制器、模块,应用)配置, 在幕后Yii使用两步来决定控制器实际使用的布局。
第一步,它决定布局的值和上下文模块:
- 如果控制器的 yii\base\Controller::$layout 属性不为空null,使用它作为布局的值, 控制器的 module模块 作为上下文模块。
- 如果 layout 为空,从控制器的祖先模块(包括应用) 开始找 第一个layout 属性不为空的模块,使用该模块作为上下文模块, 并将它的layout 的值作为布局的值, 如果都没有找到,表示不使用布局。
第二步,它决定第一步中布局的值和上下文模块对应到实际的布局文件, 布局的值可为:
- 路径别名 (如
@app/views/layouts/main
). - 绝对路径 (如
/main
): 布局的值以斜杠开始, 在应用的yii\base\Application::layoutPath 布局路径 中查找实际的布局文件,布局路径默认为@app/views/layouts
。 - 相对路径 (如
main
): 在上下文模块的yii\base\Module::layoutPath布局路径中查找实际的布局文件, 布局路径默认为yii\base\Module::basePath 模块目录下的views/layouts
目录。 - 布尔值
false
: 不使用布局。
布局的值没有包含文件扩展名,默认使用 .php
作为扩展名。