一、创建一个简单的小部件

namespace common\components; //common需要自己先设定一个别名

use yii\base\Widget; //小部件需要继承的基类
use yii\helpers\Html; class HelloWidget extends Widget
{
public $message; //使用小部件时传递的参数 /**
* init() 方法处理小部件属性,
*/
public function init()
{
parent::init(); // TODO: Change the autogenerated stub
if($this->message == null){
$this->message = 'Hello World';
}
}
/**
* run() 方法包含小部件生成渲染结果的代码。
* 渲染结果可在run()方法中直接"echo"输出或以字符串返回
*/
public function run()
{
return Html::encode($this->message);
}
}

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

<?php
use common\components\HelloWidget;
?>
<?= HelloWidget::widget(['message'=>'How are you doing']) ?>

示例:下面这个小部件是将配置字段中在需药显示的场景中显示一个 checkbox

namespace common\components;

use \yii\base\Widget;
use yii\helpers\ArrayHelper;
use \yii\helpers\Html;
use \yii\helpers\Json; class FieldWidget extends Widget
{
/**
* @var string $name checkbox的name值
*/
public $name = 'field-name'; /**
* @var array $options checkbox的选项数组
*/
public $options = []; /**
* @var string $scenario 显示的场景
*/
public $scenario = null; /**
* @var array $data 提供的数据
*/
public $data = null; /**
* @var array $exclude 不需要显示的内容
*/
public $exclude = []; /**
* @var obj $model 模型
*/
public $model = null; public function init()
{
parent::init(); // TODO: Change the autogenerated stub
} /**
* @purpose:给每一个需要显示的字段显示一个checkbox
* @param $item 渲染标签的数据
*/
public function renderItem($item)
{
//可显示的地方,比如 list,export
$visible = explode(',',$item['visible']);
//配置数据
$data = Json::decode($item['data']);
if(in_array($item['field_name'],$this->exclude)){
return;
}
if(in_array($this->scenario,$data['visible'])){
$this->options = ArrayHelper::merge($this->options,[
'data'=>[
'id'=>$item['id'],
'field'=>$item['field_name'],
'scenario'=>$this->scenario,
],
]);
echo Html::beginTag('div',['class'=>'field-div']);
echo Html::beginTag('label',[
'class'=>'field-label',
]);
echo Html::checkbox($this->name,in_array($this->scenario,$visible),$this->options);
echo ArrayHelper::getValue($this->model,$item['field_name'],$item['field_label']);
echo Html::endTag('label');
echo Html::endTag('label');
echo Html::endTag('div');
}
} public function run()
{
if(empty($this->data)){
return;
}
echo Html::beginTag('div',['class'=>'row-div']);
foreach($this->data as $item){
$this->renderItem($item);
}
echo Html::endTag('div');
}
}

使用这个小部件:

//这个数据是controller提供的
<?php $data = [
0=>[
'id' => 1,
'company_id'=>0,
'branch_id'=>0,
'table_name'=>'customer',
'field_name'=>'customer_name',
'field_label'=>'客户名称',
'input_type'=>'text',
'expression'=>'', //运算表达式
'type'=>'native', //native表示数据库里面的字段,extend表示拓展字段
'visible'=>'system',//显示的列
'data'=>'{"visible":["system"]}', //配置数据
],
1=>[
'id' => 2,
'company_id'=>0,
'branch_id'=>0,
'table_name'=>'customer',
'field_name'=>'sex',
'field_label'=>'性别',
'input_type'=>'text',
'expression'=>'',
'type'=>'native',
'visible'=>'system',
'data'=>'{"visible":["system"]}',
],
]?> <?= common\components\FieldWidget::widget([
'data'=>$data,
'scenario'=>'system',
'exclude'=>['sex'],
]); ?>

`

yii2小部件(widget)的更多相关文章

  1. YII2 小部件(widgets)

    小部件基本上在views中使用,在视图中可调用 yii\base\Widget::widget() 方法使用小部件. 该方法使用 配置 数组初始化小部件并返回小部件渲染后的结果. 例如如下代码插入一个 ...

  2. Android小部件Widget开发过程中的坑和总结

    @ 目录 概述 官方参考 效果图 AndroidManifest.xml Receiver Service Options res/xml/ widget_desktop_options.xml 常用 ...

  3. eclipse Swt编程—窗口小部件widget

    1.标签Label // 标签(Label类)组件是SWT中最简单的组件.Label类的构造方法和格式如下: // Label(Composite parent,

  4. Yii2的相关学习记录,alert等美化、confirm异步、session中的flash及小部件的使用(六)

    呃,系统自带的alert.confirm等弹出框实在是难看,作为一个颜控,这能忍? 这里我用的是kartik-v/yii2-dialog,这个是基于bootstrap3-dialog这个来做了一些常用 ...

  5. Yii2之ListView小部件

    ListView是yii框架中类似GridView,也是用于展示多条数据的小部件,相比GridView,ListView可以更加灵活地设置数据展示的格式. 下面以我自己做的一个使用ListView来展 ...

  6. Yii2 DetailView小部件

    DetailView小部件 Yii 提供了一套数据库小部件 widgets,这些小部件可以用于显示数据 DetailView 小部件用于显示一条记录数据 ListView 和 GridView 可以用 ...

  7. yii2 Gridview网格小部件

    Gridview 网格小部件 一.特点: 1.是yii中功能最强大的小部件之一: 2.非常适合快速建立系统的管理后台. 3.用 dataProvider 键来指定数据的提供者 4.用 filterMo ...

  8. 教你在Yii2.0框架中如何创建自定义小部件

    本教程将帮助您创建自己的自定义小部件在 yii framework 2.0.部件是可重用的模块和用于视图. 创建一个小部件,需要继承 yii\base\Widget,覆盖重写 yii\base\Wid ...

  9. 在android程序中加入widget(窗口小部件)并与之交互的关键代码

    摘要: widget(窗口小部件)可以增强应用程序的交互性, 是很多应用中都会用到的功能,本文不求大而全,但是会给出程序与widget交互的关键代码 正文: 其实widget是嵌入(embedded) ...

随机推荐

  1. C/C++遍历二维数组,列优先(column-major)比行优先(row-major)慢,why?

    C/C++遍历二维数组,列优先(column-major)比行优先(row-major)慢,why? 简单粗暴的答案:存在Cache机制! 稍微啰嗦一点:CPU访问内存(读/写,遍历数组的话主要是读) ...

  2. org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /eclipse20171118

    1:如果有一天,你有幸看到了这个错误,也许你像我一样low,因为此时,你已经准备开发Zookeeper程序了,却还没有把Zookeeper的服务启动起来. org.apache.zookeeper.K ...

  3. [转]搭建Hadoop伪分布式环境

    https://my.oschina.net/MyHeaven1987/blog/1821509 http://hadoop.apache.org/docs/current/hadoop-projec ...

  4. Codeforces 886E Maximum Element 组合数学 + dp

    我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程   dp[ i ] = sum(dp[ i - j - ...

  5. 如何在不使用try语句的情况下查看文件是否存在

    如果你要确定文件存在的话然后做些什么,那么使用try是最好不过的 如果您不打算立即打开文件,则可以使用os.path.isfile检查文件 如果path是现有常规文件,则返回true.对于相同的路径, ...

  6. centos7下docker启动失败解决

    docker启动失败解决 could not change group /var/run/docker.sock to docker: gr... not found 如果出现:Job for doc ...

  7. 我今天遇到的条件语句Integer类型的

    两个Integer类型的值进行比较时,应该用equals进行判断,用"=="判断是错误的,后来想了一下就明白了,Integer毕竟是对象, 而不是int基本数据类型,可以直接比较, ...

  8. JavaEE 之 WebService

    1.WebService a.定义:WebService是一种跨编程语言和跨操作系统平台的远程调用技术 b.三大技术: XML+XSD,SOAP,WSDL c.SOAP协议 = HTTP协议 + XM ...

  9. Cinema CodeForces - 670C (离散+排序)

    Moscow is hosting a major international conference, which is attended by n scientists from different ...

  10. snmp 里面oid对应的信息 MIB

    系统参数(1.3.6.1.2.1.1) OID 描述 备注 请求方式 .1.3.6.1.2.1.1.1.0 获取系统基本信息 SysDesc GET .1.3.6.1.2.1.1.3.0 监控时间 s ...