1. 程式人生 > >Yii - 小部件

Yii - 小部件

案例目錄結構

--modules // 模組存放目錄
  --WidgetTestModule //WidgetTestModule 模組
    --WidgetTestModule.php //WidgetTestModule 模組入口類
    --controllers    //控制器存放目錄
      -- TestController.php  //TestController 控制器
    --views          //檢視存放目錄
      -- test        //控制器id
         -- index1.php //名為index1的檢視檔案
--components    //自定義元件存放目錄
-- CounrtyService //國家服務 --CountryService.php //元件介面類 --realization //元件介面實現類存放目錄 --CountryServiceRealization1.php //對CountryService 介面的實現 -- DbOper //資料庫操作 -- DbOper.php //元件介面類 -- realization//元件介面實現類存放目錄 -- DbRealization1.php 對DbOper 介面的實現 --widgets //自定義小部件存放,目錄 --Test1Widget
//Test1Widget 小部件
--Test1Widget.php // 小部件實現類 --views // 檢視存放目錄 --run.php// 小部件檢視應用檔案

所有的小部件都要繼承 Widget 這個類

app\widgets\Test1Widget

<?php
namespace app\widgets\Test1Widget;

use Yii;
use yii\helpers\Html;
use yii\base\Widget;

class Test1Widget extends Widget
{
    public $code
; public function init() { parent::init(); } public function run() { $data = Yii::$app->countryService->getCountry($this->code); return $this->render('run',array( 'country' => $data )); } /** * @Override * 覆蓋父類 getViewPath() 方法 自定義檢視檔案儲存目錄 * 這裡這樣定義後 run() 中$this->render()方法返回的檢視路徑就是類目錄下面的views目錄 */ public function getViewPath() { return __DIR__ . '/views'; } }

WidgetTestModule 模組測試自定義的小部件

WidgetTestModule.php

<?php

namespace app\modules\WidgetTestModule;

use yii\base\Module;

class WidgetTestModule extends Module
{

    public function init()
    {
        $this->controllerNamespace = 'app\modules\WidgetTestModule\controllers';
    }

}

模組控制器 TestController.php

<?php

namespace app\modules\WidgetTestModule\controllers;

use yii\web\Controller;

class TestController extends Controller
{

    public function actionIndex1()
    {
        return $this->renderPartial('index1');
    }

}

TestController 控制器actionIndex1() 需要的index1檢視

<?php
use yii\helpers\Html;

use app\widgets\Test1Widget\Test1Widget; //載入Test1Widget 小部件
?>

<?php
    echo Test1Widget::widget(array(
        'code'  =>  'AM'
    ));
?>

CountryService 元件

<?php
namespace app\components\CountryService;

interface CountryService
{

    /**
     * 根據id 獲得country中的一條資料
     * @param
     * String code 表id
     * @return
     * array data 查詢出的資料
     */
    public function getCountry($code='');

}

實現類 CountryServiceRealization1

<?php

namespace app\components\CountryService\realization;

use Yii;
use app\components\CountryService\CountryService;

class CountryServiceRealization1 implements CountryService
{
    /**
     * interface @Overide
     */
    public function getCountry($code='',$fields='*')
    {
        if($code === '')
            return array();

        $sql = 'select ' . $fields . ' from yii_country where code=:code';

        $keyVal = array(
            ':code'     =>  $code
        );

        return Yii::$app->dbOper->fetch($sql,$keyVal);
    }
}

CountryService 與 元件DbOper產生了耦合關係,因為CountryService 的實現類 CountryServiceRealization1 在實現過程中 使用了DbOper 元件

DbOper 元件的使用看下我的這篇文章

yii_country 表的資料庫結構

CREATE TABLE `yii_country` (
  `code` char(2) NOT NULL,
  `name` char(52) NOT NULL,
  `population` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然後我們在瀏覽器中輸入

http://host/index.php?r=WidgetTestModule/test/index1    訪問這個方法就可以測試一下了。