Yii - Layouts
Layouts stellen die gemeinsamen Teile mehrerer Ansichten dar, z. B. Seitenkopf und Fußzeile. Standardmäßig sollten Layouts in der gespeichert werdenviews/layouts Mappe.
Lassen Sie uns einen Blick auf das Hauptlayout der grundlegenden Anwendungsvorlage werfen -
<?php
/* @var $this \yii\web\View */
/* @var $content string */
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>">
<meta name = "viewport" content = "width = device-width, initial-scale = 1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class = "wrap">
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
Yii::$app->user->isGuest ?
['label' => 'Login', 'url' => ['/site/login']] :
[
'label' => 'Logout (' . Yii::$app->user->identity->username.')',
'url' => ['/site/logout'],
'linkOptions' => ['data-method' => 'post']
],
],
]);
NavBar::end();
?>
<div class = "container">
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ? $this>params
['breadcrumbs'] : [],
]) ?>
<?= $content ?>
</div>
</div>
<footer class = "footer">
<div class = "container">
<p class = "pull-left">© My Company <?= date('Y') ?></p>
<p class = "pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
Dieses Layout generiert die HTML-Seite, die allen Seiten gemeinsam ist. Das$contentVariable ist das Rendering-Ergebnis von Inhaltsansichten. Die folgenden Methoden lösen Ereignisse über den Rendervorgang aus, damit die an anderen Stellen registrierten Skripte und Tags ordnungsgemäß eingefügt werden können.
head()- Sollte innerhalb des Kopfteils aufgerufen werden . Erzeugt einen Platzhalter, der durch den registrierten HTML-Code ersetzt wird, der auf die Kopfposition abzielt.
beginBody()- Sollte am Anfang des Körperteils aufgerufen werden . Löst das ausEVENT_BEGIN_BODYVeranstaltung. Erzeugt einen Platzhalter, der durch den registrierten HTML-Code ersetzt wird, der auf die Startposition des Körpers abzielt.
endBody()- Sollte am Ende des Körperteils aufgerufen werden . Löst das ausEVENT_END_BODYVeranstaltung. Erzeugt einen Platzhalter, der durch den registrierten HTML-Code ersetzt wird, der auf die Endposition des Körpers abzielt.
beginPage()- Sollte am Anfang des Layouts aufgerufen werden. Löst das ausEVENT_BEGIN_PAGE Veranstaltung.
endPage()- Sollte am Ende des Layouts aufgerufen werden. Löst das ausEVENT_END_PAGE Veranstaltung.
Erstellen Sie ein Layout
Step 1 - Erstellen Sie im Verzeichnis views / layouts eine Datei mit dem Namen newlayout.php mit dem folgenden Code.
<?php
/* @var $this \yii\web\View */
/* @var $content string */
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use app\assets\AppAsset;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang = "<?= Yii::$app->language ?>">
<head>
<meta charset = "<?= Yii::$app->charset ?>">
<meta name = "viewport" content = "width = device-width, initial-scale = 1">
<? = Html::csrfMetaTags() ?>
<title><? = Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class = "wrap">
<div class = "container">
<? = $content ?>
</div>
</div>
<footer class = "footer">
<div class = "container">
<p class = "pull-left">© My Company <?= date('Y') ?></p>
<p class = "pull-right"><? = Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
Wir haben die obere Menüleiste entfernt.
Step 2 - Um dieses Layout auf die anzuwenden SiteController, Ergänzen Sie die $layout Eigentum an der SiteController Klasse.
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;
class SiteController extends Controller {
public $layout = “newlayout”;
/* other methods */
}
?>
Step 3 - Wenn Sie nun in einer beliebigen Ansicht des SiteControllers zum Webbrowser wechseln, werden Sie feststellen, dass sich das Layout geändert hat.
Step 4 - Um verschiedene Meta-Tags zu registrieren, können Sie anrufen yii\web\View::registerMetaTag() in einer Inhaltsansicht.
Step 5 - Ändern Sie die ‘About’ Blick auf die SiteController.
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;
$this->title = 'About';
$this->params['breadcrumbs'][] = $this->title;
$this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, developing, views,
meta, tags']);
$this->registerMetaTag(['name' => 'description', 'content' => 'This is the description
of this page!'], 'description');
?>
<div class="site-about">
<h1><?= Html::encode($this->title) ?></h1>
<p>
This is the About page. You may modify the following file to customize its content:
</p>
<code><?= __FILE__ ?></code>
</div>
Wir haben gerade zwei Meta-Tags registriert - keywords and description.
Step 6 - Jetzt geh zu http://localhost:8080/index.php?r=site/about, Sie finden die Meta-Tags im Kopfbereich der Seite, wie im folgenden Screenshot gezeigt.
Ansichten lösen mehrere Ereignisse aus -
EVENT_BEGIN_BODY - ausgelöst in Layouts durch den Aufruf von yii\web\View::beginBody().
EVENT_END_BODY - ausgelöst in Layouts durch den Aufruf von yii\web\View::endBody().
EVENT_BEGIN_PAGE - ausgelöst in Layouts durch den Aufruf von yii\web\View::beginPage().
EVENT_END_PAGE - ausgelöst in Layouts durch den Aufruf von yii\web\View::endPage().
EVENT_BEFORE_RENDER - Wird zu Beginn des Renderns einer Datei in einem Controller ausgelöst.
EVENT_AFTER_RENDER - wird nach dem Rendern einer Datei ausgelöst.
Sie können auf diese Ereignisse reagieren, um Inhalte in Ansichten einzufügen.
Step 7 - Zur Anzeige des aktuellen Datums und der aktuellen Uhrzeit in der actionAbout des SiteControllerÄndern Sie es auf diese Weise.
public function actionAbout() {
\Yii::$app->view->on(View::EVENT_BEGIN_BODY, function () {
echo date('m.d.Y H:i:s');
});
return $this->render('about');
}
Step 8 - Typ http://localhost:8080/index.php?r=site/about In der Adressleiste des Webbrowsers sehen Sie Folgendes.
Wichtige Punkte
Um Ansichten übersichtlicher zu gestalten, sollten Sie -
- Teilen Sie komplexe Ansichten in mehrere kleinere auf.
- Verwenden Sie Layouts für allgemeine HTML-Abschnitte (Kopf- und Fußzeilen, Menüs usw.).
- Verwenden Sie Widgets.
Ansichten sollten -
- Enthält HTML und einfachen PHP-Code zum Formatieren und Rendern von Daten.
- Anfragen NICHT verarbeiten.
- Modelleigenschaften NICHT ändern.
- Führen Sie KEINE Datenbankabfragen durch.