08 Gemeinsames Template
Aufgabenstellung
Erstelle eine Template-Klasse und eine View dazu, und verwende das Template dann für alle Übungen.
Lösungsschritte
Schritt 1
Erstelle eine neue View /app/Views/template.view.php
mit einem HTML-Gerüst und Ausgabe der Variable $content
:
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Meine Seite</title>
<!-- <base ...>: Relative urls start at index.php's directory -->
<base href="<?= dirname($_SERVER['SCRIPT_NAME']); ?>/" />
<link rel="stylesheet" href="public/css/app.css">
</head>
<body>
<?= $content ?>
<script src="public/js/app.js"></script>
</body>
</html>
Schritt 2
Erstelle eine neue Klasse View
in /core/view.php
und lade sie in /core/bootstrap.php
. Erstelle darin eine Methode View::render($template, $view)
, welche folgendes tut:
Content der View rendern und nicht direkt ausgeben, sondern in eine Variablen
$content
zwischenspeichern. Ein Beispiel, wie das geht, findest du z.B. auf https://stackoverflow.com/questions/8510532/using-include-within-ob-start#answer-8510592Die Template-View laden und von ihr den Content innerhalb des Templates ausgeben lassen.
Vor beiden Schritten solltest du testen, ob es die angegebene Datei auch gibt (file_exists()
);
class View
{
/**
* Render a view and display the result with the given template
*
* @param $template string - e.g. "app/Views/template.view.php"
* @param $view string - e.g. "app/Views/spam.view.php"
*/
public function render(string $template, string $view)
{
// Render given `$view` and don't send result to client, but store it into the variable `$content`.
// Dein Code hier...
// Load template view
// Dein Code hier...
}
}
Schritt 3
Deine bestehenden Aufgaben entsprechend anpassen:
In den bisherigen Views kannst du alles rauslöschen, was nun in
template.view.php
vorhanden ist.Im Controller wird nun nicht mehr die View direkt eingefügt (
require ...
), sondern eine neue View erzeugt und die Methoderender()
aufgerufen:
class XYController
{
public function xy()
{
// Do what ever needs to be done before loading the view..
// Load view and render with template (replaces require 'app/Views/aufgabe-xy.view.php')
$view = new View();
$view->render('app/Views/template.view.php', 'app/Views/aufgabe-xy.view.php');
}
}
Schritt 4
Füge in template.view.php
VOR dem Content die Navigation aus Aufgabe 7 ein (horizontal).
Testing
Klicke alle Aufgaben mal durch und schau, ob alles noch richtig funktioniert.
Last updated
Was this helpful?