Smarty - Kurze Einsteiger-Frage

Eistee

Erfahrenes Mitglied
Hallo,
auf vielfaches Anraten habe ich nun vro, meine Seite für die Smarty Template-Engine umzustrukturieren.
Allerdings stellen sich mir da direkt zu beginn einige Fragen.
Zunächst würde mich interessieren, wie ich folgendes Problem mit Smarty löse:
Die News auf meiner Seite werden durch ein seperates PHP-Script (news.php aus dem Forum ausgelesen - im Pronzip also wie hier.
Das Layout für einen News-beitrag ist in der Datei newsrow.html dafiniert.
Über folgenden Code Lade ich den Inhalt dieser datei in das Script:
PHP:
$tpl_newsrow = file_get_contents("newsrow.html");
Nun wird $tpl_newsrow nach Platzhaltern ({date}, {author}, {text} etc.) geparst und diese mit Hilfe der str_replace-Funktion durch die richtigen Inhalte ersetzt.
Zuletzte wird der nun "richtige" Inhalt von $tpl_newsrow vom Script ausgegeben.
Das Script binde ich derzeit über include() auf meiner eigentliches seite ein.
Soweit - so gut :)
Aber wie nun kann die Asugabe des Scriptes mit Smarty einbinden?
Da der Rest meiner seite änhlich aufgebaut ist (PHP-Scipte geben den Inhalt aus und werden eingebunden) ist diese Frage von enormer Wichtigkeit ;)

Ich würde mich freuen, wenn ihr mir (absoluter Smarty-Anfänger) die Funktionsweise anhand dieses Beispiels erklären könntet.
Danke!
 
Kann mir keiner helfen?!
Ich habe berreits versucht mich ein wenig mit der engine zu beschäftigen und auch schein ein paar Einsteiger-Tutorials gelesen, allerdings wurde meine Frage in keinem dieser Tutorials behandelt :(
Daher würde ich euch bitten, mir hier anhand meines Beispiels zu erklären, wie ich mein Problem in den Griff bekomme.
Bloß als Anregung, den Rest der Seite bekomme ich dann schon irgendwie selber hin ;)
 
ja wenn du doch die Platzhalter in der html-Datei schon hast ist das doch nicht das Problem.

Du beschaffst dir die Daten die in das Newstemplate sollen.
Dann weist du diese Daten dem Templateobjekt zu
und gibst es dann aus oder wie auch immer.

PHP:
$deinenewsdaten = array("...welcher Inhalt auch immer ...");
$tpl = new smarty;
$tpl->assign("daten", $deinenewsdaten);
$tpl->display("newsrow.html); //Zeigt es an
$inahlt = $tpl->fetch("newsrow.html"); //Speichert den Inhalt des templates in einer Variablen -> mit den zugewiesneen werten

das kannst du dann so in deine Hauptdatei einbinden.
 
Original geschrieben von Eistee
Das Layout für einen News-beitrag ist in der Datei newsrow.html dafiniert.
Über folgenden Code Lade ich den Inhalt dieser datei in das Script:
PHP:
$tpl_newsrow = file_get_contents("newsrow.html");

Nun wird $tpl_newsrow nach Platzhaltern ({date}, {author}, {text} etc.) geparst und diese mit Hilfe der str_replace-Funktion durch die richtigen Inhalte ersetzt.
Zuletzte wird der nun "richtige" Inhalt von $tpl_newsrow vom Script ausgegeben.
Das Script binde ich derzeit über include() auf meiner eigentliches seite ein.
Also wenn Du Deine Seite schon auf Smarty anpassen willst, dann brauchst Du diesen Weg nicht zu gehen, da Smarty Dir den abnimmt :)

PHP:
<?php

/* zuerst smarty object erzeugen */
$objTemplate = &new Smarty();

/* caching aktivieren */
$objTemplate->caching = true;

/* template definieren */
define('TEMPLATE','news.row.tpl');

/* prüfen ob template bereits gecached ist */
if(!$objTemplate->is_cached(TEMPLATE)) {

    /* falls das template noch nicht gecached ist führe db anfragen durch */
    $strSQL     = "SELECT * FROM news ORDER BY datum DESC";
    $rsNews     = mysql_query($strSQL);
    $arrNews    = array();

    /* 
    das news array mit den daten aus der db füllen lassen 
    die werte werden später im template über den jeweiligen array-index angesprochen 
    */
    while($daten = mysql_fetch_array($rsNews)) {
        $arrNews[] = array(
            'id'        => $daten['id'],
            'headline'  => $daten['headline'],
            'newsbody'  => $daten['body'],
            'datum'     => $daten['datum'],
            'author'    => $daten['author']
        );
    }

/* news-array einem template block zuweisen */
$objTemplate->assign("news", $arrNews);

/* template ausgeben */
$objTemplate->display(TEMPLATE);

?>
So, das war jetzt erstmal ein kleines Beispiel wie Du die Daten für das Template vorbereitest und dem Template zuweisen kannst.

Damit die Werte jetzt auch im Template übernommen werden, erstellst Du eine einfache HTML-Datei. Je nach dem wie Du Deine Seite aufgebaut hast, kannst Du HTML-Fragmente, welche auf jeder Seite auftauchen, in eine seperate Template-Datei packen. Die werden dann später im Template eingebunden. Also würde jetzt in dem Template für die Newsausgabe auch nur der jeweilige HTML-Block stehen, der für die News-Seite gedacht ist. Der Rest der Seite steht halt wiederum in globalen Template-Dateien. Vorteil hierbei ist, dass Du dann auch nur ein Template ändern brauchst.

Hier mal ein wenig Beispielcode für das News-Template um das ganze zu verdeutlichen:

Code:
<html>
<head>
	<title>{$page_title}</title>
</head>

<body>
   
<div id="head">
{include file="includes/page_header.tpl"}
</div>

<table border="0" cellspacing="0" cellpadding="0">
	<tr>
		<td><b>news:</b></td>
	</tr>
    {section name=data loop=$news}
    {strip}                        
    <tr>
        <td>{$news[data].headline}</td>
	</tr>
    <tr>
        <td>{$news[data].newsbody}</td>
	</tr>
    <tr>
        <td align="right">{$news[data].author}</a> | {$news[data].datum}</td>
    </tr>
    {/strip}
    {/section}                           
</table>

<div id="bottom">
{include file="includes/page_bottom.tpl"}
</div>

</body>
</html>
Also, wie Du siehst binde ich in dem Template zwei weitere Templates ein. Jeweils den oben und den unteren Teil. Der eigentliche "Inhalt" steht jedoch im Template selbst. Da ich im PHP-Code das erzeugte Array mit allen News-Elementen dem Template-Block news zugewiesen habe, kann ich im Template das ganze Array über die Variable $news ansprechen. Jetzt nur noch ein einfacher Loop durch das ganze News-Array, wobei wie oben schon geschrieben, die einzelnen Array-Elemente sich mit dem Array-Index aus dem PHP-Script ansprechen lassen.

DAS ist ein vernünftiges Template-System. Weil hier nämlich wirklich konsequent (PHP-)Code vom HTML-Code getrennt wird. Smarty bietet es zwar an, in den Template PHP-Code einzubauen, aber ich halte davon nicht viel, weil es das Prinzip des Templates-Systems zu nichte macht. Alles was ich jetzt oben geschrieben habe ist auch kein großes Geheimnis, zumal es ja auch ausführlich auf der Smarty-Website beschrieben ist; sogar in deutsch ;)
 
Zurück