YII2.0 视图操作


view->params['data'] = '这是要传递的数据';?>

 params['data'] as $result):?>  
                        
  • ".$result['catname']."
  • ";?> return $this->render('index',[ 'name'=>'12312', ]);
    render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。
    renderPartial(): 渲染一个 视图名 并且不使用布局。
    renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。

    别名下的视图文件。


    安全

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

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

    
    use yii\helpers\Html;
    ?>
    
    
    class="username"> Html::encode($user->name) ?> div>

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

    
    use yii\helpers\HtmlPurifier;
    ?>
    
    
    class="post"> HtmlPurifier::process($post->text) ?> div>

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



    使用数据块

    数据块可以在一个地方指定视图内容在另一个地方显示,通常和布局一起使用, 例如,可在内容视图中定义数据块在布局中显示它。

    调用 beginBlock() 和 endBlock() 来定义数据块, 使用 $view->blocks[$blockID] 访问该数据块, 其中 $blockID 为定义数据块时指定的唯一标识ID。

    如下实例显示如何在内容视图中使用数据块让布局使用。

    首先,在内容视图中定一个或多个数据块:

    ...
    
     $this->beginBlock('block1'); ?>
    
    ...content of block1...
    
     $this->endBlock(); ?>
    
    ...
    
     $this->beginBlock('block3'); ?>
    
    ...content of block3...
    
     $this->endBlock(); ?>
    

    然后,在布局视图中,数据块可用的话会渲染数据块, 如果数据未定义则显示一些默认内容。

    ...
     if (isset($this->blocks['block1'])): ?>
        = $this->blocks['block1'] ?>
     else: ?>
        ... default content for block1 ...
     endif; ?>
    
    ...
    
     if (isset($this->blocks['block2'])): ?>
        = $this->blocks['block2'] ?>
     else: ?>
        ... default content for block2 ...
     endif; ?>
    
    ...
    
     if (isset($this->blocks['block3'])): ?>
        = $this->blocks['block3'] ?>
     else: ?>
        ... default content for block3 ...
     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,
            ]);
        }
    }
    

    小部件中渲染

    在 小部件 中,可调用以下小部件方法来渲染视图:

    • render(): 渲染一个 视图名.
    • 别名下的视图文件。

    例如:

    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作为扩展名。


    你可能感兴趣的:(YII)