1. 程式人生 > 程式設計 >Yii框架小部件(Widgets)用法例項詳解

Yii框架小部件(Widgets)用法例項詳解

本文例項講述了Yii框架小部件(Widgets)用法。分享給大家供大家參考,具體如下:

小部件 ¶

小部件是在 檢視 中使用的可重用單元, 使用面向物件方式建立複雜和可配置使用者介面單元。 例如,日期選擇器小部件可生成一個精緻的允許使用者選擇日期的日期選擇器, 你只需要在檢視中插入如下程式碼:

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget(['name' => 'date']) ?>

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

使用小部件

小部件基本上在views中使用, 在檢視中可呼叫 yii\base\Widget::widget() 方法使用小部件。 該方法使用 配置 陣列初始化小部件並返回小部件渲染後的結果。 例如如下程式碼插入一個日期選擇器小部件,它配置為使用俄羅斯語, 輸入框內容為$modelfrom_date屬性值。

<?php
use yii\jui\DatePicker;
?>
<?= DatePicker::widget([
  'model' => $model,'attribute' => 'from_date','language' => 'ru','dateFormat' => 'php:Y-m-d',]) ?>

一些小部件可在yii\base\Widget::begin() 和 yii\base\Widget::end() 呼叫中使用資料內容。 例如如下程式碼使用yii\widgets\ActiveForm小部件生成一個登入表單, 小部件會在begin() 和0 end()執行處分別生成<form>的開始標籤和結束標籤, 中間的任何程式碼也會被渲染。

<?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::end() 的時候,一些小部件將使用 輸出緩衝 來調整封閉的內容。因此,當呼叫 yii\base\Widget::begin() 和 yii\base\Widget::end() 時,最好在同一個檢視檔案裡。 不遵循這個規則可能會導致意外的輸出。

配置全域性預設值

小部件的全域性預設值可以通過 DI 容器配置:

\Yii::$container->set('yii\widgets\LinkPager',['maxButtonCount' => 5]);

詳見 依賴注入容器 "實踐中的應用" 一節 。

建立小部件

繼承 yii\base\Widget 類並覆蓋 yii\base\Widget::init() 和/或 yii\base\Widget::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 = 'Hello World';
    }
  }
 
  public function run()
  {
    return Html::encode($this->message);
  }
}

使用這個小部件只需在檢視中簡單使用如下程式碼:

<?php
use app\components\HelloWidget;
?>
<?= HelloWidget::widget(['message' => 'Good morning']) ?>

以下是另一種可在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()處理和返回。

資訊: 當你呼叫 yii\base\Widget::begin() 時會建立一個新的小部件 例項並在構造結束時呼叫init()方法, 在end()時會呼叫run()方法並輸出返回結果。

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

<?php
use app\components\HelloWidget;
?>
<?php HelloWidget::begin(); ?>
 
  content that may contain <tag>'s
 
<?php HelloWidget::end(); ?>

有時小部件需要渲染很多內容,一種更好的辦法是將內容放入一個檢視檔案, 然後呼叫yii\base\Widget::render()方法渲染該檢視檔案, 例如:

public function run()
{
  return $this->render('hello');
}

小部件的檢視檔案預設儲存在WidgetPath/views目錄,WidgetPath代表小部件類檔案所在的目錄。 假如上述示例小部件類檔案在@app/components下, 會渲染@app/components/views/hello.php檢視檔案。 You may override 可以覆蓋yii\base\Widget::getViewPath()方法自定義檢視檔案所在路徑。

最佳實踐

小部件是面向物件方式來重用檢視程式碼。

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

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

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

更多關於Yii相關內容感興趣的讀者可檢視本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向物件程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》

希望本文所述對大家基於Yii框架的PHP程式設計有所幫助。