HTTP-Server mit PHP-Verbesserung: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 6: | Zeile 6: | ||
* [[PHP]] | * [[PHP]] | ||
* [[HTTP-Server mit PHP]] | * [[HTTP-Server mit PHP]] | ||
* [[Formularverarbeitung mit PHP]] | |||
= Zielsetzung = | = Zielsetzung = | ||
Version vom 17. Oktober 2023, 09:20 Uhr
Links
Zielsetzung
Die Webanwendung demowebserver soll programmtechnisch verbessert werden.
- Auf jeder Seite (home, impressum) sind große Teile gleich.
- Muß zum Beispiel ein Menüpunkt hinzugefügt werden, muss das in allen Seiten wiederholt werden.
Zerlegung der HTML-Seite in Bestandteile
Wir legen eine Datei page.html an:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap 5 Example</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="tutorial.css">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-sm navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/demo.php?home">Logo</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mynavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="mynavbar">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="/demo.php?home">Start</a>
</li>
<li class="nav-item">
<a class="nav-link" href="demo.php?impressum">Impressum</a>
</li>
</ul>
<form class="d-flex">
<button class="btn btn-secondary" type="button">Settings</button>
<button class="btn btn-primary" type="button">Logout</button>
</form>
</div>
</div>
</nav>
<div class="container-fluid p-5 bg-primary text-white text-center">
<h1>#HEADER#</h1>
</div>
<div class="container mt-5">
#CONTENT#
</div>
</body>
</html>
Das ist eine Kopie von home.html, nur dass im ersten Block statt der Überschrift eine Markierung #HEADER# steht und im 2.ten Block eine Markierung #CONTENT#.
- Wir legen die CSS-Datei tutorial.css an:
.full-field {
width: 80rem;
}
.button-20 {
width: 20rem;
}
- Jetzt ändern wir die Datei home.html:
<html> <body> <p>Hier geht es zur <a href="demo.php?login">Anmeldung</a></p> </body> </html>
- Jetzt ändern wir die Datei impressum.html:
<html> <body> <p>Verantwortlich ist der Autor.</p> </body> </html>
- Die beiden HTML-Dateien enthalten nur noch ein minimales HTML-Gerüst, damit der Editor das als HTML erkennt und das Edieren unterstützen kann.
- Im Body steht der Teil der Seite, der spezifisch für "Home" oder "Impressum" ist.
Das verbesserte PHP-Programm
<?php
$server = new Server();
if ($_SERVER['REQUEST_URI'] == '/demo.php') {
header('Location: http:/demo.php?home');
} elseif ($_SERVER['REQUEST_URI'] === '/demo.php?home') {
$server->home();
} elseif ($_SERVER['REQUEST_URI'] === '/demo.php?impressum') {
$server->impressum();
} else {
header("HTTP/1.0 404 Not Found");
}
class Server {
private function showPage(string $header, string $pageFile){
$page = file_get_contents('page.html');
$body = file_get_contents($pageFile);
$page = str_replace('#HEADER#', $header, $page);
$start = strpos($body, '<body>') + 6;
$end = strrpos($body, '</body>');
$body2 = substr($body, $start, $end - $start);
$page = str_replace('#CONTENT#', $body2, $page);
echo $page;
}
public function home(){
$this->showPage('Meine erste Bootstrapseite', 'home.html');
}
public function impressum(){
$this->showPage('Impressum', 'impressum.html');
}
}
- Es gibt eine neue Methode showPage. Sie bekommt als Parameter die Überschrift und den Namen der Html-Datei mit dem Inhalt.
- Wir lesen den Inhalt der Datei page.html in die Variable $page.
- Wir lesen den Inhalt der Datei, die den eigentlichen Inhalt der Seite enthält: Also home.html oder impressum.html.
- Wir ersetzen den Marker #HEADER# mit der Überschrift:
$page = str_replace('#HEADER#', $header, $page); - Wir suchen den Index des Strings "<body>" mit der Funktion
strpos():$start = strpos($body, '<body>') + 6;- Der eigentliche Inhalt fängt aber erste 6 Zeichen dahinter an, daher
+6.
- Der eigentliche Inhalt fängt aber erste 6 Zeichen dahinter an, daher
- Wir suchen den Index des Strings "</body>" mit der Funktion
strrpos().strrpos()sucht vom Ende des Strings her (STRing Reverse POSition). - Dann schneiden wir den eigentlichen Inhalt aus (mit
$body2 = substr($body, $start, $end - $start);).substr()hat die Parameter $source, $start und $length: $length erhalten wir, indem wir$end - $startberechnen.
- Schließlich ersetzen wir den Marker #CONTENT# mit dem seitenspezifischen Inhalt.
- Wir geben die zusammengesetzte Seite mittels
echoaus. - In den Methoden
home()undimpressum()rufen wir die Methode showPage() mit den passenden Parametern auf.