在Yii中我們可以繼承 yii\base\Widget類並且覆蓋yii\base\Widget::init() 和/或 yii\base\Widget::run() 方法來實現創建一個小部件
一般情況下init方法用於處理小部件的屬性,run方法用於處理小部件生成渲染結果的代碼,run中的渲染結果可以直接輸出或作爲字符串返回或者將小部件內容放到視圖文件中
一:使用widget方法
1:小部件創建
<?php
/**
* author: wangjian
* date: 2019/12/13
*/
namespace frontend\widget;
use frontend\assets\AppAsset;
use yii\base\Widget;
use yii\helpers\Html;
class TestWidget extends Widget
{
public $message;
public function init()
{
if ($this->message == null) {
$this->message = 'hello world!';
}
}
public function run()
{
$messge = Html::encode($this->message);
$html = <<<HTML
<div class="test">
{$messge}
</div>
HTML;
$js =<<<JS
console.log(1);
JS;
$this->view->registerJs($js);//
$css = <<<CSS
.test {
color: #ac2925;
}
CSS;
$this->view->registerCss($css);
AppAsset::register($this->view);//註冊資源包
return $html;
}
}
如上就創建了一個小部件
有時候小部件中可能需要渲染的內容較多,這時候我們就可以使用yii\base\Widget::render()方法渲染視圖文件
public function run()
{
return $this->render('index', [
'message' => $this->message
]);
}
2:再視圖中文件中引入小部件
<?= \frontend\widget\TestWidget::widget(['message' => 'nihao']) ?>
二:使用begin() 和 end() 方法
1:小部件創建
<?php
/**
* author: wangjian
* date: 2019/12/13
*/
namespace frontend\widget;
use yii\base\Widget;
use yii\helpers\Html;
class TestBeginWidget extends Widget
{
public $url;
public function init()
{
parent::init();
if ($this->url == null) {
$this->url = 'http://www.baidu.com';
}
ob_start();//開啓輸出緩存
}
public function run()
{
$html = Html::beginTag('a', ['href' => $this->url]);
$content = ob_get_clean();//獲取輸出緩存內容
$html .= $content;
$html .= Html::endTag('a');
return $html;
}
}
2:小部件使用
<?php \frontend\widget\TestBeginWidget::begin(['url' => 'http://www.wj0511.com']); ?>
跳轉
<?php \frontend\widget\TestBeginWidget::end(); ?>