在做项目的时候经常会遇到某一块内容会在视图中重复使用,在Yii2中为我们提供了小部件让我们可以轻松实现重用视图的使用与配置。
Yii2本身提供了很多比较优秀的小部件工具,比如yii\widgets\ActiveForm, [yii\widgets\Menu|menu]]以及bootstarp的一些小部件。而且我们还可以非常轻松的创建自定义小部件。
创建小部件
首选我们要继承yii\base\Widge类,并覆盖类的init()方法和run()方法。通常init()方法是处理小部件的属性而run()方法包含小部件渲染结果的代码。
例如创建一个顶部菜单的小部件首先在根目录的commands目录下新建TopmenuWidget.php内容如下:
namespace app\commands; use yii\base\Widget; use yii\helpers\Html; use yii\bootstrap\Nav; use app\models\Goods_cat; class TopmenuWidget extends Widget{ public $menus; public function init() { parent::init(); // TODO: Change the autogenerated stub $this->menus = Goods_cat::find() ->where(['parentid'=>0,'ismenu'=>1]) ->asArray() ->limit(5) ->orderBy('listorder asc') ->all(); } public function run() { return $this->render('topmenu',['menus'=>$this->menus]); } }
小部件的视图放在commands目录下的views下,命名为topmenu.php内容如下
<?php use yii\bootstrap\Nav; use yii\bootstrap\NavBar; use yii\helpers\Html; $top_menus[] = ['label' => '首页', 'url' => ['/site/index']]; foreach ($menus as $li) { $top_menus[] = ['label'=>$li['catname'],'url'=>['/goods/list?cid='.$li['id']]]; } $top_menus[] = Yii::$app->user->isGuest ? ( ['label' => '登录', 'url' => ['/site/login']] ) : ( '<li>' . Html::beginForm(['/site/logout'], 'post') . Html::submitButton( 'Logout (' . Yii::$app->user->identity->username . ')', ['class' => 'btn btn-link logout'] ) . Html::endForm() . '</li>' ); $top_menus[] = ['label'=>'注册','url'=>['/site/signup']]; NavBar::begin([ 'brandLabel' => Yii::$app->params['site_name'], 'brandUrl' => Yii::$app->homeUrl, 'options' => [ 'class' => 'navbar-inverse navbar-fixed-top', ], ]); echo Nav::widget([ 'options' => ['class' => 'navbar-nav navbar-right'], 'items' => $top_menus, ]); NavBar::end();
小部件的使用
小部件的使用非常的简单,在视图中先引用小部件后就可以使用了如下
<?php use app\commands\TopmenuWidget; echo TopmenuWidget::widget();
OK到此完成,效果如下: