**YII** 系列十应用结构中的视图

>视图简介


>>主要是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\Widget::render(): 渲染一个 视图名.
  • yii\base\Widget::renderFile(): 渲染一个视图文件目录或 别名下的视图文件。
>>视图中渲染

  • 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>&copy; 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标签是在布局中生成
$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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值