Yiiフレーム2.0のウィジェット


ウィジェットは、ビュー内の再利用可能なユニットです.
ウィジェットはビューで使用されますが、フォームをレンダリングするときなど、コントローラを使用してモデルに渡す必要があります.例えば、一般的な時間ピックアップは、ビューに次のコードを直接入力することができます.
<?php

use yii\jui\DatePicker;

?>

<?= DatePicker::widget(['name' => 'date']) ?>

モデルを使用すると、大体次のようになります.
<?php

use yii\jui\DatePicker;

?>

<?= DatePicker::widget([

    'model' => $model,

    'attribute' => 'from_date',

    'language' => 'ru',

    'clientOptions' => [

        'dateFormat' => 'yy-mm-dd',

    ],

]) ?>

一部のウィジェットでは、[[yiibaseWidget::begin()]]および[[yiibaseWidget::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(); ?>

[yiibaseWidget::widget()]]を呼び出してレンダリング結果を返すのとは異なり、[yiibaseWidget::begin()]]メソッドを呼び出してウィジェットコンテンツを作成できるウィジェットインスタンスを返します.
ウィジェットの作成:
yiibaseWidgetを継承し、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();?>

ウィジェットは多くのコンテンツをレンダリングする必要がある場合があります.より良い方法は、コンテンツをビューファイルに格納し、[yiibaseWidget::render()]メソッドを呼び出してビューファイルをレンダリングすることです.ウィジェットのビューファイルはデフォルトでWidgetPath/viewsディレクトリに格納され、WidgetPathはウィジェットクラスファイルが存在するディレクトリを表します.上記の例のウィジェットクラスファイルが@app/componentsの下にある場合、@app/components/views/helloがレンダリングする.phpビューファイル.You may overrideは、[[yiibaseWidget::getViewPath()]メソッドを上書きして、ビューファイルのパスをカスタマイズできます.
public function run(){

    return $this->render('hello');

}

最後に注意すべき点:
  • ウィジェットを作成するときもMVCモードに従う必要があります.通常、論理コードはウィジェットクラスにあり、コンテンツはビューに表示されます.
  • ウィジェットは、独立して設計されるべきであり、すなわち、1つのウィジェットを使用する場合、追加の処理を必要とせずに直接廃棄することができる.しかし、コンポーネントがCSS、JavaScript、ピクチャなどの外部リソースを必要とする場合、Yiiはこの問題を解決するためにリソースパッケージを提供します.
  • ウィジェットがビューコードのみを含む場合、ビューとよく似ていますが、実際には、この場合、ウィジェットはクラスを再利用でき、ビューはアプリケーションで使用される通常のPHPスクリプトにすぎません.