Yii框架小部件(Widgets)用法实例详解


Posted in PHP onMay 15, 2020

本文实例讲述了Yii框架小部件(Widgets)用法。分享给大家供大家参考,具体如下:

小部件 ¶

小部件是在 视图 中使用的可重用单元, 使用面向对象方式创建复杂和可配置用户界面单元。 例如,日期选择器小部件可生成一个精致的允许用户选择日期的日期选择器, 你只需要在视图中插入如下代码:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget(['name' => 'date']) ?>

Yii提供许多优秀的小部件,比如active form, menu, jQuery UI widgets, Twitter Bootstrap widgets。 接下来介绍小部件的基本知识,如果你想了解某个小部件请参考对应的类API文档。

使用小部件

小部件基本上在views中使用, 在视图中可调用 yii\base\Widget::widget() 方法使用小部件。 该方法使用 配置 数组初始化小部件并返回小部件渲染后的结果。 例如如下代码插入一个日期选择器小部件,它配置为使用俄罗斯语, 输入框内容为$modelfrom_date属性值。

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([
  'model' => $model,
  'attribute' => 'from_date',
  'language' => 'ru',
  'dateFormat' => 'php:Y-m-d',
]) ?>

一些小部件可在yii\base\Widget::begin() 和 yii\base\Widget::end() 调用中使用数据内容。 例如如下代码使用yii\widgets\ActiveForm小部件生成一个登录表单, 小部件会在begin() 和0 end()执行处分别生成<form>的开始标签和结束标签, 中间的任何代码也会被渲染。

<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?>
 
<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
 
  <?= $form->field($model, 'username') ?>
 
  <?= $form->field($model, 'password')->passwordInput() ?>
 
  <div class="form-group">
    <?= Html::submitButton('Login') ?>
  </div>
 
<?php ActiveForm::end(); ?>

注意和调用 yii\base\Widget::widget() 返回渲染结果不同, 调用 yii\base\Widget::begin() 方法返回一个可组建小部件内容的小部件实例。

注意: 当调用 yii\base\Widget::end() 的时候,一些小部件将使用 输出缓冲 来调整封闭的内容。因此,当调用 yii\base\Widget::begin() 和 yii\base\Widget::end() 时,最好在同一个视图文件里。 不遵循这个规则可能会导致意外的输出。

配置全局默认值

小部件的全局默认值可以通过 DI 容器配置:

\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]);

详见 依赖注入容器 "实践中的应用" 一节 。

创建小部件

继承 yii\base\Widget 类并覆盖 yii\base\Widget::init() 和/或 yii\base\Widget::run() 方法可创建小部件。通常init() 方法处理小部件属性, run() 方法包含小部件生成渲染结果的代码。 渲染结果可在run()方法中直接"echoed"输出或以字符串返回。

如下代码中HelloWidget编码并显示赋给message 属性的值, 如果属性没有被赋值,默认会显示"Hello World"。

namespace app\components;
 
use yii\base\Widget;
use yii\helpers\Html;
 
class HelloWidget extends Widget
{
  public $message;
 
  public function init()
  {
    parent::init();
    if ($this->message === null) {
      $this->message = 'Hello World';
    }
  }
 
  public function run()
  {
    return Html::encode($this->message);
  }
}

使用这个小部件只需在视图中简单使用如下代码:

<?php
use app\components\HelloWidget;
?>
<?= HelloWidget::widget(['message' => 'Good morning']) ?>

以下是另一种可在begin()end()调用中使用的HelloWidget, HTML编码内容然后显示。

namespace app\components;
 
use yii\base\Widget;
use yii\helpers\Html;
 
class HelloWidget extends Widget
{
  public function init()
  {
    parent::init();
    ob_start();
  }
 
  public function run()
  {
    $content = ob_get_clean();
    return Html::encode($content);
  }
}

如上所示,PHP输出缓冲在init()启动,所有在init()run()方法之间的输出内容都会被获取,并在run()处理和返回。

信息: 当你调用 yii\base\Widget::begin() 时会创建一个新的小部件 实例并在构造结束时调用init()方法, 在end()时会调用run()方法并输出返回结果。

如下代码显示如何使用这种 HelloWidget:

<?php
use app\components\HelloWidget;
?>
<?php HelloWidget::begin(); ?>
 
  content that may contain <tag>'s
 
<?php HelloWidget::end(); ?>

有时小部件需要渲染很多内容,一种更好的办法是将内容放入一个视图文件, 然后调用yii\base\Widget::render()方法渲染该视图文件, 例如:

public function run()
{
  return $this->render('hello');
}

小部件的视图文件默认存储在WidgetPath/views目录,WidgetPath代表小部件类文件所在的目录。 假如上述示例小部件类文件在@app/components下, 会渲染@app/components/views/hello.php视图文件。 You may override 可以覆盖yii\base\Widget::getViewPath()方法自定义视图文件所在路径。

最佳实践

小部件是面向对象方式来重用视图代码。

创建小部件时仍需要遵循MVC模式,通常逻辑代码在小部件类, 展示内容在视图中。

小部件设计时应是独立的,也就是说使用一个小部件时候, 可以直接丢弃它而不需要额外的处理。 但是当小部件需要外部资源如CSS, JavaScript, 图片等会比较棘手, 幸运的时候Yii提供 资源包 来解决这个问题。

当一个小部件只包含视图代码,它和视图很相似, 实际上,在这种情况下,唯一的区别是小部件是可以重用类, 视图只是应用中使用的普通PHP脚本。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 PHP
PHP判断表达式中括号是否匹配的简单实例
Oct 22 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
详解使用php调用微信接口上传永久素材
Apr 11 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
Dec 03 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
Yii框架安装简明教程
May 15 #PHP
php字符串函数 str类常见用法示例
May 15 #PHP
PHP数组array类常见操作示例
May 15 #PHP
php数值计算num类简单操作示例
May 15 #PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
May 15 #PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 #PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 #PHP
You might like
PHP 引用文件技巧
2010/03/02 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
python框架flask表单实现详解
2019/11/04 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
Django values()和value_list()的使用
2020/03/31 Python
Django如何使用redis作为缓存
2020/05/21 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
农村婚庆主持词
2015/06/29 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
Java 死锁解决方案
2022/05/11 Java/Android