小零件
小部件是视图中使用的可重用单元,使用面向对象的方法来创建复杂且可配置的用户界面单元。 例如,日期选择器小部件可以生成一个精美的日期选择器,允许用户选择日期,您所需要做的就是在视图中插入以下代码:
= DatePicker::widget(['name' => 'date']) ?>
Yii 提供了很多优秀的 ,比如 [[yii\\| 表单]],[[yii\\Menu|menu]],UI,. 接下来介绍一下的基础知识。 如果您想了解某个,请参阅相应的类API文档。
使用小部件
基本上都是在视图中使用的,在视图中可以调用 [[yii\base\::()]] 方法来使用 。 该方法使用配置数组初始化小部件并返回小部件的渲染结果。 例如,以下代码插入一个日期选择器小部件,该小部件配置为使用俄语,输入框的内容是 $model 的属性值。
= DatePicker::widget([ 'model' => $model, 'attribute' => 'from_date', 'language' => 'ru', 'dateFormat' => 'php:Y-m-d', ]) ?>
一些小部件可以在 [[yii\base\::begin()]] 和 [[yii\base\::end()]] 调用中使用数据内容。 例如,以下代码使用 [[yii\\]] 小部件生成登录表单。 小部件将分别在执行 begin() 和 end() 时生成开始标记和结束标记,并且其间的任何代码也将被渲染。
'id' => 'login-form']); ?> = $form->field($model, 'username') ?> = $form->field($model, 'password')->passwordInput() ?>= Html::submitButton('Login') ?>
请注意,调用 [[yii\base\::begin()]] 方法会返回一个可用于组成小部件内容的小部件实例,这与调用 [[yii\base\::()]] 返回渲染结果不同。
注意:当调用 [[yii\base\::end()]] 时,一些小部件将使用输出缓冲区来调整包含的内容。 因此,当调用 [[yii\base\::begin()]] 和 [[yii\base\::end()]] 时,最好在同一个视图文件中。 不遵守此规则可能会导致意外的输出。
配置全局默认值
可以通过 DI 容器配置小部件的全局默认值:
\Yii::$container->set('yii\widgets\linkPager', ['maxButtonCount' => 5]);
详情请参阅。
创建小部件
根据您的需要,可以通过两种不同的方式创建小部件。
1:使用()方法
继承 [[yii\base\]] 类并重写 [[yii\base\::init()]] 和/或 [[yii\base\::run()]] 方法来创建小部件。 通常,init() 方法处理小部件属性,run() 方法包含小部件生成渲染结果的代码。 渲染结果可以直接“打印”,也可以通过 run() 方法作为字符串返回。
编码并显示分配给以下代码中的属性的值。 如果未指定该属性,则默认显示“Hello World”。
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); } }
要使用此小部件,只需在视图中使用以下代码:
= HelloWidget::widget(['message' => 'Good morning']) ?>
有时小部件需要渲染很多内容,虽然可以将内容嵌入到 run() 方法中,但更好的方法是将内容放入视图文件中,然后调用 [[yii\base\::( )]] 方法来渲染视图文件,例如:
public function run() { return $this->render('hello'); }
2:使用begin()和end()方法
这与上面的类似,但有细微差别。 这是另一种可以在 begin() 和 end() 调用中使用的方法,HTML 对内容进行编码然后显示它。
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); } }
如上所示,PHP 输出缓冲在 init() 中启动,init() 和 run() 方法之间的所有输出内容都将在 run() 中获取、处理和返回。
信息:当你调用 [[yii\base\::begin()]] 时,会创建一个新的小部件实例,并在构造结束时调用 init() 方法,并在 end() 处调用 run() 方法并输出返回结果。
以下代码展示了如何使用它:
sample content that may contain one or more HTMLtags奥比格,.g。
默认情况下,小部件的视图应存储在 /views 目录中,该目录表示小部件的类文件所在的目录。 上面的示例呈现 @app//views/hello.php 视图文件,前提是小部件类文件位于 @app/ 下。 你可以重写 [[yii\base\::()]] 方法来自定义视图文件所在的路径。
最佳实践
小部件是一种重用视图代码的面向对象的方式。
创建小部件时,您仍然需要遵循 MVC 模式。 通常,逻辑代码位于类中,内容显示在视图中。
应该被设计为独立的,这意味着当一个 被使用时,它可以被丢弃而无需额外的处理。 但当需要外部资源如CSS、图像等时,就会很棘手。 幸运的是,Yii 提供了资源包来解决这个问题。
当小部件仅包含视图代码时,它与视图非常相似,事实上,这种情况下唯一的区别是小部件是可重用的类,而视图只是应用程序中使用的普通 PHP 脚本。