<?php
/*******************************************************************************
* Hilfsfunktion für HTML-Ausgabe
*/
/**
* Assembles an internal URL
*
* @param array $queryPart
* @return string The assembled URL
*/
function u($queryPart = array())
{
$baseUrl = './'. basename(__FILE__);
$url = $baseUrl;
if (count($queryPart) > 0) {
$url .= '?' . http_build_query($queryPart);
}
return $url;
}
/**
* Escapes a string for HTML output
*
* @param string $s
* @return string
*/
function e($s)
{
return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
/*******************************************************************************
* Funktionen zur Kommunikation mit der Stelle, die die Daten hält
* (etwa Datenbank)
*/
function model_getAllEntries()
{
// Demo-Daten
$data = array();
$data[] = array(
'id' => '2',
'content' => 'Hallo Welt',
);
$data[] = array(
'id' => '4',
'content' => 'Test',
);
$data[] = array(
'id' => '3',
'content' => 'Ein anderer Test',
);
return $data;
}
function model_getEntryById($id)
{
$id = (string) $id;
$data = model_getAllEntries();
foreach ($data as $entry) {
if ($entry['id'] === $id) {
return $entry;
}
}
return null;
}
function model_deleteEntry($id)
{
// Nicht implementiert
}
function model_updateEntry($id, $content)
{
// Nicht implementiert
}
/*******************************************************************************
* Grundlegende Einstellungen
*/
error_reporting(-1);
ini_set('display_errors', 1);
/*******************************************************************************
* Ermittelt die ausgelöste Aktion
*/
$action = 'index';
if (isset($_GET['action'])) {
$action = (string) $_GET['action'];
}
if (isset($_POST['action'])) {
$action = (string) $_GET['action'];
}
/*******************************************************************************
* Führt ausgelöste Aktion aus und trägt etwaige Werte für die Ausgabe in $tpl
* ein
*/
$tpl = array();
switch ($action) {
/* "Startseite". Zeigt Liste aller Einträge */
case 'index':
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
die('Error. Wrong request method');
}
$data = model_getAllEntries();
$tpl['data'] = $data;
break;
/* Zeigt Bestätigungs-Dialog, ob Eintrag gelöscht werden soll */
case 'delete_confirm':
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
die('Error. Wrong request method');
}
$id = $_POST['id'];
$tpl['id'] = $id;
break;
/* Löscht Eintrag */
case 'delete_perform':
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
die('Error. Wrong request method');
}
$id = $_POST['id'];
model_deleteEntry($id);
$tpl['id'] = $id;
break;
/* Zeigt Formular, mit dem Daten des Eintrags geändert werden können */
case 'update_edit':
if ($_SERVER['REQUEST_METHOD'] !== 'GET') {
die('Error. Wrong request method');
}
$id = $_GET['id'];
$entry = model_getEntryById($id);
$tpl['id'] = $id;
$tpl['content'] = $entry['content'];
break;
/* Speichert veränderte Daten eines Eintrags */
case 'update_perform':
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
die('Error. Wrong request method');
}
$id = $_POST['id'];
$content = $_POST['content'];
model_updateEntry($id, $content);
$tpl['id'] = $id;
$tpl['content'] = $content;
break;
/* Unbekannte Action, Fehler */
default:
die(sprintf('Unknown action: "%s"', $action));
break;
}
$tpl['action'] = $action;
header('Content-Type: text/html; charset=UTF-8');
/*******************************************************************************
* Ausgabe, von Verarbeitung getrennt
*
* Ab hier nur noch auf Werte in $tpl zugreifen und nur noch die Hilfsfunktion
* e() und u() nutzen
*/
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Mein Projekt</title>
<style>
/*<![CDATA[*/
body {
font-size: 0.8em;
}
.main-content {
font-size: 1.5em;
padding: 30px;
}
/*]]>*/
</style>
</head>
<body>
<!-- Dieser Code erscheint immer oben auf der Seite: -->
<h1>Mein Projekt</h1>
<p><a href="<?php echo e(u(array('action' => 'index'))); ?>">Zur Index-Seite</a></p>
<hr />
<div class="main-content">
<!-- Dieser Code hängt von der ausgewählten Aktion ab: -->
<?php if ($tpl['action'] === 'index') : ?>
<ul>
<?php foreach ($tpl['data'] as $data) : ?>
<li>
<form method="post" action="<?php echo e(u(array('action' => 'delete_confirm'))) ?>">
<p>
ID: <?php echo e($data['id']); ?>,
Content: <?php echo e($data['content']); ?>
<a href="<?php echo e(u(array('action' => 'update_edit', 'id' => $data['id']))); ?>">bearbeiten</a>
<input type="hidden" name="id" value="<?php echo e($data['id']); ?>" />
<input type="submit" value="Löschen" />
</p>
</form>
</li>
<?php endforeach; ?>
</ul>
<?php elseif ($tpl['action'] === 'delete_confirm') : ?>
<p>Möchten Sie den Eintrag mit der ID <?php echo e($tpl['id']); ?> wirklich löschen?</p>
<form method="post" action="<?php echo e(u(array('action' => 'delete_perform'))); ?>"
<p>
<input type="hidden" name="id" value="<?php echo e($tpl['id']); ?>" />
<input type="submit" value="Ja, löschen" />
<a href="<?php echo e(u(array('action' => 'index'))); ?>">Nein, zurück</a>
</p>
</form>
<?php elseif ($tpl['action'] === 'delete_perform') : ?>
<p>Eintrag mit der ID <?php echo e($tpl['id']); ?> gelöscht (*nicht implementiert*).</p>
<p><a href="<?php echo e(u(array('action' => 'index'))); ?>">Zurück</a></p>
<?php elseif ($tpl['action'] === 'update_edit') : ?>
<p>Beitrag mit ID <?php echo e($tpl['id']); ?> bearbeiten:</p>
<form method="post" action="<?php echo e(u(array('action' => 'update_perform'))); ?>"
<p>
Content: <input type="text" name="content" value="<?php echo e($tpl['content']); ?>" />
</p>
<p>
<input type="hidden" name="id" value="<?php echo e($tpl['id']); ?>" />
<input type="submit" value="Speichern" />
<a href="<?php echo e(u(array('action' => 'index'))); ?>">Zurück</a>
</p>
</form>
<?php elseif ($tpl['action'] === 'update_perform') : ?>
<p>Beitrag mit ID <?php echo e($tpl['id']); ?> bearbeitet (*nicht implementiert*):</p>
<p>Content: <?php echo e($tpl['content']); ?></p>
<p><a href="<?php echo e(u(array('action' => 'index'))); ?>">Zurück</a></p>
<?php endif; ?>
<!-- Dieser Code erscheint immer unten auf der Seite: -->
</div>
<hr />
<p>Mein Projekt, 2012. Die gerade ausgeführte Aktion: <code><?php echo e($tpl['action']); ?></code></p>
<p>
Requests, die per POST abgeschickt werden, werden per Konvention über einen Button ausgelöst.<br />
Requests, die per GET abgeschickt werden, werden per Konvention über einen Link ausgelöst.
</p>
<p>Was fehlt? Siehe Kommentare im Code. Außerdem:</p>
<ol>
<li>
Eingaben werden nicht validiert. Es wird beispielsweise nicht sichergestellt,
dass <code>$_POST['id']</code> oder <code>$_POST['content']</code> wirklich gesetzt sind.
Das müsste zu Fehlern führen.
</li>
<li>
Die Bestätigungsseiten könnten per Weiterleitung (per <code>header()</code> oder per Meta-Refresh)
automatisch auf die <code>index</code>-Aktion umgeleitet werden.
</li>
<li>
Statt <code>die()</code> aufzurufen, sollte zum Beispiel eine Template-Variable <code>$tpl['errors']</code>
auf einen Fehlerwert gesetzt werden. Dann könnten Fehler auch sauber im HTML-Rahmencode angezeigt werden.
</li>
<li>
Die Funktionen mit <code>model</code>-Präfix sollten in einer Klasse stehen.
</li>
<li>
In <code>model_getEntryById()</code> erst alle Einträge zu holen und dann zu filtern,
ist natürlich nicht effizient.
</li>
</ol>
</body>
</html>