在Yii中咱们能够继承 yiibaseWidget类而且覆盖yiibaseWidget::init() 和/或 yiibaseWidget::run() 方法来实现建立一个小部件php
通常状况下init方法用于处理小部件的属性,run方法用于处理小部件生成渲染结果的代码,run中的渲染结果能够直接输出或做为字符串返回或者将小部件内容放到视图文件中css
一:使用widget方法html
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; } }
如上就建立了一个小部件frontend
有时候小部件中可能须要渲染的内容较多,这时候咱们就能够使用yiibaseWidget::render()方法渲染视图文件yii
public function run() { return $this->render('index', [ 'message' => $this->message ]); }
2:再视图中文件中引入小部件this
<?= \frontend\widget\TestWidget::widget(['message' => 'nihao']) ?>
二:使用begin() 和 end() 方法url
1:小部件建立spa
<?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:小部件使用code
<?php \frontend\widget\TestBeginWidget::begin(['url' => 'http://www.wj0511.com']); ?> 跳转 <?php \frontend\widget\TestBeginWidget::end(); ?>