php in php ?

the_black_hawk

Erfahrenes Mitglied
:confused:

Hallo,

ich arbeite derzeit mit einem einfachen Templatesystem

folgende Zeilen sind erstmal wichtig (index.php)

PHP:
$page = preg_replace("/\[\%content\%\]/", $content, $page);
echo $page;

das [%content%] im Layouttemplate wird durch die jeweilig aktive Seite ersetzt
in meinem Layouttemplate möchte ich allerdings noch mit PHP arbeiten(index.tpl)

funktioniert leider nicht, alles was im index.tpl zwischen <?php ?> steht wird ignoriert
weis jemand Rat?
 
Ah nich gut
eval() kann dir zwar weiter helfen, ist aber abgesehen davon nicht besonders sicher ...
Ich würde das ganze wie folgt regeln

Zuerst einmal ein Template, welches wirklich nur aus HTML besteht. Hab hier mal eines

Layout.html --> Template etc.
HTML:
<meta http-equiv="Content-Language" content="de">
<div id="Layer1" style="position:absolute; width:702; height:98; z-index:1; background-color: #99CCFF; border: 1px solid #000000; left:10; top:15">
  <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1" height="100%">
    <tr>
      <td width="50%">{SEARCH}</td>
      <td width="50%" valign="bottom">
      <p align="right">{NAVI}</td>
    </tr>
  </table>
</div>
<div id="Layer1" style="position:absolute; width:192; height:395; z-index:1; background-color: #99CCFF; border: 1px solid #000000; left:10; top:115">
  <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber3" height="100%">
    <tr>
      <td width="100%" valign="top">{SIDEBAR}</td>
    </tr>
  </table>
</div>
<div id="Layer1" style="position:absolute; width:506; height:395; z-index:1; background-color: #99CCFF; border: 1px solid #000000; left:206; top:115">
  <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber2" height="100%">
    <tr>
      <td width="100%" valign="top">{CONTENT}</td>
    </tr>
  </table>
</div>
Tja und dann kommen wir auch schon zum PHP Code, welcher uns ermöglicht sogar PHP in unserem Template auszuführen.

index.php
PHP:
<?php
ob_start();
   include_once "SEARCH.php";
   $cnt1 = ob_get_clean();

ob_start();
   include_once "NAVI.php";
   $cnt2 = ob_get_clean();

ob_start();
   include_once "SIDEBAR.php";
   $cnt3 = ob_get_clean();

ob_start();
   include_once "CONTENT.php";
   $cnt4 = ob_get_clean();

   $design = file_get_contents("Layout.html");
   $design = str_replace("{SEARCH}", $cnt1, $design);
   $design = str_replace("{NAVI}", $cnt2, $design);
   $design = str_replace("{SIDEBAR}", $cnt3, $design);
   $design = str_replace("{CONTENT}", $cnt4, $design);

echo $design;
?>
Ja was passiert? Es wird die Ausgabepufferung aktiviert und somit werden die Daten nicht direkt an den Client, also uns übergeben. So werden die einzelnen Seiten --> oder Scripte in einem String gesammelt und später ausgegeben.

file_get_contents(); holt uns dann noch den inhalt der Layout.html und daraufhin können wir die einzelnen [Platzhalter] in unserem Template ersetzen. Zum Schluss brauchen wir nur noch unseren String ausgeben und fertig ist es.
 
Marsmann: Auch du wirst irgendwann die Mächtigkeit von Evaluierungsfunktionen zu schätzen wissen ;-]

Zum Thema PREG: [phpf]preg_replace_callback[/phpf] (Viel Spaß beim Probieren und Verzweifeln) wäre eine Möglichkeit um das Ersetzen ein wenig dynamischer zu machen... Eine andere wäre aber auch das etwas umständliche Fummeln mit Funktionsaufrufen beim normalen [phpf]preg_replace[/phpf]. So sagt die Doku an einer Stelle zum Ersatz:
Wenn Sie den Modifikator e verwenden, maskiert diese Funktion ein paar Zeichen (nämlich ', ", \ und NULL) in den Zeichenketten, mit denen die Rückreferenzierungen ersetzen werden. Das wird gemacht, um sicherzustellen, dass keine Syntaxfehler entstehen, wenn Rückreferenzierungen verwendet werden, die einfache oder doppelte Anführungszeichen enthalten (z.B. 'strlen(\'$1\')+strlen("$2")'). Vergewissern Sie sich, dass Sie die Zeichenketten-Syntax von PHP kennen, um genau zu wissen, wie die ausgewertete Zeichenkette aussieht.
Schießmichtot, aber ich glaub, das habe ich irgendwann sogar mal versucht, bevor ich erfahren hab, dass PHP eine Templatesprache ist und auch als solche keine andere braucht :D
Übrigens hat es damals auf Grund fehlendem KnowHows und sowieso der schlechten Umsetzbarkeit der Problematik mittels Ersetzung regulärer Ausrücke (via Callbacks) nicht hingehauen. ^^

Bevor overheadlastige Aktionen gestartet werden, nur um eine eigene Templateengine zu bauen, empfehle ich immer gerne zum einen mein Lieblingsframework (für PHP5) und zum anderen einen Blick hinter die Kulissen des EVA-Prinzips um dann zu sehen, dass man nichts anderes zum Templating braucht als PHP selbst.
Des Weiteren ist die PHP-Ausgabesteuerung echt genial um "gerenderten" Code abzufangen und eventuell sogar um ihn mehrfach zu verwenden, ohne ständig die Codezeilen neu durch den Compiler zu jagen.
Aber das ist dann wirklich alles, was man braucht zum Templating ;)
 
danke euch erstmal:)

index.php
PHP:
<?php
ob_start();
   include_once "SEARCH.php";
   $cnt1 = ob_get_clean();

ob_start();
   include_once "NAVI.php";
   $cnt2 = ob_get_clean();

ob_start();
   include_once "SIDEBAR.php";
   $cnt3 = ob_get_clean();

ob_start();
   include_once "CONTENT.php";
   $cnt4 = ob_get_clean();

   $design = file_get_contents("Layout.html");
   $design = str_replace("{SEARCH}", $cnt1, $design);
   $design = str_replace("{NAVI}", $cnt2, $design);
   $design = str_replace("{SIDEBAR}", $cnt3, $design);
   $design = str_replace("{CONTENT}", $cnt4, $design);

echo $design;
?>

find das System ziemlich gut, nur wie kann ich ihm jetzt sagen, dass er je nachdem was aufgerufen wird, unterschiedliche Contents anzeigen soll? (zb index.php?page=home)

:confused:
 
Das ist ganz leicht ^^
Wie du siehst werden alle entsprechenden Seiten geladen, sowie der Content
PHP:
ob_start();
   include_once "CONTENT.php";
   $cnt4 = ob_get_clean();
Und hier kannst es jetzt machen wie du willst ^^
Entweder du schreibst dir eine "Content.php oder du schreibst deinen Code gleich dort rein, also zwischen ob_start(); und ob_get_clean();

Nun ja da ich den vorherigen Code schon erstellt hatte und nun auch wieder einen rumliegen habe, stell ich den auch gleichnoch rein -.-

config.php
PHP:
<?php
$dateien = array();
$dateien['home'] = "include/home.php";
$dateien['history-de'] = "include/history-de.php";
$dateien['history-eng'] = "include/history-eng.php";
$dateien['design-de'] = "include/design-de.php";
$dateien['error-de'] = "include/error.php";
?>

index.php
PHP:
<?php
ob_start();
include('config.php');
if(isset($_GET['KP']) AND isset($dateien[$_GET['KP']]))
{
 if(!file_exists($dateien[$_GET['KP']]))
 include $dateien['error-de'];
 include $dateien[$_GET['KP']]; 
}else{
if($_GET['KP'] == ''){
include $dateien['home'];
}else{
include $dateien['error-de']; 
}
}
$cnt4 = ob_get_clean(); 

   $design = file_get_contents("Layout.html"); 
   $design = str_replace("{CONTENT}", $cnt4, $design);
   echo $design; 
?>
Naja und eben dein Template noch.
Die erste Seite die immer aufgerufen wird, ist die

index.php?KP=home

Da deine URI http://www.deine.page.de ja noch keine $_GET Variable beherbergt.
Sollte URI eien $_GET Variable beherbergen, die es nicht gibt, wird automatisch die error.php aufgerufen und sonst Funktioniert eben alles nach der config.php
 
Zuletzt bearbeitet:
wow, ich danke dir:eek:

funktioniert echt prima hät ich nicht erwartet :)
super, finde an solchen Beispielen lernt man alles am einfachsten zu verstehen
 
Zurück