Quakenet Tut Templatesystem und Navigation?

Joe

Erfahrenes Mitglied
Hallo.

Ich bin noch neu hier und beim googeln durch euer Forum erst auf besagtes Tutorial von Quakenet aufmerksam geworden.
Also meine Kenntnisse reichen bisher von SelfHtml, CSS und eben bis zum Tut von Quakenet.

So nun mal zu meiner Frage :)
Ich versteh nicht ganz die Logik zum Templatesystem dort. Wie navigiere ich auf eine Login oder Registerseite? Es kann ja nicht gemeint sein das man alle Formulare einzigst über die Index.php angezeigt bekommt.
Hab ich da was nicht recht verstanden oder welcher Teil des Scriptes entscheidet darüber das das Registrierformular geladen wird und nicht das Loginformular?

Wie könnte eine Navi dazu aussehen so das Header, Footer, Navi gleich bleiben nur der Content(Inhalt) sich ändert?

Ich hoffe ich konnte mich als Laie in etwa klar ausdrücken wenn nicht dann fragt bitte.

Danke für eure Hilfe :)
(auch wenns mir wiederstrebt abgestempelt zu werden: Hier meine Seite bisher http://zahnrad.kilu.de/index.php )

------------------
Also ich steig da nicht durch probiere mich nun schon bestimmt ne Woche daran.
Ich habe nun meine Navi zum Registrieren wie folgt umgesetzt:

Die Navi befindet sich in der Header.php
Auszug:
PHP:
<div id="navi">
				<ul class="navi">
					<li><a href="index.php" class="navi<? if($aktiv == "index") echo "_aktiv"; // Mit der If-Abfrage wird ?berpr?ft, ob die Variable auf jeder Seite einem bestimmten Wert entspricht. Trifft dies zu, so wird '_aktiv' an die Klasse angeh?gt ?>">Startseite</a></li>
					<li><a href="login.php" class="navi<? if($aktiv == "login") echo "_aktiv"; ?>">Login</a></li>
					<li><a href="index.php?section=register1" class="navi<? if($aktiv == "register1") echo "_aktiv"; ?>">register1</a></li></ul>
			</div>

Die Index.php soll nun beim Seitenaufruf das Formular anzeigen und die Daten verarbeiten.

Index.php:
PHP:
<? include("counter.php"); ?>
<? readfile("inc.doctype.php");  ?>	
	<meta name="description" content="Endzeit" />
	<meta name="keywords" content="Browsergame" />
<title>End of Time</title>
<? $aktiv="index"; include("inc.header.php"); ?>
	<div class="links" style="width: 350px;">
	<h1>Am Anfang</h1>
	<p>Genau hier ensteht ein neues Browsergame. Es ist alles noch am Anfang und bisher alles noch reine Grafik und Layoutspielerei.
	Wenn es soweit ist wird genau hier ein v&ouml;llig andres Layout stehen. Dies ist das erste und vorangingste Ziel.
	Auch wenn schon ein paar Navipunkte rechts da sind so werden die Funktionen erst sp&auml;ter aufgeschalten. </p>

	 <!-- Bild zerstörte Stadt im Context
	 <img src="img/BrokenCity.jpg" alt="Magie Kampf Items" -->
</div>


<div class="rechts" style="width: 258px;">
	<div class="news">
		<h1>Neuigkeiten</h1>
<?php
include 'variables.php';
include 'constants.php';

$db = @new MySQLi('localhost', '***', '***', '***');
if (mysqli_connect_errno()) {
	die('Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
}

$ret = 1; // speichert den rückgabewert von include, standardwert 1
/*
 * Die Include-Datei muss eine return Anweisung enthalten mit folgenden
 * Werten:
 * - Bei normaler Ausführung
 *   Array('filename' => string, -- Dateiname vom Template
 *		 'data' => Array())	-- Array mit Daten für das Template
 * - Bei einem Fehler
 *   string  -- Die Fehlermeldung die angezeigt werden soll.
 */
if (isset($_GET['section'], $dateien[$_GET['section']])) {
	if (file_exists('includes/'.$dateien[$_GET['section']])) {
		$ret = include 'includes/'.$dateien[$_GET['section']]; 
	} else {
		$ret = "Include-Datei konnte nicht geladen werden: 'includes/".$dateien[$_GET['section']]."'";
	}
} else {
	// default bereich laden, news
	$ret = include 'includes/'.$dateien['news'];
}
if (is_array($ret) and isset($ret['filename'], $ret['data']) and
		is_string($ret['filename']) and
		is_array($ret['data'])) {
	// Gültiger return-Wert
	if (file_exists($file = 'templates/'.$ret['filename'])) {
		$data = $ret['data']; 
		   // speicher die Arraydaten in eine Variable $data
	   // die dann im Template verwendet werden kann.
		include $file;
	} else {
		// Datei existiert nicht, eine Fehlermeldung anzeigen.
		$data = array();
		$data['msg'] = 'Templatedatei "'.$file.'" ist nicht vorhanden.';
		include 'templates/error.tpl';
	}
} else if (is_string($ret)) {
	// include-Datei lieferte eine String zurück, welches eine Fehlermeldung sein soll
	$data = array();
	$data['msg'] = $ret;
	include 'templates/error.tpl';
} else if (1 === $ret) {
	// return-Anweisung wurde vergessen
	$data = array();
	$data['msg'] = 'In der Include-Datei wurde die return Anweisung vergessen.';
	include 'templates/error.tpl';
} else {
	// überhaupt ein ungültiger return-Wert
	$data = array();
	$data['msg'] = 'Die Include-Datei hat einen ungültigen Wert zurückgeliefert.';
	include 'templates/error.tpl';
}
?>
		<h2>Links</h2>
		<p class="news_text or">Hier k&ouml;nnte ihr Link stehen<br />kontaktieren sie mich  </p>

<div class="ta_r">

<h2>Besucher: <? echo $gcc_hits; ?></h2>
		</div>		
	</div>
</div>
<br class="clear" />
<? include("inc.footer.php"); ?>

Die register1.php sieht wie folgt aus:
PHP:
<?php
$ret = array();
$ret['filename'] = 'register.tpl.php';
$ret['data'] = array();
if ('POST' == $_SERVER['REQUEST_METHOD']) {
	if (!isset($_POST['Username'], $_POST['Password'], $_POST['Email'],
			   $_POST['Antwort'], $_POST['formaction'])) {
		return INVALID_FORM;
	}
	if (!is_array($_POST['Password']) OR count($_POST['Password']) != 2) {
		return INVALID_FORM;
	}
	if ($_POST['Password'][0] != $_POST['Password'][1]) {
		return 'Bitte geben sie das gleiche Password ein.';
	}
	if (($Username = trim($_POST['Username'])) == '' OR
			($Password = trim($_POST['Password'][0])) == '' OR
			($Email = trim($_POST['Email'])) == '' OR
			($Antwort = trim($_POST['Antwort'])) == '') {
		return EMPTY_FORM;
	}
	if ('' != $Antwort) { // entsprechend anpassen
		return 'Bitte geben sie die richtige Antwort an.';
	}
	if (!preg_match('~\A\S{3,30}\z~', $Username)) {
		return 'Der Benutzername darf nur aus 3 bis 30 Zeichen bestehen und '.
			   'keine Leerzeichen enthalten.';
	}
	$sql = 'SELECT
				ID
			FROM
				User
			WHERE
				Username = ?
			LIMIT
				1';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$stmt->bind_param('s', $Username);
	$stmt->execute();
	$stmt->store_result();
	if ($stmt->num_rows) {
		return 'Der Username wird bereits verwendet.';
	}
	if ($stmt->num_rows) {
		return 'Der Username wird bereits verwendet.';
	}
	$stmt->close();
	$sql = 'INSERT INTO
				User(Username, Email)
			VALUES
				(?, ?)';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$stmt->bind_param('ss', $Username, $Email);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	$UserID = $stmt->insert_id;
	$sql = 'UPDATE
				User
			SET
				Password = ?
			WHERE
				ID = ?';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$Hash = md5(md5($UserID).$Password);
	$stmt->bind_param('si', $Hash, $UserID);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	return showInfo('Der Benutzer wurde hinzugefügt. Sie können sich nun anmelden.');
}
return $ret;
?>

Die Dateien welche includet werden können stehen in der Variables.php:
PHP:
<?php
$dateien = array();
$dateien['news'] = '../news.php';
$dateien['register1'] = '../register1.php';
?>

Und zum Schluss hier noch die register.tpl.php:
PHP:
<form action="register.php?section=register" method="post">
	<fieldset>
		<legend><h2>Registieren</h2></legend>
		<label><p>Username: </p><input type="text" name="Username" /></label>
		<label><p>Password: </p><input type="password" name="Password[]" /></label>
		<label><p>Bestätigung: </p><input type="password" name="Password[]" /></label>
		<label><p>Email: </p><input type="text" name="Email" /></label>
		<label><p>{FRAGE}: </p><input type="text" name="Antwort" /></label>
		<input type="submit" name="formaction" value="Registieren" />
	</fieldset>

</form>

Wenn ich nun in der Navi auf Register1 klicke kommt die Meldung die Datei Register1.php kann nicht includet werden.
Aber Warum? wie kann man das besser lösen?
 
Zuletzt bearbeitet:
Keiner ne Idee wie das zu lösen ist?
Wenn keiner das Tut kapieren kann sollten die vieleicht nochmal das Tut stark überarbeiten.
 
Moin Joe,


Erstmal Willkommen in unserer Gemeinde :)

hast du mal bitte einen Link zu dem Tutorial parat...das würde die Interpretation enorm erleichtern.
 
Bist du sicher, dass sich im Verzeichnis "templates" eine Datei register.tpl.php befindet und dass sich die register1.php oberhalb des Verzeichnisses includes befindet?

Also so:
Code:
  /Root
    ?? /templates
    ?     ??register.tpl.php
    ?	
    ?? /includes
    ?? index.php
    ?? register1.php

Denn durch deine Pfad-Angabe
Code:
'../register1.php'
bewegst du dich ein Verzeichnis nach oben, von "includes" aus gesehen....im Tutorial war das nicht so.

Ich würde es auch empfehlen, es so wie im Tutorial beizubehalten...also die zu inkludenden Dateien nur im include-Verzeichnis zu bevorraten, denn so kannst du per .htaccess den HTTP-Zugriff auf diese Dateien verhindern(also dass sie jemand direkt aufruft, bspw. indem er die Adresse im Browser eingibt).
 
  • Gefällt mir
Reaktionen: Joe
Das war natürlich der Fehler .. manchmal sieht man den Wald vor lauter Bäumen nicht. In meinem Fall war es das Include als Befehl und include/ als Ordner. :D

Hab jetzt einiges umgemodelt und das Problem mit der Navigation hat sich nun auch geklärt.

Die Seite register1.php wird nun also mit
PHP:
<li><a href="index.php?section=register1" class="navi<? if($aktiv == "register1") echo "_aktiv"; ?>">register1</a></li>
aufgerufen dabei wird die register1.php in das Templatesystem eingebunden und ruft das Formular auf.
zu beachten ist allerdings das einige Dinge in der Index.php anders angeordnet werden so das es tatsächlich aussieht als würde eine neue Seite geöffnet werden.


Hier nochmal die umgeschriebene Index.php:
PHP:
<? include("counter.php"); ?>
<? readfile("inc.doctype.php");  ?>	
	<meta name="description" content="Endzeit" />
	<meta name="keywords" content="Browsergame" />
<title>End of Time</title>
	
<?php
include 'variables.php';
include 'constants.php';

$db = @new MySQLi('localhost', 'User', 'PW', 'Datenbank');
$ret = 1; // speichert den rückgabewert von include, standardwert 1
if (mysqli_connect_errno()) {
	die('Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error());
} else 

// Laden der Include-Datei
/*
 * Die Include-Datei muss eine return Anweisung enthalten mit folgenden
 * Werten:
 * - Bei normaler Ausführung
 *   Array('filename' => string, -- Dateiname vom Template
 *		 'data' => Array())	-- Array mit Daten für das Template
 * - Bei einem Fehler
 *   string  -- Die Fehlermeldung die angezeigt werden soll.
 */
if (isset($_GET['section'], $dateien[$_GET['section']])) {
	if (file_exists('includes/'.$dateien[$_GET['section']])) {
		$ret = include 'includes/'.$dateien[$_GET['section']]; 
	} else {
		$ret = "Include-Datei konnte nicht geladen werden: 'includes/".$dateien[$_GET['section']]."'";
	}
} else {
	// default bereich laden, news
	$ret = include 'includes/'.$dateien['news'];
}
if (is_array($ret) and isset($ret['filename'], $ret['data']) and
		is_string($ret['filename']) and
		is_array($ret['data'])) {
	// Gültiger return-Wert
	if (file_exists($file = 'templates/'.$ret['filename'])) {
		$data = $ret['data']; 
		   // speicher die Arraydaten in eine Variable $data
	   // die dann im Template verwendet werden kann.
		include $file;
	} else {
		// Datei existiert nicht, eine Fehlermeldung anzeigen.
		$data = array();
		$data['msg'] = 'Templatedatei "'.$file.'" ist nicht vorhanden.';
		include 'templates/error.tpl';
	}
} else if (is_string($ret)) {
	// include-Datei lieferte eine String zurück, welches eine Fehlermeldung sein soll
	$data = array();
	$data['msg'] = $ret;
	include 'templates/error.tpl';
} else if (1 === $ret) {
	// return-Anweisung wurde vergessen
	$data = array();
	$data['msg'] = 'In der Include-Datei wurde die return Anweisung vergessen.';
	include 'templates/error.tpl';
} else {
	// überhaupt ein ungültiger return-Wert
	$data = array();
	$data['msg'] = 'Die Include-Datei hat einen ungültigen Wert zurückgeliefert.';
	include 'templates/error.tpl';
}
?>
<?php
/**
 * Erzeugt ein Array für das Infomessage-Template.
 *
 * Diese Funktion erzeugt eine Array für unsere Templateengine die dann
 * die Infomessage-Template-Datei "info.tpl" läd. Der Parameter gibt
 * dabei die Nachricht an die angezeigt werden soll.
 *
 * @param msg Die Nachricht die angezeigt werden soll.
 * @return Das Array für unsere Templateengine.
 */
function showInfo($msg) {
	$ret = array();
	$ret['filename'] = 'info.tpl.php';
	$ret['data'] = array();
	$ret['data']['msg'] = $msg;
	return $ret;
}
?>
<br class="clear" />
<? include("inc.footer.php"); ?>


Hier die Register1.php wo man auch sieht wie man die Navi auf aktiv stellt.
(erste Zeile)
PHP:
<? $aktiv="register1"; include("inc.header.php"); ?>
<?php
$ret = array();
$ret['filename'] = 'register.tpl.php';
$ret['data'] = array();
if ('POST' == $_SERVER['REQUEST_METHOD']) {
	if (!isset($_POST['Username'], $_POST['Password'], $_POST['Email'],
			   $_POST['Antwort'], $_POST['formaction'])) {
		return INVALID_FORM;
	}
	if (!is_array($_POST['Password']) OR count($_POST['Password']) != 2) {
		return INVALID_FORM;
	}
	if ($_POST['Password'][0] != $_POST['Password'][1]) {
		return 'Bitte geben sie das gleiche Password ein.';
	}
	if (($Username = trim($_POST['Username'])) == '' OR
			($Password = trim($_POST['Password'][0])) == '' OR
			($Email = trim($_POST['Email'])) == '' OR
			($Antwort = trim($_POST['Antwort'])) == '') {
		return EMPTY_FORM;
	}
	if ('Antwort' != $Antwort) { // entsprechend anpassen
		return 'Bitte geben sie die richtige Antwort an.';
	}
	if (!preg_match('~\A\S{3,30}\z~', $Username)) {
		return 'Der Benutzername darf nur aus 3 bis 30 Zeichen bestehen und '.
			   'keine Leerzeichen enthalten.';
	}
	$sql = 'SELECT
				ID
			FROM
				User
			WHERE
				Username = ?
			LIMIT
				1';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$stmt->bind_param('s', $Username);
	$stmt->execute();
	$stmt->store_result();
	if ($stmt->num_rows) {
		return 'Der Username wird bereits verwendet.';
	}
	if ($stmt->num_rows) {
		return 'Der Username wird bereits verwendet.';
	}
	$stmt->close();
	$sql = 'INSERT INTO
				User(Username, Email)
			VALUES
				(?, ?)';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$stmt->bind_param('ss', $Username, $Email);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	$UserID = $stmt->insert_id;
	$sql = 'UPDATE
				User
			SET
				Password = ?
			WHERE
				ID = ?';
	$stmt = $db->prepare($sql);
	if (!$stmt) {
		return $db->error;
	}
	$Hash = md5(md5($UserID).$Password);
	$stmt->bind_param('si', $Hash, $UserID);
	if (!$stmt->execute()) {
		return $stmt->error;
	}
	return showInfo('Der Benutzer wurde hinzugefügt. Sie können sich nun anmelden.');
}
return $ret;
?>


Soweit so gut Aber anscheinend ist immernoch was falsch wo ich nicht dahinterkomme.
Wenn man das Formular richtig oder falsch ausfüllt bekomme ich keine Fehlermeldung wie in register1.php beschrieben.
Es öffnet sich eine Seite wo steht:
Kilu.de - Code 404 / Seite kann nicht angezeigt werden!

Nicht mal nen echo gibt es zurück (also zb. echo EMPTY_FORM;)


Sehe ich schon wieder den Wald vor lauter Bäumen nit?
 
Vielen Dank Es geht jetzt so wie ich es mir vorstelle!

Das es index.php heissen muss anstatt register1.php , da wäre ich wohl ewig nicht drauf gekommen. Und natürlich habe ich keine section=register :)

werde mir den Fehler mit den Dateinamen verinnerlichen .. Hast du gute Augen :D
 
Zurück