Yii - 小部件
阿新 • • 發佈:2018-11-30
案例目錄結構
--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 元件
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 訪問這個方法就可以測試一下了。