Yii的HTML助手
Html 帮助类
任何一个 web 应用程序会生成很多 HTMl 超文本标记。如果超文本标记是静态的, 那么将 PHP 和 HTML 混合在一个文件里 这种做法是非常高效的。但是,如果这些超文本标记是动态生成的,那么如果没有额外的辅助工具,这个过程将会变得复杂。 Yii 通过 HTML 帮助类来提供生成超文本标记的方法。这个帮助类包含有一系列的用于处理通用的 HTML 标签和其属性以及内容的静态方法。
注意:如果你的超文本标记接近静态的,那么最好是直接使用 HTML。 没有必要把所有的超文本标记都用 HTML 辅助类来生成。
基础
由于通过字符串连接来生成动态的 HTML 会很容易变得凌乱, Yii 提供了一系列的静态方法来操作标签配置并基于这些配置来创建对应的标签。
生成标签
生成一个标签的代码类似如下:
<?= Html::tag('p', Html::encode($user->name), ['class' => 'username']) ?>
这个方法的第一个参数是标签名称。第二个是要装入到开始和结束标签间的内容。 注意到我们使用 Html::encode
。那是因为内容不会被自动的转码以允许在有需要的时候嵌套 HTML。 第三个参数是一个 HTML 配置数组,或者换言之,标签属性。在这个数组中,数组的下标是属性名称, 比如 class
,href
或者 target
,而值则是对应属性的值。
以上代码会生成如下 HTML :
<p class="username">samdark</p>
如果你只需要开启一个标签或者关闭一个标签,你可以使用 Html::beginTag()
和 Html::endTag()
方法。
标签属性( Options )在 Html 帮助类很多方法和大量的小部件中都有使用。在这些情况下, 有一些额外的处理我们需要知道:
- 如果一个值为 null ,那么对应的属性将不会被渲染。
- 如果是布尔类型的值的属性,将会被当做 布尔属性 来处理。
- 属性的值将会用 yii\helpers\Html::encode() 方法进行 HTML 转码处理。
如果一个属性的值是一个数组,那么它将会被如下处理:
- 如果这个属性是一个如 yii\helpers\Html::$dataAttributes 所列的数据属性, 比如
data
或者ng
,一系列的属性列表将会被渲染,每个代表值数组中的元素。 比如:'data' => ['id' => 1, 'name' => 'yii']
将会生成data-id="1" data-name="yii"
;'data' => ['params' => ['id' => 1, 'name' => 'yii'], 'status' => 'ok']
生成data-params='{"id":1,"name":"yii"}' data-status="ok"
。 注意后者 中,一个子数组被输出为 JSON 。 - 如果这个属性不是一个数据属性,那么值将会被 JSON-encoded。比如:
['params' => ['id' => 1, 'name' => 'yii']
生成params='{"id":1,"name":"yii"}'
。
- 如果这个属性是一个如 yii\helpers\Html::$dataAttributes 所列的数据属性, 比如
生成 CSS 类和样式
当开始构造一个 HTML 标签的属性时,我们经常需要对默认的属性进行修改。 为了添加或者删除 CSS 类,你可以使用如下代码:
$options = ['class' => 'btn btn-default'];
if ($type === 'success') {
Html::removeCssClass($options, 'btn-default');
Html::addCssClass($options, 'btn-success');
}
echo Html::tag('div', 'Pwede na', $options);
// in case of $type of 'success' it will render
// <div class="btn btn-success">Pwede na</div>
基于同样的目的,针对 style
属性:
$options = ['class' => ['btn', 'btn-default']];
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-default">Save</div>'
While adding or removing classes you may use the array format as well:
$options = ['class' => 'btn'];
if ($type === 'success') {
Html::addCssClass($options, ['btn-success', 'btn-lg']);
}
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-success btn-lg">Save</div>'
Html::addCssClass()
prevents duplicating classes, so you don't need to worry that the same class may appear twice:
$options = ['class' => 'btn btn-default'];
Html::addCssClass($options, 'btn-default'); // class 'btn-default' is already present
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-default">Save</div>'
If the CSS class option is specified via the array format, you may use a named key to mark the logical purpose of the class. In this case, a class with the same key in the array format will be ignored in Html::addCssClass()
:
$options = [
'class' => [
'btn',
'theme' => 'btn-default',
]
];
Html::addCssClass($options, ['theme' => 'btn-success']); // 'theme' key is already taken
echo Html::tag('div', 'Save', $options);
// renders '<div class="btn btn-default">Save</div>'
CSS styles can be setup in similar way using style
attribute:
$options = ['style' => ['width' => '100px', 'height' => '100px']];
// gives style="width: 100px; height: 200px; position: absolute;"
Html::addCssStyle($options, 'height: 200px; position: absolute;');
// gives style="position: absolute;"
Html::removeCssStyle($options, ['width', 'height']);
当使用 yii\helpers\Html::addCssStyle() 方法时,你可以指定一个和 CSS 属性相关的名值对的数组, 也可以直接是一个类似 width: 100px; height: 200px;
的字符串。这些格式将会自动的被 yii\helpers\Html::cssStyleFromArray() 和yii\helpers\Html::cssStyleToArray() 方法进行转换。方法 yii\helpers\Html::removeCssStyle() 接收一个包含要被移除的属性数组作为参数。 如果只想移除一个属性,你可以直接传递一个字符串。
标签内容的转码和解码
为了让内容能够正确安全的显示,一些 HTML 特殊字符应该被转码。在 PHP 中, 这个操作由 htmlspecialchars 和 htmlspecialchars_decode 完成。 直接使用这些方法的问题是,你总是需要指定转码所需的额外标志。由于标志一般总是不变的,而内容转码的过程为了避免一些安全问题, 需要和应用的默认过程匹配, Yii 提供了两个简单可用的对 PHP 原生方法的封装:
$userName = Html::encode($user->name);
echo $userName;
$decodedUserName = Html::decode($userName);
表单
处理表单标签是大量的重复性劳动并且易错。因此, Yii 也提供了一系列的方法来辅助处理表单标签。
注意: 考虑在处理 models 以及需要验证的情形下,使用 ActiveForm 组件。
创建表单
表单可以用类似如下代码,使用 yii\helpers\Html::beginForm() 方法开启:
<?= Html::beginForm(['order/update', 'id' => $id], 'post', ['enctype' => 'multipart/form-data']) ?>
方法的第一个参数为表单将要被提交的 URL 地址。它可以以 Yii 路由的形式被指定,并由 yii\helpers\Url::to() 来接收处理。 第二个参数是使用的方法,默认为 post
方法。第三个参数为表单标签的属性数组。在上面的例子中, 我们把编码 POST 请求中的表单数据的方式改为 multipart/form-data
。 如果是上传文件,这个调整是必须的。
关闭表单标签非常简单:
<?= Html::endForm() ?>
按钮
你可以用如下代码生成按钮:
<?= Html::button('Press me!', ['class' => 'teaser']) ?>
<?= Html::submitButton('Submit', ['class' => 'submit']) ?>
<?= Html::resetButton('Reset', ['class' => 'reset']) ?>
上述三个方法的第一个参数为按钮的标题,第二个是标签属性。标题默认没有进行转码,如果标题是由终端用输入的, 那么请自行用 yii\helpers\Html::encode() 方法进行转码。
输入栏
input 相关的方法有两组:以 active
开头的被称为 active inputs, 另一组则不以其开头。active inputs 依据指定的模型和属性获取数据, 而普通 input 则是直接指定数据。
一般用法如下:
type, input name, input value, options
<?= Html::input('text', 'username', $user->name, ['class' => $username]) ?>
type, model, model attribute name, options
<?= Html::activeInput('text', $user, 'name', ['class' => $username]) ?>
如果你知道 input 类型,更方便的做法是使用以下快捷方法:
- yii\helpers\Html::buttonInput()
- yii\helpers\Html::submitInput()
- yii\helpers\Html::resetInput()
- yii\helpers\Html::textInput(), yii\helpers\Html::activeTextInput()
- yii\helpers\Html::hiddenInput(), yii\helpers\Html::activeHiddenInput()
- yii\helpers\Html::passwordInput() / yii\helpers\Html::activePasswordInput()
- yii\helpers\Html::fileInput(), yii\helpers\Html::activeFileInput()
- yii\helpers\Html::textarea(), yii\helpers\Html::activeTextarea()
Radios 和 checkboxes 在方法的声明上有一点点不同:
<?= Html::radio('agree', true, ['label' => 'I agree']);
<?= Html::activeRadio($model, 'agree', ['class' => 'agreement'])
<?= Html::checkbox('agree', true, ['label' => 'I agree']);
<?= Html::activeCheckbox($model, 'agree', ['class' => 'agreement'])
Dropdown list 和 list box 将会如下渲染:
<?= Html::dropDownList('list', $currentUserId, ArrayHelper::map($userModels, 'id', 'name')) ?>
<?= Html::activeDropDownList($users, 'id', ArrayHelper::map($userModels, 'id', 'name')) ?>
<?= Html::listBox('list', $currentUserId, ArrayHelper::map($userModels, 'id', 'name')) ?>
<?= Html::activeListBox($users, 'id', ArrayHelper::map($userModels, 'id', 'name')) ?>
第一个参数是 input 的名称,第二个是当前选中的值,第三个则是一个下标为列表值, 值为列表标签的名值对数组。
如果你需要使用多项选择, checkbox list 应该能够符合你的需求:
<?= Html::checkboxList('roles', [16, 42], ArrayHelper::map($roleModels, 'id', 'name')) ?>
<?= Html::activeCheckboxList($user, 'role', ArrayHelper::map($roleModels, 'id', 'name')) ?>
否则,用 radio list :
<?= Html::radioList('roles', [16, 42], ArrayHelper::map($roleModels, 'id', 'name')) ?>
<?= Html::activeRadioList($user, 'role', ArrayHelper::map($roleModels, 'id', 'name')) ?>
Labels 和 Errors
如同 inputs 一样,Yii 也提供了两个方法用于生成表单 label 。 带 ative 方法用于从 model 中取数据,另外一个则是直接接收数据。
<?= Html::label('User name', 'username', ['class' => 'label username']) ?>
<?= Html::activeLabel($user, 'username', ['class' => 'label username'])
为了从一个或者一组 model 中显示表单的概要错误,你可以使用如下方法:
<?= Html::errorSummary($posts, ['class' => 'errors']) ?>
为了显示单个错误:
<?= Html::error($post, 'title', ['class' => 'error']) ?>
Input 的名和值
Yii 提供了方法用于从 model 中获取 input 的名称,ids,值。这些主要用于内部调用, 但是有时候你也需要使用它们:
// Post[title]
echo Html::getInputName($post, 'title');
// post-title
echo Html::getInputId($post, 'title');
// my first post
echo Html::getAttributeValue($post, 'title');
// $post->authors[0]
echo Html::getAttributeValue($post, '[0]authors[0]');
在上面的例子中,第一个参数为模型,而第二个参数是属性表达式。 在最简单的表单中,这个属性表达式就是属性名称,但是在一些多行输入的时候, 它也可以是属性名以数组下标前缀或者后缀(也可能是同时)。
[0]content
代表多行输入时第一个 model 的 content 属性的数据值。dates[0]
代表 dates 属性的第一个数组元素。[0]dates[0]
代表多行输入时第一个 model 的 dates 属性的第一个数组元素。
为了获取一个没有前缀或者后缀的属性名称,我们可以如下做:
// dates
echo Html::getAttributeName('dates[0]');
样式表和脚本
Yii 提供两个方法用于生成包含内联样式和脚本代码的标签。
<?= Html::style('.danger { color: #f00; }') ?>
Gives you
<style>.danger { color: #f00; }</style>
<?= Html::script('alert("Hello!");', ['defer' => true]);
Gives you
<script defer>alert("Hello!");</script>
如果你想要外联 css 样式文件,可以如下做:
<?= Html::cssFile('@web/css/ie5.css', ['condition' => 'IE 5']) ?>
generates
<!--[if IE 5]>
<link href="http://example.com/css/ie5.css" />
<![endif]-->
第一个参数是 URL。第二个参数是标签属性数组。比普通的标签配置项额外多出的是,你可以指定:
condition
来让<link
被条件控制注释包裹( IE hacker )。 希望你在未来不再需要条件控制注释。noscript
可以被设置为true
,这样<link
就会被<noscript>
包裹,如此那么这段代码只有在浏览器不支持 JavaScript 或者被用户禁用的时候才会被引入进来。
为了外联 JavaScript 文件:
<?= Html::jsFile('@web/js/main.js') ?>
这个方法的第一个参数同 CSS 一样用于指定外联链接。第二个参数是一个标签属性数组。 同 cssFile
一样,你可以指定 condtion
配置项。
超链接
有一个方法可以用于便捷的生成超链接:
<?= Html::a('Profile', ['user/view', 'id' => $id], ['class' => 'profile-link']) ?>
第一个参数是超链接的标题。它不会被转码,所以如果是用户输入数据, 你需要使用 Html::encode()
方法进行转码。第二个参数是 <a
标签的 href
属性的值。 关于该参数能够接受的更详细的数据值,请参阅 Url::to()。第三个参数是标签的属性数组。
在需要的时候,你可以用如下代码生成 mailto
链接:
<?= Html::mailto('Contact us', 'admin@example.com') ?>
图片
为了生成图片标签,你可以如下做:
<?= Html::img('@web/images/logo.png', ['alt' => 'My logo']) ?>
generates
<img src="http://example.com/images/logo.png" alt="My logo" />
除了 aliases 之外,第一个参数可以接受 路由,查询,URLs。 同 Url::to() 一样。
列表
无序列表可以如下生成:
<?= Html::ul($posts, ['item' => function($item, $index) {
return Html::tag(
'li',
$this->render('post', ['item' => $item]),
['class' => 'post']
);
}]) ?>
有序列表请使用 Html::ol()
方法。
Yii的HTML助手的更多相关文章
- Yii的URL助手
Url 帮助类 获得通用 URL 记住 URLs 检查相对 URLs Url 帮助类提供一系列的静态方法来帮助管理 URL. 获得通用 URL 有两种获取通用 URLS 的方法 :当前请求的 home ...
- Yii的数组助手类
获取值 用原生PHP从一个对象.数组.或者包含这两者的一个复杂数据结构中获取数据是非常繁琐的. 你首先得使用isset 检查 key 是否存在, 然后如果存在你就获取它,如果不存在, 则提供一个默认返 ...
- Yii提供的Htmler助手checkboxList可自定义Checkbox输出格式
foreach($catetags as $cate){ echo Html::checkboxList('category_id','',$cate,['item'=>'customCheck ...
- YII 的源码分析(-)
做为源码分析的首秀,我就挑了yii(读作歪依依而不是歪爱爱):它的赞美之词我就不多说了,直接入正题.先准备材料,建议直从官网下载yii的源码包(1.1.15). 在demos里边有一个最简单的应用—h ...
- Yii 框架学习--02 进阶
应用结构 入口文件 文件位置: web/index.php <?php //开启debug,应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆栈 defined('YII_DEBUG' ...
- (转)yii流程,入口文件下的准备工作
yii流程 一 目录文件 |-framework 框架核心库 |--base 底层类库文件夹,包含CApplication(应用类,负责全局的用户请求处理,它管理的应用组件集, ...
- Yii CActiveForm
http://blog.sina.com.cn/s/blog_685213e70101mo4i.html 文档: http://www.yiiframework.com/doc/api/1.1/CAc ...
- YII中的表单挂件
利用助手(widget)在页面实现表单 控制器中 <?php class YiiFormController extends Controller { public function actio ...
- yii快速入门与参考
Yii 权威指南 http://www.yiichina.com/guide/ http://www.yiiframework.com/doc/guide/1.1/zh_cn/ Ⅰ.基本概念一.入口文 ...
随机推荐
- arduino扩展IO与M74HC595B芯片的使用,挪车电话提示牌的设计
2018-01-0915:39:24 视频连接 首先arduino中shiftOUT()函数的定义与说明! shiftOut()描述将一个数据的一个字节一位一位的移出.从最高有效位(最左边)或最低有效 ...
- iris数据集 决策树实现分类并画出决策树
# coding=utf-8 import pandas as pd from sklearn.model_selection import train_test_split from sklearn ...
- python_如何在列表、字典中筛选数据?
实际问题有哪些? 过滤掉列表[3,9,-1,10.-2......] 中负数 筛选出字典{'li_ming':90,'xiao_hong':60,'li_kang':95,'bei_men':98} ...
- 【转】shell学习笔记(二) ——shell变量
在shell中有3种变量:系统变量,环境变量和用户变量,其中系统变量在对参数判断和命令返回值判断时会使用,环境变量主要是在程序运行时需要设置,用户变量在编程过程中使用量最多. 1 系统变量 变量名 ...
- Java并发系列[3]----AbstractQueuedSynchronizer源码分析之共享模式
通过上一篇的分析,我们知道了独占模式获取锁有三种方式,分别是不响应线程中断获取,响应线程中断获取,设置超时时间获取.在共享模式下获取锁的方式也是这三种,而且基本上都是大同小异,我们搞清楚了一种就能很快 ...
- Tomcat修改端口号(7.0 version)
目的:有时端口号可能其他服务占用,就需要修改一下Tomcat的端口号,避免冲突. 自我总结,有什么需要改正的地方,请大家补充,感激不尽! 找到Tomcat的的配置文件server.xml 路径:%to ...
- char a[]和char *a的比较
指针和数组存在着一些本质的区别.当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作 为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是 ...
- [DeeplearningAI笔记]02_3.1-3.2超参数搜索技巧与对数标尺
Hyperparameter search 超参数搜索 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1 调试处理 需要调节的参数 级别一:\(\alpha\)学习率是最重要的需要调节的 ...
- java之Servlet监听器Listener
常用应用场景:单点登录.统计在线人数 一.简介 (一)概述 1.Listener 用于监听 java web程序中的事件,例如创建.修改.删除Session.request.context等,并触发响 ...
- 安装memcache及php的memcached模块
下载链接: http://pan.baidu.com/s/1o6MA8lG http://pan.baidu.com/s/1qWO8tMs http://pan.baidu.com/s/1c0iZu1 ...