小部件是视图里的可重用单元。
小部件是在视图中使用的,但是可能需要使用控制器传给他的模型,比如在渲染表单的时候。比如一般的时间拾取器就可以直接砸视图里加入如下代码就可以:
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget(['name' => 'date']) ?>
如果用到model 就大致是这样的:
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget([ 'model' => $model, 'attribute' => 'from_date', 'language' => 'ru', 'clientOptions' => [ 'dateFormat' => 'yy-mm-dd', ], ]) ?>
一些小部件可在[[yii\base\Widget::begin()]] 和 [[yii\base\Widget::end()]] 调用中使用数据内容。比如ActiveForm 小组件就是这样使用的。
<?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(); ?>
和调用 [[yii\base\Widget::widget()]] 返回渲染结果不同, 调用 [[yii\base\Widget::begin()]] 方法返回一个可组建小部件内容的小部件实例。
创建小部件:
继承 yii\base\Widget 并实现 init 和 run方法就可以创建一个小部件。
1、创建一个像上面提到的时间选择器那样可以直接输出的小部件:
namespace app\components; use yii\base\Widget; use yii\helpers\Html; class HelloWidget extends Widget { public $message; public function init() { parent::init(); if(null == $this->message) { $this->message = 'Hello World'; } } public function run() { return Html::encode($this->message); } }
在模板中使用的代码是:
<?php use app\components\HelloWidget; ?> <?= HelloWidget::widget(['message'=>'This is a HelloWidget!'])?>
2、如果要创建一个用 begin 和 end 中使用的小部件:
amespace app\components; use yii\base\Widget; use yii\helpers\Html; class HelloWidget extends Widget { public $message; public function init() { parent::init(); ob_start(); } public function field() { return Html::encode('这个是实例调用的方法!'); } public function run() { $this->message = ob_get_clean(); return Html::encode($this->message); } }
模板里调用是这样的:
<?php use yii\helpers\Html; use app\components\HelloWidget; ?> <?php echo Html::encode($message);?><br /> <?php $hello = HelloWidget::begin();?> 这次使用的事begin 和 end方法。 <?= $hello->field();?> <?php HelloWidget::end();?>
有时小部件需要渲染很多内容,一种更好的办法是将内容放入一个视图文件, 然后调用[[yii\base\Widget::render()]]方法渲染该视图文件,小部件的视图文件默认存储在WidgetPath/views目录,WidgetPath代表小部件类文件所在的目录。 假如上述示例小部件类文件在@app/components下,会渲染@app/components/views/hello.php视图文件。 You may override 可以覆盖[[yii\base\Widget::getViewPath()]]方法自定义视图文件所在路径。
public function run(){ return $this->render('hello'); }
最后提点应该注意的: