# Yii2视图 [TOC] ## 视图分配`render()`和`renderPartial()`   `render()`和`renderPartial()`之间最大的区别就是:一个是渲染父模板,一个不渲染父模板。   其中`render()`输出父模板的内容,将渲染的内容嵌入父模板;`renderPartial()`则不输出父模板的内容。只对本次渲染的局部内容进行输出。 ```php public function actionIndex() { return $this->renderPartial('index',$data); return $this->render('index',$data); } ```   Yii2默认自带的父模板文件是`<project>/views/layouts/main.php`,我们可以在当前控制器中新增`public $layouts = 'home';`属性将其修改为我们指定的父模板文件是`<project>/views/layouts/home.php`,如: ```php <?php namespace app\controllers; use yii\web\Controller; class HomeController extends Controller { public $layout = 'home'; public function actionIndex() { $str = 'Hello World!'; return $this->render('index',compact('str')); } } ``` ## 渲染视图 ### 使用rander()等渲染view文件的几种方式   在`yii\base\View中findViewFile()`定义匹配规则 1. `别名`开头,路径指定view文件:`@app/views/site/about(.php)` 2. `//`开头,使用**app**目录下的view:`//site/index` 3. `/`开头,使用当前Module中的views:`/site/index` 4. 直接使用字符串(重要): 'index' ### 在控制器中渲染视图 如`$this->render('about')` `Controller::render`会调用`View::render`方法 ### 在view中渲染视图 使用的视图是当前view所在的目录,如在index.php中 ```php $this->render('error',['name'=>'name','message'=>'message'])?> ``` `error.php`文件是`about.php`所在目录下面的`error.php` ### render、renderPartial、renderContent、renderAjax、renderFile 1. `render`显示view和layout 2. `renderPartial`只显示view 3. `renderContent`只渲染layout 4. `renderFile`显示指定的文件,是最基础的方法,其中`renderAjax`,`renderPartial`最终都是调用`renderFile` 5. `renderAjax`只显示view,以ajax方式渲染页面,可以配合js/css实现各种特效 ## 视图文件的相互调用 有时我们需要引入其他模板的视图布局,那么我们可以在模板文件中使用`render()`方法进行引用,如果要引入的视图文件与当前视图文件在一个文件夹下我们直接可以传入视图名称,如果不是可以传入`/控制器名/视图名`,如下: ```html <?= $this->render('about'); ?> <?= $this->render('/site/about'); ?> ``` ## 视图防止XSS攻击 ```html <?php use yii\helpers\Html; use yii\helpers\HtmlPurifier; ?> <p><?= $str; // 输出hello world! 弹出alert ?></p> <p><?= Html::encode($str); // 输出hello world!<script>alert()</script> ?></p> <p><?= HtmlPurifier::process($str); // 输出hello world! ?></p> ```