Widgets sind wiederverwendbare Einheiten, die in Ansichten verwendet werden, um mithilfe eines objektorientierten Ansatzes komplexe und konfigurierbare Benutzeroberflächeneinheiten zu erstellen. Das Datumsauswahl-Widget kann beispielsweise eine elegante Datumsauswahl generieren, mit der Benutzer Daten auswählen können. Sie müssen nur den folgenden Code in die Ansicht einfügen:
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget(['name' => 'date']) ?>
Yii bietet viele hervorragende Widgets, wie zum Beispiel [. [yiiwidgetsActiveForm|aktives Formular]], [yiiwidgetsMenu|menu]], jQuery-UI-Widgets, Twitter-Bootstrap-Widgets. Als nächstes stellen wir die Grundkenntnisse von Widgets vor. Wenn Sie mehr über ein bestimmtes Widget erfahren möchten, lesen Sie bitte das entsprechende Klassen-API-Dokument.
Widgets verwenden
Widgets werden grundsätzlich in Ansichten verwendet, und die Methode [[yiibaseWidget::widget()]] kann in Ansichten aufgerufen werden, um Widgets zu verwenden. Diese Methode initialisiert das Widget mithilfe des Konfigurationsarrays und gibt das Ergebnis des gerenderten Widgets zurück. Der folgende Code fügt beispielsweise ein Datumsauswahl-Widget ein, das für die Verwendung von Russisch konfiguriert ist, und der Inhalt des Eingabefelds ist der Wert des from_date-Attributs von $model.
<?php use yii\jui\DatePicker; ?> <?= DatePicker::widget([ 'model' => $model, 'attribute' => 'from_date', 'language' => 'ru', 'clientOptions' => [ 'dateFormat' => 'yy-mm-dd', ],]) ?>
Einige Widgets können Dateninhalte in [[yiibaseWidget::begin()]]- und [[yiibaseWidget::end()]]-Aufrufen verwenden. Einige Widgets können einen Inhaltsblock annehmen, der zwischen dem Aufruf von eingeschlossen werden sollte. Der folgende Code verwendet beispielsweise das Widget [[yiiwidgetsActiveForm]], um ein Anmeldeformular zu generieren. Das Widget generiert < und jeglicher Code dazwischen wird ebenfalls gerendert.
<?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(); ?>
Beachten Sie, dass das durch den Aufruf von [[yiibaseWidget::widget()]] zurückgegebene Rendering-Ergebnis unterschiedlich ist. Der Aufruf der Methode [[yiibaseWidget::begin()]] gibt eine Widget-Instanz zurück, die assembliert werden kann der Widget-Inhalt.
Widgets erstellen
Erben Sie die Klasse [[yiibaseWidget]] und überschreiben Sie die Methoden [[yiibaseWidget::init()]] und/oder [[yiibaseWidget::run()]] Widgets erstellen. Normalerweise verarbeitet die init()-Methode Widget-Eigenschaften und die run()-Methode enthält den Code für das Widget zum Generieren von Rendering-Ergebnissen. Das Rendering-Ergebnis kann direkt in der run()-Methode ausgegeben oder als String zurückgegeben werden.
Das HelloWidget im folgenden Code ist codiert und zeigt den dem Nachrichtenattribut zugewiesenen Wert an. Wenn dem Attribut kein Wert zugewiesen ist, wird standardmäßig „Hello World“ angezeigt.
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); }}
Um dieses Widget zu verwenden, verwenden Sie einfach den folgenden Code in der Ansicht:
<?php use app\components\HelloWidget; ?> <?= HelloWidget::widget(['message' => 'Good morning']) ?>
Das Folgende ist ein weiterer, der in begin()- und end()-Aufrufen von HelloWidget verwendet werden kann , der HTML-kodierte Inhalt wird dann angezeigt.
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); }}
Wie oben gezeigt, wird die PHP-Ausgabepufferung in init() gestartet und der gesamte Ausgabeinhalt zwischen den Methoden init() und run() wird in run() abgerufen, verarbeitet und zurückgegeben.
Ergänzung: Wenn Sie [[yiibaseWidget::begin()]] aufrufen, wird eine neue Widget-Instanz erstellt und die init()-Methode wird am Ende der Konstruktion aufgerufen Rufen Sie die Methode end() auf und geben Sie das Rückgabeergebnis aus.
Der folgende Code zeigt, wie dieses HelloWidget verwendet wird:
<?php use app\components\HelloWidget; ?> <?php HelloWidget::begin(); ?> content that may contain <tag>'s <?php HelloWidget::end(); ?>
Manchmal muss das Widget eine Menge Inhalt rendern, eine bessere Möglichkeit besteht darin, den Inhalt in eine Ansichtsdatei zu legen, und Rufen Sie dann auf [ Die Methode [yiibaseWidget::render()]] rendert die Ansichtsdatei, zum Beispiel:
public function run(){ return $this->render('hello');}
Die Ansichtsdatei des Widgets wird standardmäßig im Verzeichnis WidgetPath/views und WidgetPath gespeichert stellt das Verzeichnis dar, in dem sich die Widget-Klassendatei befindet. Wenn sich die obige Beispiel-Widget-Klassendatei unter @app/components befindet, wird die Ansichtsdatei @app/components/views/hello.php gerendert. Sie können die Methode [[yiibaseWidget::getViewPath()]] überschreiben, um den Pfad der Ansichtsdatei anzupassen.
Best Practices
Widgets sind eine objektorientierte Möglichkeit, Ansichtscode wiederzuverwenden.
Sie müssen beim Erstellen von Widgets weiterhin dem MVC-Muster folgen. Normalerweise befindet sich der Logikcode in der Widget-Klasse und der Anzeigeinhalt in der Ansicht.
Widgets sollten so konzipiert sein, dass sie unabhängig sind. Das heißt, wenn Sie ein Widget verwenden, können Sie es ohne zusätzliche Verarbeitung direkt verwerfen. Es kann jedoch schwierig sein, wenn Widgets externe Ressourcen wie CSS, JavaScript, Bilder usw. erfordern. Glücklicherweise stellt Yii Ressourcenpakete zur Verfügung, um dieses Problem zu lösen.
Wenn ein Widget nur Ansichtscode enthält, ist es einer Ansicht sehr ähnlich. Tatsächlich besteht in diesem Fall der einzige Unterschied darin, dass das Widget eine wiederverwendbare Klasse ist und die Ansicht nur ein normales PHP-Skript verwendet in der Bewerbung.