init() 方法处理小部件属性, run() 方法包含小部件生成渲染结果的代码。 渲染结果可在run()方法中直接"echoed"输出或以字符串返回。
如下代码中HelloWidget编码并显示赋给message 属性的值, 如果属性没有被赋值,默认会显示"Hello World"。
namespace appcomponents;
use yiibaseWidget;
use yiihelpersHtml;
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);
}
}
使用这个小部件只需在视图中简单使用如下代码:
<?php use appcomponentsHelloWidget; ?> <?= HelloWidget::widget(['message' => 'Good morning']) ?>
以下是另一种可在begin() 和 end()调用中使用的HelloWidget, HTML编码内容然后显示。
namespace appcomponents;
use yiibaseWidget;
use yiihelpersHtml;
class HelloWidget extends Widget
{
public function init()
{
parent::init();
ob_start();
}
public function run()
{
$content = ob_get_clean();
return Html::encode($content);
}
}
如上所示,PHP输出缓冲在init()启动,所有在init() 和 run()方法之间的输出内容都会被获取,并在run()处理和返回。
信息: 当你调用 yiibaseWidget::begin() 时会创建一个新的小部件 实例并在构造结束时调用
init()方法, 在end()时会调用run()方法并输出返回结果。
如下代码显示如何使用这种 HelloWidget:
<?php use appcomponentsHelloWidget; ?> <?php HelloWidget::begin(); ?> content that may contain <tag>'s <?php HelloWidget::end(); ?>
有时小部件需要渲染很多内容,一种更好的办法是将内容放入一个视图文件, 然后调用yiibaseWidget::render()方法渲染该视图文件, 例如:
public function run()
{
return $this->render('hello');
}
小部件的视图文件默认存储在WidgetPath/views目录,WidgetPath代表小部件类文件所在的目录。 假如上述示例小部件类文件在@app/components下, 会渲染@app/components/views/hello.php视图文件。 You may override 可以覆盖yiibaseWidget::getViewPath()方法自定义视图文件所在路径。
最佳实践
小部件是面向对象方式来重用视图代码。
创建小部件时仍需要遵循MVC模式,通常逻辑代码在小部件类, 展示内容在视图中。







