第九区

一个程序员的经验笔记

Yii2的小部件widgets应用

| 暂无评论

Yii2的小部件widgets用于在视图中显示一些可重用的内容。小部件基本上都是在views视图中使用的。Yii2官方提供了很多小部件,基本的小部件有:

  1. ActiveField
  2. ActiveForm
  3. ActiveFormAsset
  4. BaseListView
  5. Block
  6. Breadcrumbs
  7. ContentDecorator
  8. DetailView
  9. FragmentCache
  10. InputWidget
  11. LinkPager
  12. LinkSorter
  13. ListView
  14. MaskedInput
  15. MaskedInputAsset
  16. Menu
  17. Pjax
  18. PjaxAsset
  19. Spaceless

为bootstrap设计的小部件有:

  1. ActiveField
  2. ActiveForm
  3. Alert
  4. Button
  5. ButtonDropdown
  6. ButtonGroup
  7. Carousel
  8. Collapse
  9. Dropdown
  10. Modal
  11. Nav
  12. NavBar
  13. Progress
  14. Tabs
  15. Widget

另外,还有一些地方用到了小部件,如captcha等,都使用或扩展了基本的小部件来实现更多的功能。

所有小部件都基于widget扩展,widget类库的常用方法有:

[table id=2 /]

小部件的展示方式有两种,一种是直接展示小部件的内容,比如一个日期选择器:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([
    'model' => $model,
    'attribute' => 'from_date',
    'language' => 'zh_CN',
    'clientOptions' => [
        'dateFormat' => 'yy-mm-dd',
    ],
]) ?>

将直接显示选择器的特效

另一种则可在yii\base\Widget::begin() 和 yii\base\Widget::end() 调用中使用数据内容,比如一个表单里会有很多表单元素,表单控件需要显示的只是表单头尾的内容,中间的数据可以自由定义:

<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?>

<?php $form = ActiveForm::begin(['id' => 'login-form']); ?>

    <?= $form->field($model, 'username') ?>

    <?= $form->field($model, 'password')->passwordInput() ?>

    <div class="form-group">
        <?= Html::submitButton('Login') ?>
    </div>

<?php ActiveForm::end(); ?>

自己写这两种小部件的代码其实差不多,第一种比较简单:

namespace backend\libs;
use yii\base\Widget;
use yii\helpers\Html;

class HelloWidget extends Widget
{
    public $message;

    public function init()
    {
        parent::init();
        if ($this->message === null) {
            $this->message = 'Hello World';
        }
    }

    public function run()
    {
        return Html::encode($this->message);//关键代码就是直接显示而已
    }
}

第二种和第一种代码的区别请注意代码中的注释:

namespace app\components;

use yii\base\Widget;
use yii\helpers\Html;

class HelloWidget extends Widget
{
    public function init()
    {
        parent::init();
        ob_start();//截获中间部分的显示内容
    }

    public function run()
    {
        $content = ob_get_clean();//获取中间自定义的显示内容,然后可以任意处理
        return Html::encode($content);//显示全部内容
    }
}

小部件的开发就这样完成了。

发表评论

*为必填字段!