yii2小部件(widget)


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

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'],  ]); ?>

`

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM