yii2-widget

Widgets (小部件)

http://www.yiiframework.com/doc-2.0/yii-base-widget.html

常用配置项:

  • options 为 input 添加属性。
  • clientOptions 为 js 插件配置,这是一个数组,会调用 Json::encode($this->clientOptions) 生成为 js 代码。

Widgets(小部件)是视图中使用的可重用的构建块,以面向对象的方式创建复杂的和可配置的用户界面元素。例如 date picker 小部件会生成日期选择器输入框,你要做的就是在 view 中插入如下代码:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget(['name' => 'date']) ?>

Yii 封装了一批常用的小部件,你可以在 yii\widgets 命名空间下找到它们。

  • yii\jui
  • yii\widgets\ActiveForm

创建一个 Widgets(小部件)

创建一个小部件,需要继承 yii\base\Widget 并 override yii\base\Widget::init() and/or yii\base\Widget::run() 方法。

通常,init()方法应该包含标准化小部件属性的代码,而run()方法应该包含生成小部件的呈现结果的代码。 The rendering result may be directly "echoed" or returned as a string by run().

In the following example, HelloWidget HTML-encodes and displays the content assigned to its message property. If the property is not set, it will display "Hello World" by default.

namespace app\components;

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);
    }
}

To use this widget, simply insert the following code in a view:

<?php
use app\components\HelloWidget;
?>
<?= HelloWidget::widget(['message' => 'Good morning']) ?>

Below is a variant(变体) of HelloWidget which takes the content enclosed within the begin() and end() calls, HTML-encodes it and then displays it.

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);
    }
}

When you call yii\base\Widget::begin(), a new instance of the widget will be created and the init() method will be called at the end of the widget constructor. When you call yii\base\Widget::end(), the run() method will be called whose return result will be echoed by end().

<?php
use app\components\HelloWidget;
?>
<?php HelloWidget::begin(); ?>

    content that may contain <tag>'s

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

有时,一个小部件可能需要渲染大量的内容。虽然可以在run()方法中嵌入内容,但更好的方法是将其放在视图中,然后调用 来渲染它。例如,

public function run()
{
    return $this->render('hello');
}

最佳实践(Best Practices)

小部件是重用视图代码的一种面向对象的方式。

创建小部件时,您仍应遵循MVC模式。

小部件的设计应该是独立的。也就是说,当使用一个小部件时,你应该能够把它放在一个视图中,而不需要做任何事情。如果一个小部件需要外部资源,比如CSS,JavaScript,图像等,这可能会非常棘手。幸运的是,Yii提供了资源包的支持,可以用来解决这个问题。

当一个小部件仅包含视图代码时,它与视图非常相似。事实上,在这种情况下,它们唯一的区别就是widget是一个可再发行的类,而view只是一个普通的PHP脚本