Sie werden mit den folgenden Aufgaben den Webshop mit Warenkorb- Funktionalität
weiter verbessern. Ihre Lösung sollten Sie - wie beim ersten PHP- Heft - auf den Webspace
des Online- Lernsystems hochladen. Ergänzend zu den PHP- Dateien sollten Sie eine
Beschreibung Ihrer Lösung und die Angabe Ihrer Webspace- Adresse einschicken.
Teilaufgabe 1:
Schaffen Sie eine Administrations- Seite, die passwortgeschützt ist. Diese Seite soll
zunächst nur die Funktion anbieten, eine Artikeldatei in XML- Format hochladen zu können,
die dann die alte Artikeldatei ersetzt.
Teilaufgabe 2:
Schreiben Sie ein neues Skript "bestellung.php", das über einen Link auf der Warenkorbseite
aufgerufen werden soll. Das Skript soll die Bestelldaten in einer Datei "bestellung.xml" im folgenden
XML- Format abspeichern:
<bestellung>
<artikelnummer="1001" anzahl="3">
<artikelnummer="3003" anzahl="1">
</bestellung>
Außerdem soll der Warenkorb nach einer Bestellung geleert werden.
Teilaufgabe 3:
Verbessern Sie die Datei "artikelliste.php", die bisher die XML- Datei "artikeldaten.xml" parst.
Das Parsen soll über eine Klasse "Artikelparser" gehandhabt werden.
---
Meine Lösung:
Sie können den verbesserten Webshop austesten.
Zusammenstellung der Dateien von Shop- Applikation:
*
aritkel.inc - Die Artikel-Klasse
<?php
class Artikel
{
var $name;
var $anzahl;
var $preis;
var $nummer;
function Artikel ($name, $preis, $nummer)
{
$this->name =$name;
$this->anzahl =1;
$this->preis = $preis;
$this->nummer = $nummer;
}
}
?>
Quelltext schließen
*
artikeldaten.xml - Nummer, Name und Preis der angebotenen Artikel
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<artikeldaten>
<artikel nummer="1001">
<name>Im Schatten der Drachen</name>
<preis>14.90</preis>
</artikel>
<artikel nummer="1002">
<name>Eragon - Das Erbe der Macht</name>
<preis>24.99</preis>
</artikel>
<artikel nummer="1003">
<name>shadowdwellers: Trace</name>
<preis>9.99</preis>
</artikel>
...
</artikeldaten>
Quelltext schließen
*
artikelliste.php - Liest die Artikeldaten in ein globales Array
<?php
include_once("artikel.inc");
class Artikelparser
{
var $art;
var $nummer;
var $aktuell;
var $titel;
var $preis;
function Artikelparser($datei)
{
//Initialisieren des Artikelarrays
$this->art = Array();
// Einlesen der Artikeldatei und kreiren der Parservariablen
$xmlFile = implode("",file($datei));
$parser = xml_parser_create();
xml_set_object($parser,$this);
xml_set_element_handler($parser,"startElement","endElement");
xml_set_character_data_handler($parser,"cdata");
xml_parse($parser,$xmlFile);
xml_parser_free($parser);
}
/*************************************************
**** Funktionsdeklarationen ***
*************************************************/
function startElement($parser, $name, $atts)
{
$this->aktuell = $name;
if ($name == "ARTIKEL")
{
$this->nummer = $atts["NUMMER"];
}
}
function endElement($parser, $name)
{
if ($name == "ARTIKEL")
{
$this->art[$this->nummer] =
new Artikel($this->titel, $this->preis, $this->nummer);
}
$this->aktuell = "";
}
function cdata($parser, $text)
{
if ($this->aktuell == "PREIS") $this->preis = $text;
if ($this->aktuell == "NAME") $this->titel = $text;
}
function getArtikelArray()
{
return $this->art;
}
}
?>
Quelltext schließen
*
artikel.php - Stellt die Artikelauswahl dar
<?php
include("artikelliste.php")
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<titleOnlineshop - Bücher</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="author" content="Margarita Miagkova" />
</head>
<body>
<h1>Willkommen im Onlineshop</h1>
<p>Derzeit können Sie folgende Bücher bestellen</p>
<?php
$art_parser = new Artikelparser("artikeldaten.xml");
$art = $art_parser->getArtikelArray();
print "<table cellpadding='5' cellspacing='5' border='1'>";
print "<tr
<th align="left">Nummer</th>
<th align="left">Artikel</th>
<th align="left">Preis</th>
<th align="left">Warenkorb</th>
</tr>";
foreach($art as $nummer=>$art_objekt)
{
print "<tr>";
print "<td>".$art_objekt->nummer."</td>";
print "<td>".$art_objekt->name."</td>";
print "<td align='right'>".$art_objekt->preis." EUR</td>";
print "<td align='right'>
<a href='warenkorb.php?artikel=$nummer'>ablegen</a></td>";
print "</tr>";
}
print "</table>";
?>
<hr />
<a href="warenkorb.php">Warenkorb anzeigen</a>
<hr />
<a href="admin.php">zur Admin-Seite</a>
</body>
</html>
Quelltext schließen
*
warenkorb.inc - Die Warenkorb-Klasse
<?php
class warenkorb
{
var $inhalt = Array();
function hinzufuegen($artikel)
{
$this->inhalt[$artikel]++;
}
function entfernen($artikel)
{
unset ($this->inhalt[$artikel]);
}
function leeren ()
{
$this->inhalt = Array();
}
}
?>
Quelltext schließen
*
warenkorb.php - Stellt den Inhalt des Warenkorbs dar
<?php
include ("warenkorb.inc");
// starte Session
session_start();
// Warenkorbobjekt aus Session auslesen
$korb = $_SESSION['korb'];
// Neuen Warenkorb anlengen, wenn noch nicht vorhanden
if (!is_object($_SESSION['korb']))
{
$korb = new Warenkorb();
$_SESSION['korb'] = $korb;
}
// Artikel zum Warenkorb hinzufügen
if (isset($_GET['artikel']))
$korb->hinzufuegen($_GET['artikel']);
// Artikel aus dem Warenkob entfernen
if (isset($_GET['entf']))
$korb->entfernen($_GET['entf']);
// Warenkorb löschen
if (isset($_GET['loeschen']))
$korb->leeren();
?>
<html>
<head>
<title>Onlineshop - Warenkorb</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="author" content="Margarita Miagkova" />
</head>
<body>
<h1>Ihr Warenkorb</h1>
<p><a href="warenkorb.php?loeschen=1">Warenkorb löschen</a></p>
<?php
if (empty($korb))
{
print "Es befinden sich zurzeit keine Artikel im Warenkorb";
}
else
{
print "<p><b>Sie haben folgende Artikel in den Warenkorb abgelegt.</b></p>";
print "<table cellpadding='5' cellspacing='5' border='1'>";
print "<tr>";
print "<th align='left'>Nummer</th>";
print "<th align='left'>Artikel</th>";
print "<th align='left'>Preis</th>";
print "<th align='left'>Anzahl</th>";
print "</tr>";
foreach ($korb->inhalt as $_GET['artikel']=>$anzahl)
{
print "<tr><td align='right'>".$_GET['artikel']."</td>";
print "<td>";
if ($_GET['artikel'] == 1001)
print "Im Schatten der Drachen";
if ($_GET['artikel'] == 1002)
print "Eragon - Das Erbe der Macht";
if ($_GET['artikel'] == 1003)
print "shadowdwellers: Trace";
...
print "</td>";
print "<td align='right'>";
if ($_GET['artikel'] == 1001)
print "14.90 EUR";
if ($_GET['artikel'] == 1002)
print "24.99 EUR";
if ($_GET['artikel'] == 1003)
print "9.99 EUR";
...
print "</td>";
print "<td align='right'>".$anzahl."</td>";
print "<td><a href='warenkorb.php?entf=".$_GET['artikel']."'>
Artikel entfernen</a></td>";
print "</tr>";
}
print "</table>";
}
?>
<hr />
<a href="bestellung.php">zur Bestellung</a>
<hr />
<a href="artikel.php">zurück zu den Artikeln</a>
<hr />
<a href="admin.php">zur Admin-Seite</a>
</body>
</html>
Quelltext schließen
*
bestellung.php - Stellt die Bestellseite dar
<?php
include("warenkorb.inc");
// starte Session
session_start();
// Warenkorb auslesen
$korb = $_SESSION['korb'];
?>
<html>
<head>
<title>Onlineshop - Bestellung</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="author" content="Margarita Miagkova" />
</head>
<body>
<h1>Bestellung</h1>
<?php
// Prüfen, ob ein Warenkorb existiert
if (!is_object($korb))
{
print "Bisher wurde leider kein Warenkorb angelegt!";
}
else
{
// Prüfen ob Artikel im Warenkorb vorhanden sind
if (! empty($korb->inhalt))
{
// Speichern des Warenkorbes in die XML-Datei
$Datei = fopen("bestellung.xml","a");
fwrite($Datei,"<bestellung>\n",255);
foreach ($korb->inhalt as $artikel=>$anzahl)
{
fwrite ($Datei, " <artikel>\n");
fwrite ($Datei, " <nummer>$artikel</nummer>\n");
fwrite ($Datei, " <anzahl>$anzahl</anzahl>\n");
fwrite ($Datei, " </artikel>\n");
}
fwrite($Datei,"</bestellung€\n",255);
fclose($Datei);
// Warenkorb löschen und in Session speichern
$korb->leeren();
$_SESSION['korb'] = $korb;
print "<p><b>Ihre Bestellung wurde gespeichert.</b></p>";
print "<p><b>Ihr Warenkorb ist jetzt leer.</b></p>";
}
else
{
print "<p>Der Warenkorb ist leer.</p>";
}
}
?>
<hr />
<a href='artikel.php'>zum Onlineshop</a>
<a href='admin.php'>zur Admin-Seite</a>
</body>
</html>
Quelltext schließen
*
bestellung.xml - Nummer und Anzahl der bestellten Artikel
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<bestellung>
<artikel>
<nummer>1001</nummer>
<anzahl>2</anzahl>
</artikel>
</bestellung>
Quelltext schließen
*
admin.php - Stellt die passwortgeschützte Admin- Seite dar
<?php
//session starten, falls nicht schon passiert
session_start();
//Benutzername und Passwort
$user_name = "SuperUser";
$user_pass = "987654";
// Ausgabe der HEAD-Informationen für die HTML-Ausgabe
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Onlineshop- Aktualisieren</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="author" content="Margarita Miagkova" /">
</head>
<body>
<h1>Artikel aktualisieren</h1>
<p>Diese Funktion ist nur für berechtigte Nutzer zugägnlich.</p>
<p>Bitte loggen Sie sich ein.</p>';
//login Funktionen - Variablen werden gespeichert
$user = $_POST['user'];
$pw = $_POST['pw'];
// Überprüfung der Login- Daten
if (isset($user, $pw))
{
if ($user != $user_name OR $pw != $user_pass)
{
print "<p><b>Benutzer und/oder Passwort sind falsch.
Bitte überprüfen Sie nochmals Ihre Eingaben.</b></p>";
print '<form name="login" method="post" action="'.$_SERVER['PHP_SELF'].'">'
<table cellpadding="5" cellspacing="5">
<tr>
<td>User Name:</td>
<td><input type="text" name="user"></td>
</tr>
<tr>
<td>User Passwort:</td>
<td><input type="password" name="pw"></td>
</tr>
</table>
<input type="submit" name="Submit" value="einloggen">
</form>
<hr / >
<a href="artikel.php">zurück zu den Artikeln</a>';
}
elseif ($user == $user_name AND $pw == $user_pass)
{
$_SESSION['user'] = $user;
$_SESSION['pw'] = $pw;
print "<p><b>Ihre Anmeldung war erfolgreich</b></p>";
print "<p>Sie können jetzt die Artikel aktualisieren</p>";
//Ausgeben von Upload- Formular
print '<form enctype="multipart/form-data" method="post"
action="upload.php">'
<table cellpadding="5" cellspacing="5">
<tr>
<td>Datei:</td>
<td><input type="file" name="datei"></td>
</tr>
</table>
<input type="submit" value="Upload">
</form>
<hr />
<a href="artikel.php>Zum Onlineshop</a>';
}
}
// Anmelde- Formular
if (!isset($user, $pw))
{
print '<form name="login" method="post" action="'.$_SERVER['PHP_SELF'].'">'
<table cellpadding="5" cellspacing="5">
<tr>
<td>User Name:</td>
<td><input type="text" name="user"></td>
</tr>
<tr>
<td>User Passwort:</td>
<td><input type="password" name="pw"></td>
</tr>
</table>
<input type="submit" name="Submit" value="einloggen">
</form>
<hr / >
<a href="artikel.php">zurück zu den Artikeln</a>';
}
print "</body></html>";
?>
Quelltext schließen
*
upload.php - Ersetzt eine Artikeldatei durch eine andere
<html>
<head>
<title>Onlineshop - Upload</title>
<meta name="author" content="Margarita Miagkova"/>
</head>
<body>
<?php
print "<h1>Dateiupload</h1>";
print "<p>Sie haben folgende Datei ausgewähl:</p>";
print "<table cellspacing='5' cellpadding='5'>";
print "<tr>";
print "<td>Datei:</td>";
print "<td><b>".$_FILES['datei']['name']."</b></td>";
print "</tr>";
print "<tr>";
print "<td>Dateigröße:</td>";
print "<td><b>".$_FILES['datei']['size']." Bytes</b></td>";
print "</tr>";
print "<tr>";
print "<td>Dateityp:</td>";
print "<td><b>".$_FILES['datei']['type']."</b></td>";
print "</tr>";
print "</table>";
$erfolg = move_uploaded_file
{
$_FILES['datei']['tmp_name'],
''.$_FILES['datei']['name']
};
if ($erfolg)
{
print "<p><b>Die Artikel wurden erfolgreich aktualisiert</b></p>";
rename($_FILES['datei']['name'],"artikeldaten.xml");
}
else
{
print "<p><b>Die Artikel konnten nicht aktualisiert werden.</b></p>";
}
?>
<hr />
<a href="artikel.php">zum Onlineshop</a>
</body>
</html>
Quelltext schließen