YII2.0 视图操作

<!-- 控制器传值 -->
<?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视图组件提供的以下方法:

例如,视图中的如下代码会渲染该视图所在目录下的 _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作为扩展名。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值