yii2小部件(widget)

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

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

use yiiaseWidget; //小部件需要继承的基类
use yiihelpersHtml;

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 commoncomponentsHelloWidget;
?>
<?= HelloWidget::widget(['message'=>'How are you doing']) ?>

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

namespace commoncomponents;

use yiiaseWidget;
use yiihelpersArrayHelper;
use yiihelpersHtml;
use yiihelpersJson;

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"]}',
    ],
]?>

<?= commoncomponentsFieldWidget::widget([
    'data'=>$data,
    'scenario'=>'system', 
    'exclude'=>['sex'], 
]); ?>

`

原文地址:https://www.cnblogs.com/chrdai/p/9049471.html