Mehrere TPL's zusammenfügen

Hallo,

ich weiss dass das, was ich vorhabe funktioniert, aber ich weiss leider nicht WIE, darum frag ich euch mal.

Also ich habe meine Seite und dort wechsel ich durch
http://example.tld/index.php?site=news
die Seite …

nun möchte ich auf der Newsseite ein zusätzliches TPL verwenden … also einmal eben das Standarttpl der Indexseite und dann noch das Zusatztpl für die Newsseite in der dann eben die Anordnung der Newsinhalte definiert ist.

Wie geht denn das?!

Also ich habe es so probiert:

[PHP]

<? $tpl_news = new Template('news'); $test = "Dies ist nur ein Test!"; $tpl_news->replace(array('test'=>$test)); $tpl_news->printTemplate(); ?>

[/PHP]
in der news.tpl.html steht nur:
[HTML]
{{test}}
[/HTML]

Wenn ich die Seite
http://example.tld/index.php?site=news
aufrufe, wird nur das Standarttpl angezeigt (also index.tpl.html) und das Newstpl wird völlig ignoriert …

Hoffe ihr könnt es mir erklären oder mir ein Tutorial dazu schicken …

PS: Google wurde gefragt …

Da müsste man schon den genaueren Code-Kontext sehen, wie das Index-Template eingebunden ist und wie du versuchst, das News-Template hinzuzufügen.

Ok … also ich hab grad festgestellt, dass es „doch geht“ … aber iwie nicht ganz so, wie es laufen soll …

Also derzeit wird der Inhalt von $text im Header angezeigt, versteh auch warum, aber es soll eben wo anders hin …

soll ich euch jetzt die index.php und die template.class.php senden?!

Wäre im Zweifel nicht schlecht. So kann zumindest ich da nichts zu sagen.

Vielleicht hat die Template-Klasse eine Methode, die den Inhalt nicht ausgibt, sondern als String zurückgibt. Den könntest du dann wiederum dem Index-Template zuweisen. Ansonsten kannst du einen Output Buffer drumrum bauen, um denselben Effekt zu erzielen (die Ausgabe des News-Templates in eine Variable speichern).

[PHP]

<?php class Template { var $content; function Template($file) { $tpl = 'templates/'.$file.'.tpl.html'; $handle = fopen($tpl,'r'); $this->content = fread($handle,filesize($tpl)); fclose($handle); } function printTemplate() { echo $this->content; } function replace($array) { foreach ($array as $k=>$v) { $this->content = str_replace('{{'.$k.'}}',$v,$this->content); } } function returnTemplate() { return $this->content; } } ?>

[/PHP]
template.class.php

[PHP]

<? $template = new Template('index'); $template->replace(array('content'=>$content)); $template->printTemplate(); ?>

[/PHP]
auschnitt index.php

hmm bei mir funktioniert die seite nicht.
hast du einen funktionierenden link zufaellig?

Na, das sieht doch machbar aus. Von der Idee her so:

[php]$newsTemplate = new Template(‚news‘);
$newsTemplate->replace(array(‚test‘ => ‚Hallo Welt!‘));
$newsContent = $newsTemplate->returnTemplate();

$template = new Template(‚index‘);
$template->replace(array(‚content‘ => $content,
‚newsContent‘ => $newsContent));
$template->printTemplate();[/php]

Oo?
Also ich hab es etz so gemacht … aber … es wird irgendwie nichts ausgegeben …
also das {{test}} wird nicht angezeigt, aber es wird auch kein Hallo Welt! angezeigt …

Keine Ahnung. So geht es aber. Ohne Code lässt sich nicht sagen, wo es bei dir hakt.

index.php:

[php]<?php

class Template {
var $content;
function Template($file) {
$tpl = ‚templates/‘.$file.‚.tpl.html‘;
$handle = fopen($tpl,‚r‘);
$this->content = fread($handle,filesize($tpl));
fclose($handle);
}
function printTemplate() {
echo $this->content;
}
function replace($array) {
foreach ($array as $k=>$v) {
$this->content = str_replace(‚{{‘.$k.‚}}‘,$v,$this->content);
}
}
function returnTemplate() {
return $this->content;
}
}

$newsTemplate = new Template(‚news‘);
$newsTemplate->replace(array(‚test‘ => ‚Hallo Welt!‘));
$newsContent = $newsTemplate->returnTemplate();

$content = ‚Dies ist ein Test.‘;

$template = new Template(‚index‘);
$template->replace(array(‚content‘ => $content,
‚newsContent‘ => $newsContent));
$template->printTemplate();[/php]

templates/news.tpl.html:

[html]

News

{{test}}

[/html]

templates/index.tpl.html:

[html]

Insert title here

{{content}}

{{newsContent}}

[/html]

Ok … also soweit funktioniert das schon, also es wird zumindest was ausgegeben …
aber es passt immernoch nicht ganz ^^

[PHP]

<? defined ('main') or die ( 'no direct access' ); $newsTemplate = new Template('news'); $query="SELECT DATE_FORMAT(datum, '%d.%m.%Y') AS datum, DATE_FORMAT(zeit,'%k:%i') AS zeit, news, tags, topic FROM news WHERE senden = '1' ORDER BY DATE_FORMAT(datum, '%Y-%m-%d') DESC, zeit DESC LIMIT 0,3"; $sql = mysql_query($query); while ($ds=mysql_fetch_object($sql)) { $datum = $ds->datum; $zeit = $ds->zeit; $news = $ds->news; $tags = $ds->tags; $topic = $ds->topic; if (empty($tags)) { $tags = "n/A"; }; if(empty($topic)) { $topic ="News"; }; $news = BBcode($news); $newsTemplate->replace(array( 'topic' => $topic, 'datum' => $datum, 'zeit' => $zeit, 'news' => $news, 'tags' => $tags ) ); } $newsContent = $newsTemplate->returnTemplate(); $main = $newsContent; ?>

[/PHP]

Wenn ich das so mache, wird nur EINE von DREI Nachrichten angezeigt …

Ich weiss echt nicht, wo der Fehler liegt … sry …

Grüsse
Daniel

Es wird nur die erste Nachricht angezeigt, oder?

Du arbeitest dreimal auf demselben Template. Beim ersten Durchlauf der while-Schleife werden die Platzhalter passend ersetzt, beim zweiten Durchlauf wird im bereits fertig ersetzten String wieder versucht die Platzhalter zu ersetzen. Das schlägt natürlich fehl.

[php]<?php

defined (‚main‘) or die ( ‚no direct access‘ );

$main = ‚‘;

$query = „SELECT
DATE_FORMAT(datum, ‚%d.%m.%Y‘) AS datum,
DATE_FORMAT(zeit,‚%k:%i‘) AS zeit,
news,
tags,
topic
FROM
news
WHERE
senden = ‚1‘
ORDER BY
DATE_FORMAT(datum, ‚%Y-%m-%d‘) DESC,
zeit DESC
LIMIT
0,3“;
$sql = mysql_query($query);

while ($ds = mysql_fetch_object($sql)) {
if (empty($ds->tags)) {
$ds->tags = ‚n/A‘;
}
if (empty($ds->topic)) {
$ds->topic = ‚News‘;
}
$ds->news = BBcode($ds->news);

$newsTemplate = new Template('news');

$newsTemplate->replace(array(
    'topic' => $ds->topic,
    'datum' => $ds->datum,
    'zeit'  => $ds->zeit,
    'news'  => $ds->news,
    'tags'  => $ds->tags
));

$main .= $newsTemplate->returnTemplate();

}

// Inhalt sollte an dieser Stelle passend in $main stehen[/php]