一、创建一个简单的小部件
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); }}
使用这个小部件只需在视图中简单使用如下代码:
'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提供的 [ '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"]}', ],]?> $data, 'scenario'=>'system', 'exclude'=>['sex'], ]); ?>
`