ウィジェットは、オブジェクト指向のアプローチを使用して複雑で構成可能なユーザー インターフェイス ユニットを作成するためにビューで使用される再利用可能なユニットです。 たとえば、日付ピッカー ウィジェットは、ユーザーが日付を選択できるようにする絶妙な日付ピッカーを生成できます。ビューに次のコードを挿入するだけです:
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget(['name' => 'date']) ?>
Yii は、[[yiiwidgetsActiveForm|active form] などの優れたウィジェットを多数提供します。 ]、[yiiwidgetsMenu|menu]]、jQuery UI ウィジェット、Twitter Bootstrap ウィジェット。 次に、ウィジェットの基礎知識を紹介します。特定のウィジェットについて詳しく知りたい場合は、対応するクラスの API ドキュメントを参照してください。
ウィジェットの使用
ウィジェットは基本的にビューで使用され、ビューでは [[yiibaseWidget::widget()]] メソッドを呼び出してウィジェットを使用できます。 このメソッドは、構成配列を使用してウィジェットを初期化し、レンダリングされたウィジェットの結果を返します。 たとえば、次のコードはロシア語を使用するように構成された日付ピッカー ウィジェットを挿入します。入力ボックスの内容は $model の from_date 属性の値です。
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget([ 'model' => $model, 'attribute' => 'from_date', 'language' => 'ru', 'clientOptions' => [ 'dateFormat' => 'yy-mm-dd', ],]) ?>
一部のウィジェットは [[yiibaseWidget::begin()]] および [[yiibaseWidget::end()]] 呼び出しでデータ コンテンツを使用できます。一部のウィジェットは、次の呼び出しの間に囲む必要があるコンテンツのブロックを取得できます。たとえば、次のコードは [[yiiwidgetsActiveForm]] ウィジェットを使用してログイン フォームを生成します。その間のコードもレンダリングされます。
<?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(); ?>
[[yiibaseWidget::widget()]] を呼び出して返されるレンダリング結果は異なることに注意してください。 [[yiibaseWidget::begin()]] メソッドを呼び出すと、ウィジェット コンテンツの構築に使用できるウィジェット インスタンスが返されます。 。
ウィジェットを作成する
[[yiibaseWidget]] クラスを継承し、[[yiibaseWidget::init()]] メソッドや [[yiibaseWidget::run()]] メソッドをオーバーライドしてウィジェットを作成します。通常、init() メソッドはウィジェットのプロパティを処理し、run() メソッドにはレンダリング結果を生成するウィジェットのコードが含まれます。 レンダリング結果は、run() メソッドで出力を直接「エコー」することも、文字列として返すこともできます。
次のコードの HelloWidget は、メッセージ属性に割り当てられた値をエンコードして表示します。属性に値が割り当てられていない場合は、デフォルトで「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() で返されます。
補足: [[yiibaseWidget::begin()]] を呼び出すと、新しいウィジェット インスタンスが作成され、構築の最後に init() メソッドが呼び出され、 run() メソッドが呼び出されます。 end() での出力 結果を返します。
次のコードは、この HelloWidget の使用方法を示しています:
<?php use app\components\HelloWidget; ?> <?php HelloWidget::begin(); ?> content that may contain <tag>'s <?php HelloWidget::end(); ?>
ウィジェットは多くのコンテンツをレンダリングする必要がある場合があります。より良い方法は、コンテンツをビュー ファイルに入れて、[[yiibaseWidget::render( )]] メソッド ビュー ファイルをレンダリングします。例:
public function run(){ return $this->render('hello');}
ウィジェットのビュー ファイルは、デフォルトで WidgetPath/views ディレクトリに保存され、WidgetPath はウィジェット クラス ファイルが配置されているディレクトリを表します。 上記のウィジェット クラス ファイルの例が @app/components の下にある場合、@app/components/views/hello.php ビュー ファイルがレンダリングされます。 [[yiibaseWidget::getViewPath()]] メソッドをオーバーライドして、ビュー ファイルのパスをカスタマイズできます。
ベスト プラクティス
ウィジェットは、ビュー コードを再利用するためのオブジェクト指向の方法です。
ウィジェットを作成するときは、引き続き MVC パターンに従う必要があります。通常、ロジック コードはウィジェット クラス内にあり、表示コンテンツはビュー内にあります。
ウィジェットは独立して設計される必要があります。つまり、ウィジェットを使用する場合、追加の処理を行わずに直接破棄できます。 しかし、ウィジェットが CSS、JavaScript、画像などの外部リソースを必要とする場合、これは難しい場合があります。幸いなことに、Yii はこの問題を解決するリソース パッケージを提供しています。
ウィジェットにビュー コードのみが含まれる場合、ウィジェットはビューと非常によく似ています。実際、この場合の唯一の違いは、ウィジェットが再利用可能なクラスであり、ビューがアプリケーションで使用される通常の PHP スクリプトであることです。