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