在Yii中,Widgets用於封裝常常使用的視圖view,增長經常使用視圖的複用,它是很是有用的工具。側邊欄、目錄以及其餘應用須要到的,Widgets都能實現。php
CWidget是全部Widget的基類。CWidget是自包含組件,能夠看出是MVC的簡略版,CWidget相比Controller,既沒有actions,也沒有filters。web
widget,英文意思爲小工具,小掛件,在程序裏大概也是這個意思,Yii2中叫作組件,這個示例僅僅是寫一個基本的Yii2 widget,看看能不能運行。yii2
關於widgets,他們在yii中的關係以下:app
system.web.widgets 系統自帶最基本的widget yii
zii.widgets 是基本擴展 ide
zii.widgets.grid 是基本擴展的重要分支 工具
zii.widgets.jui 是插件擴展ui
system.web.widgetsthis
包括: spa
CActiveForm
CAutoComplete
CClipWidget
CContentDecorator
CFilterWidget
CFlexWidget
CHtmlPurifier
CInputWidget
CMarkdown
CMaskedTextField
CMultiFileUpload
COutputCache
COutputProcessor
CStarRating
CTabView
CTextHighlighter
CTreeView
CWidget
看vendor/yiisoft/yii2/base/Widget.php的定義,widget須要繼承這個類,begin,end,widget,run這些方法均可以在子類進行重寫定義,這裏咱們重寫run試試。
新建一個類Testwidgets.php:
namespace common\widgets;
use yii\base\Widget;
class Testwidgets extends Widget
{
public function __Construct()
{
echo 'test test ...';
}
public function run()
{
echo 'run run run ...';
}
}
在一個模板文件中這樣使用:
<?php
/* @var $this yii\web\View */
use common\widgets\Testwidgets;
?>
<p>
<?php echo Testwidgets::widget();?>
</p>
頁面輸出:
test test …run run run …
是否是很簡單,固然這只是一個最簡單的Yii2 widget,只是搞清楚寫widget的基本方式。
好比Yii2的表單widget,涉及到不少用法,就要定義額外的類和方法來實現需求。
<?php $model = new User();?>
<?php $form = ActiveForm::begin(['id'=>'login-form']);?>
<?= $form->field($model,'username')->label('用戶名') ?>
<?= $form->field($model,'password_hash')->passwordInput()->label('密碼') ?>
<?php ActiveForm::end() ;?>
這樣就很方便生成一個表單,並且能夠靈活設置各類屬性,其實原理都是同樣的。
關於Yii2的表單widget,能夠好好研究一下,寫的很妙。兩個文件:
vendor/yiisoft/yii2/widgets/ActiveForm.php
vendor/yiisoft/yii2/widgets/ActiveField.php
使用示例
Yii2封裝了一個表單widget,很方便生成各種各式的表單,試了幾種表單,能夠自由設置樣式、類型、屬性,以下代碼:
<?php $model = new User();?>
<?php $form = ActiveForm::begin(['id'=>'login-form']);?>
<?= $form->field($model,'username')->label('用戶名') ?>
<?= $form->field($model,'password_hash')->passwordInput()->label('密碼') ?>
<?= $form->field($model,'email')->textarea(['rows'=>5]) ?>
<?= $form->field($model,'status')->checkboxList([1=>'hehe',2=>'haha',3=>'xixi',4=>'heihei'],['id'=>'dddd'])->label('多選') ?>
<?php ActiveForm::end() ;?>
若是想更全面瞭解如何使用,仍是須要看一看源碼,才能更好的靈活使用yii2的生成表單widget.
源碼文件位置:vendor/yiisoft/yii2-gii/components/ActiveField.php