Antworten auf deine Fragen:
Neues Thema erstellen

PHP Seite mit Templates - php Contentseiten werden als html wiedergegeben

Kintrax

Noch nicht viel geschrieben

Guten Abend,
ich habe mir eine php-Seite mit Templates erstellt.

Nun habe ich das Problem das die php-Seiten die (je nachdem welchen Link man in der Navi anklickt) mit hilfe von der index.php in der haupt.html Datei das [%content%] ersetzen, als html Code wiedergegeben werden.

Wie im Bild zusehen:



Wenn ich die php-Seiten direkt im Browser aufrufe funktioniert alles wie es soll.

Ich gehe davon aus das es etwas mit "file()" oder "implode()" da implode alles zu einer Zeichenkette verbindet.

Vlt. könnt ihr mir sagen wo das Problem liegt und/oder habt einen Vorschlag wie ich das mit den Templates besser Lösen kann.

Lg Kintrax


Inhalt der haupt.html:
HTML:
<div class="header">[%header%]</div>
<div class="navi">[%navi%]</div>
<div class="top5">[%top5%]</div>
<div class="content">[%content%]</div>
<div class="footer">[%footer%]</div>
Inhalt der index.php:
PHP:
<?php
#----------------------------------------------------
#Templates:
$seiten_template = "templates/haupt.html";
$header_template = "templates/header.html";
$navi_template = "templates/navi.html";
$top5_template = "templates/top5.html";
$footer_template = "templates/footer.html";
#----------------------------------------------------
#Inhaltsdateien:
$content_files = array();
$content_files['uebersicht'] = "content/uebersicht.php";
$content_files['buch'] = "content/buch.php";
$content_files['faq'] = "content/faq.php";
$content_files['kontakt'] = "content/kontakt.php";
$content_files['impressum'] = "content/impressum.php";
$content_files['agb'] = "content/agb.php";
$content_files['login'] = "content/login.php";
#----------------------------------------------------
#file_get_contents() liest eine komplette Datei in ein Array und gibt sie in einem String zurück
#Template einlesen:
$seiten_content = file_get_contents($seiten_template);
$header_content = file_get_contents($header_template);
$navi_content = file_get_contents($navi_template);
$top5_content = file_get_contents($top5_template);
$footer_content = file_get_contents($footer_template);
#----------------------------------------------------
#preg_replace() durchsucht die Zeichenkette "subject" ($page) nach Übereinstimmungen mit [%Content%], [%navi%] etc. und ersetzt sie mit replacement.
#Seite aus Templates zusammenfügen:
$page = $seiten_content;
$page = preg_replace("/\[\%header\%\]/", $header_content, $page);
$page = preg_replace("/\[\%navi\%\]/", $navi_content, $page);
$page = preg_replace("/\[\%top5\%\]/", $top5_content, $page);
$page = preg_replace("/\[\%footer\%\]/", $footer_content, $page);
#----------------------------------------------------
#Inhalt Seitenabhängig einlesen:
$get_page = "";
if(isset($_GET['page']))
$get_page = $_GET['page'];
else
$get_page = "uebersicht";
$content_lines = file($content_files[$get_page]);
$content = implode("", $content_lines); #Verbindet die Elemente eines Array mittels (glue) zu einer Zeichenkette.
#----------------------------------------------------
#Inhalt in Seite einfügen:
$page = preg_replace("/\[\%content\%\]/", $content, $page);
#-------------------------------------------
# Fertige Seite ausgeben:
echo $page;
?>
Und das hier ist der Inhalt von buch.php:
PHP:
<?php
#------------------------------------------------------------------
#Datenbankverbindung
#------------------------------------------------------------------
$host = "";
$user = "";
$pass = "";
$dbase = "";

$connection = mysql_connect("$host", "$user", "$pass")
                OR die ("MySQL-Error: " . mysql_error());
$db = mysql_select_db($dbase, $connection)
                OR die ("MySQL-Error: " . mysql_error());
$buchinfos = mysql_query("SELECT * FROM buecher", $connection);

#-------------------------------------------------------------------
#Ausgabe der Daten des Buches und der html tags
#-------------------------------------------------------------------
while ($infos = mysql_fetch_array($buchinfos)) { #Anfang der while Schleife

#-------------------------------------------------------------------
#Ausgabe der Tabelle die das Cover und den Amazonlink/grafik enthält
#-------------------------------------------------------------------
    echo "<table class='cover'>" . "<tr>" . "<td>" . "<img src='" . $infos['Bild'] . "'" . " width='150' height='228'>" . "</td>" . "</tr>" . "<tr>" . "<td>" . "<a href='" . $infos['amazonlink'] . "'>" . "<img src='http://img22.imageshack.us/img22/7587/amazonbuy.gif'>" . "</a>" . "</td>" . "</tr>" . "</table>";

#-------------------------------------------------------------------
#Ausgabe der Infoboxtabelle und den zugehörigen Daten
#-------------------------------------------------------------------
    echo "<table class='infobox'>";
    echo "<tr>"     . "<td>" . "Genre:" . "</td>" . "<td>" . $infos["Genre"] . "</td>" . "</tr>";
    echo "<tr>" . "<td>" . "ISBN:" . "</td>" . "<td>" . $infos["ISBN"] . "</td>" . "</tr>";
    echo "<tr>" . "<td>" . "Originaltitel:" . "</td>" . "<td>" . $infos["Originaltitel"] . "</td>" . "</tr>";
    echo "<tr>" . "<td>" . "Erschienen:" . "</td>" . "<td>" . $infos["Erschienen"] . "</td>" . "</tr>";
    echo "<tr>" . "<td>" . "Verlag:" . "</td>" . "<td>" . $infos["Verlag"] . "</td>" . "</tr>";
    echo "<tr>" . "<td>" . "Einband:" . "</td>" . "<td>" . $infos["Einband"] . "</td>" . "</tr>";
    echo "<tr>" . "<td>" . "Seiten:" . "</td>" . "<td>" . $infos["Seiten"] . "</td>" . "</tr>";
    echo "<tr>" . "<td>" . "&Oslash; Bewertung:&nbsp;&nbsp;" . "</td>" . "<td>" . $infos["Bewertung"] . "</td>" . "</tr>" . "</table>";


echo "<div class='inhalt'>" . "<span>" . "<h4>" . $infos["Titel"] . " von " . $infos["Autor"] . " - " . "Inhaltsangabe" . "</h4>" . "</span>" . $infos["Inhalt"] . "</div>";

} #Ende der while Schleife
?>

<?php
mysql_close($connection);
?>
fv35559325j
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP Seite mit Templates - php Contentseiten werden als html wiedergegeben

Hast du das System mit einem Tutorial erstellt oder selbst geschrieben?

Das Problem ist, dass du die Dateien einliest statt sie zu includen. Ersteres kopiert einfach den Inhalt und gibt ihn beim "echo $page" als Zeichenkette aus. PHP muss aber interpretiert werden, d.h. der Code muss in das Programm gesteckt werden, um das erzeugte Ergebnis (in deinem Fall die erzeugte Bücherliste) zu erhalten.

Dazu kannst du den Code in der Zeichenkette auswerten lassen (mit eval()). Das ist aber fast nie zu empfehlen, da eval() Sicherheitsrisiken birgt.

Die zweite Möglichkeit ist, die gewünschte Datei mit include() oder require() einzubinden. Der Unterschied zum reinen Einlesen und Ausgeben ist, dass diese Funktionen den Quellcode in das gerade interpretierte Skript kopieren und ihn als Teil des Skriptes ebenfalls interpretieren. Kurz: statt dem Inhalt der gewünschten Datei erhälst du dann das Ergebnis der (interpretierten) Datei.


Duddle
 

Kintrax

Noch nicht viel geschrieben

AW: PHP Seite mit Templates - php Contentseiten werden als html wiedergegeben

Hi, vielen Dank erst mal für deine Antwort.
Richtig ich hatte mir das in einem Tut angelesen gehabt wie das mit den Templates funktionieren soll.

Ich habe das jetzt mal so umgeändert:
PHP:
$content_lines = include($content_files[$get_page]);

$page = preg_replace("/\[\%content\%\]/", $content_lines, $page);

echo $page;
Nun klappt die Ausgabe des php-Codes.
Jetzt habe ich aber das Problem das der Inhalt der zBsp. buch.php nicht mehr im Bereich angezeigt wird wo im Template [%content%] steht sondern einfach am Anfang der Seite.
Stattdessen wird dort eine "1" angezeigt, also wird mir irgendwas einen true Wert liefern.
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP Seite mit Templates - php Contentseiten werden als html wiedergegeben

Hmmm, eine interessante Lösung. Aber falsch.

Der erste Satz vom Handbuch zu include() sagt es eigentlich recht deutlich:
include bindet eine angegebene Datei ein und führt sie aus.
include() gibt nichts zurück, es ist ein Sprachkonstrukt (vorher hatte ich es lapidar als Funktion bezeichnet). Weil es nichts zurück gibt, kannst du es nicht als Zeichenkette behandeln.
include() kopiert den Quellcode aus der gewünschten Datei und führt ihn aus, als ob er schon immer dort gestanden hätte. Deshalb kannst du ihn nicht gezielt platzieren.

Ich weiß nicht, was die ideale Lösung für das Einbinden von .php-Dateien in Template-Systemen ist, aber folgender Ansatz wäre vielleicht schon ausreichend: du kannst mit PHP Ausgabepuffer steuern. Alles was in einem Puffer erzeugt wird, wird noch nicht ausgegeben solange es nicht angewiesen wird. Diesen Puffer kannst du bewusst leeren und dessen Ausgabe als String/Zeichenkette behandeln.

Die dafür notwendigen Funktionen sind ob_start(), ob_get_contents() und ob_end_clean(). Damit kannst du folgende Hilfsfunktion konstruieren:
PHP:
function includeAndReturn($filename) {
	ob_start(); //Ausgabepuffer starten
	include($filename); //Datei einlesen, ausführen, Ergebnis ist im Puffer
	$output = ob_get_contents(); //Puffer auslesen und in $output geben
	ob_end_clean(); //Puffer beenden und leeren
	return $output; //Ergebnis zurückgeben
}
Wenn du diese Funktion jetzt wie dein include() benutzt, wird die Datei eingelesen, ausgeführt und ihr Ergebnis als Zeichenkette zurückgegeben. Dann kannst du sie normal weiterbehandeln.

Falls du dazu Fragen hast, sag Bescheid.


Duddle
 

Kintrax

Noch nicht viel geschrieben

AW: PHP Seite mit Templates - php Contentseiten werden als html wiedergegeben

Vielen lieben Dank,
ich werde jetzt erst mal versuchen mich ordentlich schlau zu lesen über die von dir genannten Funktionen.

Wenn es klappt melde ich mich nochmal zurück und wenn nicht dann erst recht. :)

Danke nochmal.
Lg Kintrax

Edit:

Das hat super geklappt.
Ich habe zwar eine Ewigkeit gebraucht aber jetzt funktioniert es.

Ich danke dir vielmals für deine nette Hilfestellung.
Lg Kintrax
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 290216

Guest

AW: PHP Seite mit Templates - php Contentseiten werden als html wiedergegeben

Warum eigentlich preg_replace? Die Funktion benötigt zu viele ressourcen als das man die für eine feststehende Zeichenkette benutzen könnte. Ist ein schöner Ressourcenfresser
Benutz lieber str_replace. Grad ein Template-Script sollte ressourcenschonend arbeiten.
Code:
[FONT=Courier New][COLOR=#0000bb]$page [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]preg_replace[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]"[%content%]"[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]$content_lines[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]$page[/COLOR][/FONT][COLOR=#007700][FONT=Courier New]);[/FONT]
[/COLOR]
 

Kintrax

Noch nicht viel geschrieben

AW: PHP Seite mit Templates - php Contentseiten werden als html wiedergegeben

Wenn ich es statt mit 'preg_replace' mit 'str_replace' mache habe ich statt des Contens den ich haben möchte nur das dort stehen:
Code:
[%content%]

Lg Kintrax
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.635
Beiträge
1.538.476
Mitglieder
67.559
Neuestes Mitglied
hanuta
Oben