首頁 > php教程 > PHP开发 > Yii2.0應用結構小工具

Yii2.0應用結構小工具

伊谢尔伦
發布: 2016-11-25 14:16:11
原創
1181 人瀏覽過

小工具是在 視圖 中使用的可重複使用單元,使用物件導向方式建立複雜和可設定使用者介面單元。 例如,日期選擇器小工具可產生一個精緻的允許使用者選擇日期的日期選擇器, 你只需要在視圖中插入以下程式碼:

<?php 
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([&#39;name&#39; => &#39;date&#39;]) ?>
登入後複製

Yii提供許多優秀的小部件,例如[[yiiwidgetsActiveForm|active form] ], [yiiwidgetsMenu|menu]], jQuery UI widgets, Twitter Bootstrap widgets。 接下來介紹小部件的基本知識,如果你想了解某個小部件請參考對應的類別API文件。

使用小部件

小部件基本上在views中使用,在視圖中可調用 [[yiibaseWidget::widget()]] 方法使用小部件。 此方法使用 配置 陣列初始化小部件並傳回小部件渲染後的結果。 例如以下程式碼插入一個日期選擇器小部件,它配置為使用俄羅斯語,輸入框內容為$model的from_date屬性值。

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([    
&#39;model&#39; => $model,    
&#39;attribute&#39; => &#39;from_date&#39;,    
&#39;language&#39; => &#39;ru&#39;,    
&#39;clientOptions&#39; => [        
&#39;dateFormat&#39; => &#39;yy-mm-dd&#39;,    
],]) 
?>
登入後複製

一些小元件可在[[yiibaseWidget::begin()]] 和 [[yiibaseWidget::end()]] 呼叫中使用資料內容。 Some widgets can take a block of content which should be enclosed between the invocation of 例如以下程式碼使用[[yiiwidgetsActiveForm]]小元件產生一個登入表單,小元件會在begin() 和0 end()執行處分別產生

的開始標籤和結束標籤,中間的任何程式碼也會被渲染。

<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?>
<?php $form = ActiveForm::begin([&#39;id&#39; => &#39;login-form&#39;]); ?>

    <?= $form->field($model, &#39;username&#39;) ?>

    <?= $form->field($model, &#39;password&#39;)->passwordInput() ?>

    <div class="form-group">
        <?= Html::submitButton(&#39;Login&#39;) ?>
    </div><?php ActiveForm::end(); ?>
登入後複製

注意和呼叫 [[yiibaseWidget::widget()]] 傳回渲染結果不同, 呼叫 [[yiibaseWidget::begin()]] 方法傳回可組成小工具內容的小工具實例。

建立小部件

繼承 [[yiibaseWidget]] 類別並覆寫 [[yiibaseWidget::init()]] 和/或 [[yiibaseWidget::run()]] 方法可建立小部件。通常init() 方法處理小工具屬性, run() 方法包含小工具產生渲染結果的程式碼。 渲染結果可在run()方法中直接"echoed"輸出或以字串傳回。

如下程式碼中HelloWidget編碼並顯示賦給message 屬性的值, 如果屬性沒有被賦值,預設​​會顯示"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 = &#39;Hello World&#39;;
       }
   }

   public function run()
   {
       return Html::encode($this->message);
   }}
登入後複製

使用這個小工具只需在視圖中簡單使用以下程式碼:

<?php
use app\components\HelloWidget;
?>
<?= HelloWidget::widget([&#39;message&#39; => &#39;Good morning&#39;]) ?>
登入後複製

以下是另一個可在begin() 和 end()呼叫中使用的HelloWidget,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()處理和返回。

補充: 當你呼叫[[yiibaseWidget::begin()]] 時會建立一個新的小部件實例並在建構結束時呼叫init()方法, 在end()時會呼叫run()方法並輸出返回結果。

如下程式碼顯示如何使用這種 HelloWidget:

<?php
use app\components\HelloWidget;
?>
<?php HelloWidget::begin(); ?>
       content that may contain <tag>&#39;s
<?php HelloWidget::end(); ?>
登入後複製

有時小部件需要渲染很多內容,更好的方法是將內容放入一個視圖文件,然後調用[[yiibaseWidget::render()]]方法渲染該檢視文件,例如:

public function run(){
    return $this->render(&#39;hello&#39;);}
登入後複製

小工具的檢視檔案預設儲存在WidgetPath/views目錄,WidgetPath代表小工具類別檔案所在的目錄。 假如上述範例小工具類別檔案在@app/components下,會渲染@app/components/views/hello.php視圖檔。 You may override 可以覆寫[[yiibaseWidget::getViewPath()]]方法自訂檢視檔案所在路徑。

最佳實踐

小部件是物件導向方式來重複使用視圖程式碼。

創建小部件時仍需要遵循MVC模式,通常邏輯代碼在小部件類,展示內容在視圖中。

小部件設計時應是獨立的,也就是說使用一個小部件時候,可以直接丟棄它而不需要額外的處理。 但是當小部件需要外部資源如CSS, JavaScript, 圖片等會比較棘手, 幸運的時候Yii提供 資源包 來解決這個問題。

當一個小部件只包含視圖代碼,它和視圖很相似, 實際上,在這種情況下,唯一的區別是小部件是可以重用類,視圖只是應用中使用的普通PHP腳本。


相關標籤:
yii
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板