创建小部件

小部件是视图中可复用的部分,它不仅会渲染一些数据,而且还能依赖于一些逻辑。它甚至可以从模型中获取数据,并使用它自己的视图,所以它就像一个简化的可复用的模块。

下面我们来创建一个小部件,它会使用Google API画一个饼状图。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic应用。

如何做...

  1. 创建widgets目录,并添加ChartWidget类:
<?php
namespace app\widgets;
use yii\base\Widget;
class ChartWidget extends Widget
{
    public $title;
    public $width = 300;
    public $height = 200;
    public $data = [];
    public $labels = [];
    public function run()
    {
        $path = 'http://chart.apis.google.com/chart';
        $query = http_build_query([
            'chtt' => $this->title,
            'cht' => 'pc',
            'chs' => $this->width . 'x' . $this->height,
            'chd' => 't:' . implode(',', $this->data),
            'chds' => 'a',
            'chl' => implode('|', $this->labels),
            'chxt' => 'y',
            'chxl' => '0:|0|' . max($this->data)
        ]);
        $url = $path . '?' . $query;
        return $this->render('chart', [
            'url' => $url,
        ]);
    }
}
  1. 创建widgets/views/chart.php视图:
<?php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $url string */
?>
<div class="chart">
    <?= Html::img($url) ?>
</div>
  1. 创建一个ChartController控制器:
<?php
namespace app\controllers;
use yii\base\Controller;
class ChartController extends Controller
{
    public function actionIndex()
    {
        return $this->render('index');
    }
}
  1. 添加views/chart/index.php视图:
<?php
use app\widgets\ChartWidget;
use yii\helpers\Html;
/* @var $this yii\web\View */
$this->title = 'Chart';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-about">
    <h1><?= Html::encode($this->title) ?></h1>
    <?= ChartWidget::widget([
        'title' => 'My Chart Diagram',
        'data' => [
            100 - 32,
            32,
        ],
        'labels' => [
            'Big',
            'Small',
        ],
    ]) ?>
</div>
  1. 现在尝试运行这个动作。你应该能看到一个饼状图,如下所示:

  1. 你可以展示不同尺寸和数据集的图。

工作原理...

和其它类型的扩展一样,我们创建一些可以配置的公共属性,在调用一个小部件时使用它的widget方法。在这个例子中,我们配置了标题、数据集和数据标签。

小部件的主方法是run()。在我们的小部件中,我们生成一个URL,并渲染小部件视图,它使用Google charting API来打印<img>标签。

参考

results matching ""

    No results matching ""