Yii2小部件的创建与使用

在做项目的时候经常会遇到某一块内容会在视图中重复使用,在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到此完成,效果如下: