>视图简介
>>主要是php脚本文件,主要包含html代码和展示类php代码,通过yii\web\View组件来管理。
>创建视图
>>静态视图部分以html代码和js代码为主,所以其中展示类的php代码可能只是一小部分,所以只是穿插在一html代码未知的页面中。
>>$this指向yii\wev\View来管理和渲染这个视图文件
技巧: 将预定义变量列到视图文件头部注释处,这样可被IDE编辑器识别, 也是生成视图文档的好方法。
<span style="font-size:14px;"><?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';
?></span>
>安全
>>在显示数据之前,将用户输入的数据进行转码和过滤,防止跨站点脚本攻击。
<span style="font-size:14px;"><div class="username">
<?= Html::encode($user->name) ?>
</div></span>
在输出用户名之前先将用户名通过<?=?>的方式进行转码成html语言
>>对用户名进行过滤(HtmlPerifier类的作用主要是对html内容进行过滤)
<span style="font-size:14px;"><div class="post">
<?= HtmlPurifier::process($post->text) ?>
</div></span>
有个小的想法可以将如下代码提交内容前进行过滤(纯php也有相同的方法)
>组织视图
>>控制器默认的渲染的视图默认在控制器id文件的文件名下面
>>对小部件的渲染视图默认放在WidgetPath/views目录下面。
>>可以通过getViewPath()函数的重新定义,来获取自定义的视图文件目录
>渲染视图
可以在控制器,小部件或普通视图中调用渲染视图的方法来渲染视图
>>控制器中
- yii\base\Controller::render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果。
- yii\base\Controller::renderPartial(): 渲染一个 视图名 并且不使用布局。
- yii\web\Controller::renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
- yii\base\Controller::renderFile(): 渲染一个视图文件目录或 别名下的视图文件。
- yii\base\Controller::renderContent(): renders a static string by embedding it into the currently applicable layout. This method is available
<span style="font-size:14px;"><span style="white-space:pre"> </span>return $this->render('view', [
'model' => $model,
]</span>
>>小部件中>>视图中渲染
- yii\base\View::render(): 渲染一个 视图名.
- yii\web\View::renderAjax(): 渲染一个 视图名 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
- yii\base\View::renderFile(): 渲染一个视图文件目录或 别名下的视图文件。
不包含文件名的扩展名
以双斜杠开头对应视图文件路径@app/views/...即相对viewPath的相对路径
视图名一旦斜杠开始的绝对路径
>视图中对数据的访问
两种方式:推送和拉取
推送以键值对的形式(更少依赖上下文,需要手动构建数组,繁琐)
拉取使视图组件能够主动获取数据,Yii::$app
>视图间共享数据
使用yii\base\View::params参数实现共享
<span style="font-size:14px;">$this->params['breadcrumbs'][] = 'About Us';</span>
<span style="font-size:14px;">'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],</span>
在相同的命名空间中共享数据,应该是通过静态变量,全局变量等方法实现的
>布局
>>一种特殊的视图,代表多个视图的公共部分(大部分web应用共享使用的部分)
默认路径:@app/views/layouts
<span style="font-size:14px;"><?php $this->beginPage() ?>
<body>
<?php $this->beginBody() ?>
<header>My Company</header>
<?= $content ?>
<footer>© 2014 by My Company</footer>
<?php $this->endBody() ?>
</body>
<?php $this->endPage() ?></span>
$content变量实现了连接到具体视图的功能
- yii\base\View::beginPage(): 该方法应在布局的开始处调用, 它触发表明页面开始的 yii\base\View::EVENT_BEGIN_PAGE 事件。
- yii\base\View::endPage(): 该方法应在布局的结尾处调用, 它触发表明页面结尾的 yii\base\View::EVENT_END_PAGE 时间。
- yii\web\View::head(): 该方法应在HTML页面的
<head>
标签中调用, 它生成一个占位符,在页面渲染结束时会被注册的头部HTML代码 (如,link标签, meta标签)替换。 - yii\web\View::beginBody(): 该方法应在
<body>
标签的开始处调用, 它触发 yii\web\View::EVENT_BEGIN_BODY 事件并生成一个占位符, 会被注册的HTML代码(如JavaScript)在页面主体开始处替换。 - yii\web\View::endBody(): 该方法应在
<body>
标签的结尾处调用, 它触发 yii\web\View::EVENT_END_BODY 事件并生成一个占位符, 会被注册的HTML代码(如JavaScript)在页面主体结尾处替换。
布局中访问数据使用过两个预定义 的变量$this和$content前者是视图本身的属性和方法,后者是控制器发送到视图中待渲染的内容
>>使用布局
>>嵌套布局
>>使用数据块(有点意思)
在使用数据内容视图渲染时使用数据块的代码
<span style="font-size:14px;"><?php $this->beginBlock('block1'); ?>
...content of block1...
<?php $this->endBlock(); ?>
...
<?php $this->beginBlock('block3'); ?>
...content of block3...
<?php $this->endBlock(); ?></span>
在布局视图的不同地方调用数据块
<span style="font-size:14px;"><?php if (isset($this->blocks['block1'])): ?>
<?= $this->blocks['block1'] ?>
<?php else: ?>
... default content for block1 ...
<?php endif; ?></span>
//这让我明白以个有意思的问题,php的一个整体穿插在html等代码中时可以断裂
>视图组件
在视图中调用视图组件,在应用配置中添加下面的内容
<span style="font-size:14px;">'components' => [
'view' => [
'class' => 'app\components\View',
],
// ...
],</span>
作用:片断缓存,主题修改,客户脚本处理,资源包注册和渲染,模板引擎
>其它附加内容
>>主题设置$this ->title='my page titile'
>>meta标签是在布局中生成
>>meta标签是在布局中生成
$this -> registerMetaTag(['name'= 'keywords','content'=>'yii,framework ,php']);
>>注册链接标签
<span style="font-size:14px;">$this->registerLinkTag([
'title' => 'Live News for Yii',
'rel' => 'alternate',
'type' => 'application/rss+xml',
'href' => 'http://www.yiiframework.com/rss.xml/',
]);</span>
>>视图中的事件
- yii\base\View::EVENT_BEFORE_RENDER: 在控制器渲染文件开始时触发, 该事件可设置 yii\base\ViewEvent::isValid 为 false 取消视图渲染。
- yii\base\View::EVENT_AFTER_RENDER: 在布局中调用 yii\base\View::beginPage() 时触发, 该事件可获取yii\base\ViewEvent::output的渲染结果, 可修改该属性来修改渲染结果。
- yii\base\View::EVENT_BEGIN_PAGE: 在布局调用 yii\base\View::beginPage() 时触发;
- yii\base\View::EVENT_END_PAGE: 在布局调用 yii\base\View::endPage() 是触发;
- yii\web\View::EVENT_BEGIN_BODY: 在布局调用 yii\web\View::beginBody() 时触发;
- yii\web\View::EVENT_END_BODY: 在布局调用 yii\web\View::endBody() 时触发。
<span style="font-size:14px;">\Yii::$app->view->on(View::EVENT_END_BODY, function () {
echo date('Y-m-d');
});</span>
<span style="font-size:14px;">public function actionAbout()
{
return $this->render('about');
}</span>
//不传递任何参数
>yii\base\view类的补充
$blocks array alist of named out[ut blocks
$cacheStak array a list of currently active fragment cache widgets
$context yii\base\ViewContextInterface the context under renderFile()method
$defaultExtension string the default view file extension
$dynamicPlaceholders array alist of placehholders from emvedding dynamic contension
$params mixed custom parameter that are shared among view templages
$renderers array a list of available renderers indexed by their corresponding supproted file extensions
$theme theme/ array /string
$viewFile
>>关于事件和行为
addDynamicPlaceholder($placeholder,$statements)
attach behaviors() 绑定事件
attach behavior()
detachBehavior()解除事件绑定
detachBehaviors()
ensureBehaviors()
getBehavior()
getBehaviors()
trigger()
>>获取性质
getViewFile()
hasEventHandlers()
hasMethod()
hasProperty()
>>在视图中渲染
render($view, $params = [], $context = null)内容被分配给的视图,能够在以后通过$context显示在视图中
renderDynamic()
renderFile()
renderPhpFiler
>>添加事件的方法
afterRender($viewFile,$params,<b>&</b>$output)调用render后绑定事件EVEN_AFTER_RENDER
beforeRender($viewFile,$params)绑定事件EVENT_BEFORE_RENDER
beginBlock($id, $renderInPlace = false)
endBlock()
beginCache( $id, $properties = [])
endCache()
beginContent($viewFile, $params = [])
endContent()
beginPage()
endPage()
>类的学习进度
>>yii\helpers\HtmlPurifiler
>>yii]helpers\Html
>>yii\base\view