# Buch gesucht, OOP / Templates



## Leomuck (1. Juli 2007)

Hi,

ich wollte mich in den Sommer-Ferien an einem etwas ausgeprägteren CMS (zur Übung, nicht zu kommerziellen Zwecken) probieren.

Bei den Sachen, die ich bisher gemacht habe, was so etwas eigentlich nicht nötig, aber für das geplante würde ich ganz gerne mit Templates arbeiten, möglicherweise OOP anwenden.

Nun kenne ich mich mit beidem nur wenig aus, soviel wie in meinem allgemeinen Webprogrammierungs-Büchern dazu steht und das ist leider nicht sonderlich viel.

Ich möchte den Umgang mit beidem lernen und würde dabei ganz gerne auf ein Buch zurückgreifen, bisher habe ich aber nichts gefunden.

Kann mir jemand ein Buch empfehlen, was das Thema "Templates in Verbindung mit PHP" und "OOP in PHP" gut umfasst, Basis- wie auch Fortgeschrittenenwissen vermittelt?

Danke für eure Antworten, Leander


----------



## saftmeister (1. Juli 2007)

Zum Thema OOP hab ich das hier gefunden: http://www.amazon.de/PHP-für-Fortge...3764135-4365313?ie=UTF8&qid=1183308104&sr=8-8

Hab es selbst noch nicht gelesen, aber die Kunden-Rezessionen sind ganz brauchbar.

Zum Thema Templating: Hier hab ich keine allgemeinen Bücher gefunden nur was zum Thema Smarty: http://www.amazon.de/Smarty-PHP-Tem...ie=UTF8&s=books-intl-de&qid=1183308365&sr=8-2

Auch das hab ich nicht gelesen. Leider hat es keine Kunden-Rezessionen, daher sind die 30€ riskant angelegt. Allerdings denk ich, das man ohnehin durch Benutzung der Smarty-Doku die gleichen Ergebnisse wie mit einem Buch erzielen kann.


----------



## Leomuck (1. Juli 2007)

Ersteres klingt ja ganz gut, jedoch bin ich eigentlich auf der Suche nach einem Buch, was beide Themen umfasst, wobei ich die Hoffnung fast aufgegeben habe. Notfalls werde ich mir ein PHP / OOP-Buch kaufen und auf die Doku setzen, wobei die ja für blutige Anfänger schon ein wenig hochgegriffen ist. Mal schauen.

Zu dem Smarty-Buch, darauf bin ich bei Amazon auch schon gestossen, jedoch scheint das Buch auf Englisch und das bringt mir dann relativ wenig. Ich verstehe zwar das meiste, aber das macht das Ganze nur schwerer. So ein Thema zu verstehen ist schon schwer genug für mich, dann noch in Englisch, das erleichtert die Sache nicht gerade.

Kurze Zwischenfrage:
Ich habe vor, mich an einem Clan CMS zu versuchen. Es wird von mir in ein bestehendes Design angebaut, es wird keinerlei Style-Möglichkeiten geben für den Administrator. Das heißt, er kann den Style nicht verändern, lediglich den Inhalt (News, Polls, Wars, usw.). Auch gibt es keine Einstellungsmöglichkeiten für den Admin. Da ich das CMS in ein eigenes Design (zu Testzwecken) einbauen möchte, gibt es da keinerlei Möglichkeiten für den Administrator, daran was zu verändern. Lediglich den Inhalt -> Content Management System.

Sind für ein solches System Templates überhaupt notwendig btw. empfehlenswert? Ich fühle mich derzeit ein wenig "überfragt", wenn ich an Templates denke.


----------



## boast (2. Juli 2007)

> Sind für ein solches System Templates überhaupt notwendig btw. empfehlenswert? Ich fühle mich derzeit ein wenig "überfragt", wenn ich an Templates denke.



Es kommt ganz darauf an, wie weit du gehen willst:
PHP ist "an-sich" schon eine sehr gute TemplateEngine, als kleiner Vergleich:

Smarty:

```
Hallo, es ist {time} Uhr.
```
PHP:

```
Hallo, es ist <?php echo($time); ?> Uhr.
```
oder kurz: (hoffe mal, das stimmt so...)

```
Hallo, es ist <?=$time ?> Uhr.
```

TemplateEngines sollen Code vom Design - mit richtigem Einsatz von CSS eher Code von "der Seiten Struktur" trennen. Allgemein, wenn du nicht zu viele Tabellen benützt, sondern alles in ein-zwei Div's verpackst (kein Div-Chaos), kann man per CSS extrem viel herausholen (da kann man schnell auch das Design ändern).
Aber ob es nötig ist - ja, ich denke, es ist immer Vorteilhaft mit einer TmplEng zu arbeiten, vorallem für den Überblick im Code und allfälligen Wartungs/Erweiterungs-Arbeiten, schon bei kleineren Projekten.


----------



## Leomuck (2. Juli 2007)

Die Trennung von PHP und HTML / CSS klappt aber doch auch wie folgt ganz gut (?):


```
<html>
[...]
<?php include 'inhalt.php'; ?>
[...]
</html>
```


----------



## ByeBye 182971 (2. Juli 2007)

auf jedenfall...

außerdem könntest du auch die eine einfache Templatefunktion erstmal bauen wenn du nicht viele sachen im template ersetzten musst.

Etwa nach dem Schema:

```
function template($text)
{
global $title, $name;
// Sagen wir mal du willst nur titel und name ersetzten
str_replace('{title}', $title, $text);
str_replace('{name}', $name, $text);
}

// Anwendung:
$text = 'Der {title} ist von {name} erstellt.';
$title = 'Bla';
$name = 'Ass';
template($text);
echo $text;

// Müsste "Der Bla ist von Ass erstellt." ausgeben
// Habs aber nicht getestet!
```

So eine Template funktion die so wenig kann lohnt sich fast schon ab 10 ersetzten variablen nicht mehr wenn nicht schon früher  (gibt vieeel bessere Lösungen!)
Du kannst aber auch mal nach einer eigenen Template Klasse suchen nach einer Anleitung. Weil wozu brauchst du ein Buch für Geld wenn du deine Anleitung auch hier auf solchen Seiten bekommst?

Gruß suf*****


----------



## Flex (2. Juli 2007)

Statt mit global zu arbeiten, würde ich lieber mit einem Array arbeiten.

Eine kleiner Anstoß:


```
function template($text, $vars = array()) 
{

	for($i = 0; $i < count($vars); $i++) 
	{  
		$text = str_replace("{".key($vars)."}", current($vars), $text);
		next($vars);
	}
	
	return $text;

}

$string = "Hallo {name}, es ist {uhrzeit}";

$vars['name'] = "hans";
$vars['uhrzeit'] = "12:00";
echo template($string, $vars);
```

ALLE Variablen die nicht von dir gesetzt werden, sollten natürlich validiert werden (z. B. Formulareingaben).


----------



## Leomuck (2. Juli 2007)

Guckt doch bitte mal den Beispiel-Code, den ich gepostet habe. Was ist an dem schlechter an als Templates?

Code und Design sind voneinander getrennt..ich sehe bisher keinen wirklichen Vorteil in Templates, welcher mich dazu verleiten könnte, diese zu benutzen.


----------



## saftmeister (2. Juli 2007)

1. Du hast nicht PHP-Code von HTML getrennt. Sobald beides in einer Datei drin ist, ist die Trennung nicht vorhanden. Und include ist definitv ein PHP-Befehl.

2. Wenn du der Meinung bist, das Templates nicht notwendig sind, warum willst du dann ein Buch dazu?

Trennung von Funktions- und Präsentationslayer hat Vor- und Nachteile::

+ Du lädst ein Template in alle PHP-Scripts die du hast, wenn du Änderungen am Design vornehmen musst/willst, änderst du es an einer Stelle, es werden alle Seiten angepasst.
+ Dein Code ist wesentlich leichter wartbar, weil übersichtlicher

- Das Entwickeln einer Template-Engine ist aufwendig
- Das Verwenden von Templates kostet natürlich etwas Zeit für das Laden und Parsen

Du musst für dich selbst entscheiden, was für dich sinnvoller ist.


----------



## Flex (2. Juli 2007)

Und wie formatierst du inhalt.php?
Da musst du doch auch wieder HTML verwenden und somit ist dein Vorschlag, meiner Meinung nach, nicht ganz brauchbar (es sei denn ich habe es falsch verstanden).


----------



## Leomuck (2. Juli 2007)

Dass ich keine Templates für mein nächstes Projekt anwenden will, heißt ja nicht, dass ich das nie machen werde. Ich will es lernen, halte es aber bei dem Projekt nicht für sinnvoll.

Klar, PHP-Code und HTML-Code sind nicht von einander getrennt, aber es ist trotzdem übersichtlich, da ja nur ein einziger PHP-Befehl in der Datei steht. In der index.php ist das Design, die paar Includes machen den Inhalt, natürlich wird der Inhalt da auch per CSS / HTML formatiert, jedoch halte ich das nicht für komplizierter.

Ich konnte nach wie vor noch keinen entscheidenden Vorteil an Templates für mein anstehendes Projekt finden. Für Forensysteme oder richtige CMS-Systeme ist das sicherlich sinnvoll, dem User "zuliebe", jedoch kann ich in Templates für mein geplantes "Mini-CMS" keine große Erleichterung finden, insofern werde ich mich wahrscheinlich bei diesem Projekt dagegen entscheiden. Trotzdem habe ich aber vor, zu lernen, mit Templates zu arbeiten, um es in späteren Arbeiten anzuwenden.

Ich denke, für mein erstes Projekt gleich Templates anzuwenden, von denen ich bisher noch kaum verstehe, wie ich diese anwenden soll (abgesehen von der "Hallo {bla}"-Variante), ist doch vielleicht ein wenig zu hoch zugriffen.

Wenn ich es jedoch schaffe, mir in den nächsten 2 Wochen genug Wissen über Templates anzueignen, werde ich es durchaus in Betracht ziehen, diese auch zu nutzen, jedoch ist derzeit noch viel zu viel unklar, deswegen hätte ich gerne ein Buch (eBooks sind für mich lange nicht dasselbe).

Ich verstehe z.B nicht, wie ich folgendes regeln könnte: Ich habe in der Template-Datei ein Formular, wie kann ich dieses Formular überhaupt auswerten? Wenn es in der Template-Datei steht? Solche Sachen sind mir im Moment vollkommen unklar, was wohl nicht zuletzt auch der Grund dafür ist, dass ich mich noch weigere, Templates in Betracht zu ziehen, als Feature meines "Mini-CMS"s.

P.S.: Die Dokumentation von Smarty hilft mir relativ wenig. Auch viele Tutorials über Templates, die ich mir schon angeschaut haben, ergaben keinen großen Lernerfolg, weil ich einfach viel zu wenig verstehe. Ich habe das Gefühl, noch kein "Basis"-Wissen-Tutorial gefunden zu haben, ich will ein Buch :/


----------



## saftmeister (2. Juli 2007)

Leomuck hat gesagt.:


> Ich verstehe z.B nicht, wie ich folgendes regeln könnte: Ich habe in der Template-Datei ein Formular, wie kann ich dieses Formular überhaupt auswerten? Wenn es in der Template-Datei steht? Solche Sachen sind mir im Moment vollkommen unklar, was wohl nicht zuletzt auch der Grund dafür ist, dass ich mich noch weigere, Templates in Betracht zu ziehen, als Feature meines "Mini-CMS"s.



Grundsätzlich genauso wie ein Formular, das mittels echo "generiert" wird. Im Anhang ist ein PDF, das den Sachverhalt vielleicht etwas klärt.


----------



## Leomuck (3. Juli 2007)

Oha, das sieht doch schon viel besser aus. So langsam verstehe ich die Funktionsweise von Templates (auch wenns dumm klingt ).

Nun..ich werde mich wohl entscheiden, Templates einzusetzen, erscheint mir doch nur als vernünftig, jetzt habe ich allerdings folgendes Problem. Meine bisherigen Tests (Templates) habe ich mit Smarty gemacht, wenn ich nun aber mein Mini-CMS auf einem Server ohne Smarty laden möchte, funktioniert das alles ja nicht mehr.

Gibt es eine Möglichkeit, von Smarty wegzukommen oder muss ich das überhaupt?


----------



## Leomuck (4. Juli 2007)

Noch eine spezielle Frage: wie wäre folgendes mit Templates umzusetzen:

Man hat ein ganz normales Gästebuch, was, solange Datensätze da sind, diese untereinander anzeigt.

Nun kann ich mit Templates die Anzeige der Einträge bauen, aber wie kann ich dann bestimmen, wie oft diese da sein soll? Sorry, wenns etwas undeutlich ist.

Ähnliche Frage: wenn ich ein Select habe mit Einträgen, die PHP generiert, sieht das im Template so aus:

```
<select [..]>{$options}</select>
```
oder so?

```
<select [..]><option name="{$options_name}">{$options_value}</option></select>
```

Bei letzterm stellt sich die gleiche Frage, wie bei dem Gästebuch. Wenn ich per Template die Select-Liste definiert habe und auch ein Options-Feld, wie kann ich dann per PHP bestimmen, wieviele Optionen es gibt?

Hm..habs versuch, 1. geht wenn man dann in PHP (Templates, Smarty) z.B. folgendes schreibt:

```
$template->assign('OPTIONS', '<option></option><option></option>');
```
Also alle Options auflistet, ich schätze, das geht beim GB dann genauso?


----------



## Leomuck (6. Juli 2007)

Hat sich geklärt.

Für mich ist jetzt nur noch wichtig zu wissen, wie das mit Smarty ist.

Gibt es eine Alternative? Bzw. kann ich Smarty einsetzen? Was passiert, wenn auf einem Server Smarty nicht drauf ist, dann läuft mein CMS nicht?

Da tappe ich derzeit noch komplett im Dunklen.


----------



## nosilume (6. Juli 2007)

Zu Smarty: Du musst Smarty selber herunterladen bzw. auf den Server aufspielen. Tust du das nicht wird dein Script zwangsläufig nicht laufen ;-)
Du kannst es hier herunterladen: http://smarty.php.net/
Alternativen gibts es durchaus: ezComponents hat eine Template klasse, das Zend Framework (mit _Zend_View_) und generell eigentlich jedes gute Framework. Mit ein bisschen Suchen findest du aber auch kleinere (vielleicht schnellere) Klassen, die nicht so bekannt sind.

Zu Template Engines: Ich halte sie allgemein für überflüssig. Es spricht nichts gegen PHP in HTML, weil PHP ansich schon eine Templatesprache ist. Außerdem ist es hundert mal schneller als es mit Smarty "übersetzen" zu lassen.
Im Grunde geht es nicht darum, PHP von HTML zu trennen, sondern die Applikationslogik von der Darstellungslogik (siehe dazu MVC)


----------



## Leomuck (6. Juli 2007)

Kann man denn auf *jeden* Server Smarty installieren?

So habe ich auch gedacht, allerdings sind Templates durchaus nicht unpraktisch. Ich bin mir nicht sicher, da ich noch nicht viel damit gemacht habe, aber es scheint mir durchaus als eine Erleichterung und Vereinfacherung beim Programmieren.

Langsamer? Wie meinst du das? Es dauert länger, bis die Seite aufbaut oder wie?


----------



## Flex (6. Juli 2007)

Bei kleinen Seiten wird die Behäbigkeit von Smarty durch den Cache meiner Meinung nach ersetzt (es sei denn man hat Zugriff auf ein weiteres Cache System).

Und ja, so ziemlich jeder Server mit PHP kann auch Smarty laufen lassen.

Nils hat mal in seinem Blog dazu etwas erwähnt. 
Mal wieder ein Tooltip von Tim.


----------



## Leomuck (6. Juli 2007)

HS-Template klingt ja nicht schlecht, jedoch verstehe ich die Funktion getDisplay() nicht.



> Instantiate the HSTemplateDisplay object
> 
> // index page
> $DisplayIndex = & $HSTemplate->getDisplay('index');


Kann mir das jemand erklären? :/

Bin ja noch neu auf dem Gebiet =)


----------



## ByeBye 182971 (6. Juli 2007)

gibt es keine Dukumentation des Template Systems?

Nutze doch keine Engine wenn du noch gar nicht auf dem Level dafür bist.
Naja deine Sache....


----------



## Leomuck (6. Juli 2007)

So schwierig ist das ja nicht. Wenn man die nötigen Funktionen kennt, passt das schon.


----------



## ByeBye 182971 (6. Juli 2007)

ja aber warum sollte man sich dann keine eigene kleine Klasse schreiben die alles beinhaltet was man braucht (meist sogar weniger als 6 funktionen)?

Wozu in eine Fremdeklasse einarbeiten?


----------



## saftmeister (6. Juli 2007)

Was spricht denn gegen Smarty? Es ist das wohl am meisten verwendetste Template-System im PHP-Sektor. xtcommerce verwendet es, in Drupal kann man es verwenden, Typo3 hat auch ein Plugin.

Wenn du grundsätzliche Infos haben willst, wirst du, egal welche TE nicht drum herum kommen, die Doku bzw. Tutorials dazu zu lesen.

Hier ein Beitrag in Wikipedia zu Smarty: http://de.wikipedia.org/wiki/Smarty


----------



## saftmeister (6. Juli 2007)

suf***** hat gesagt.:


> ja aber warum sollte man sich dann keine eigene kleine Klasse schreiben die alles beinhaltet was man braucht (meist sogar weniger als 6 funktionen)?
> 
> Wozu in eine Fremdeklasse einarbeiten?



Ganz einfach, für einen, der gerade damit anfängt, sich mit Templates auseinanderzusetzen, ist es schlichtweg ein schweres Unterfangen. Mal von der Umsetzung abgesehen sind auch sicherheitstechnische Fragen zu klären. Dann lieber an vorhandenem inspieren und damit experimentieren. Mal davon abgesehen muss man das Rad nicht immer neu erfinden, wenn es dafür eine sehr gute Schnittstelle gibt. Außer man ist Paranoiker, aber dann sollte man ohnehin vom Netzprogrammieren die Finger lassen, IMHO.


----------



## nosilume (6. Juli 2007)

Leomuck hat gesagt.:


> Kann man denn auf *jeden* Server Smarty installieren?


Wie einer meiner Vorredner schon gesagt hat: ja. Dadurch, das Smarty in PHP 4 geschrieben ist (es ist doch noch immer PHP 4, oder ?) läuft es praktisch (99,9 %) überall.


Leomuck hat gesagt.:


> So habe ich auch gedacht, allerdings sind Templates durchaus nicht unpraktisch. Ich bin mir nicht sicher, da ich noch nicht viel damit gemacht habe, aber es scheint mir durchaus als eine Erleichterung und Vereinfacherung beim Programmieren.


Templates sind auch in allen modernen und portablen Webapplikationen Pflicht. Ich halte Smarty aber nur bedingt als Templatesystem geignet, weil es einfach überflüssig ist. Ich kann meine Variable durch _{$foobar}_ ausgeben und durch _<?php echo $foobar ?>_. Ich kann auch meine If-Abfragen in Smartys Sprache schreiben oder in PHP. Nur muss ich für Smartys Sprache mich wieder durch endlos lange Anleitungen und Dokumentationen quälen. Da ist es mir lieber, wenn ich auf Smarty verzichte und es in PHP schreibe. Das tolle ist nämlich: Ich verwende _Zend_View_ (ich bin etwas vom Zend Framework beindruckt ^^), ich schreibe meine Templates in PHP (und HTML natürlich) und kann sie dann genau wie bei Smarty parsen lassen, nur alles viel schneller als bei Smarty (siehe weiter unten).


Leomuck hat gesagt.:


> Langsamer? Wie meinst du das? Es dauert länger, bis die Seite aufbaut oder wie?


Um die Seite zu erzeugen und die Variablen durch "richtige" PHP Variablen zu ersetzen, verwendet Smarty Reguläre Ausdrücke. Das ist natürlich langsamer als wenn alles schon in PHP dasteht, und nicht erst durch Smarty "geparst" werden muss. Vorallem bei vielen Variablen, und ein paar anderen Features von Smarty wirds wirklich lahm (Das gilt freilich nur bei einer gut besuchten Webseite. Bei 50 - 100 Besuchern am Tag wirds niemanden stören).


----------



## Leomuck (6. Juli 2007)

Die Smarty-Dokumentation habe ich mir durchgelesen, verstehe es soweit auch ganz gut, nur haben mich das hier und der Vorpost ziemlisch verunsichert. Smarty = langsam? Will ich ja eigentlich nich unbedingt..ein langsam-machendes Template-System.

Ich weiß, das ist eine dumme Frage, aber welche Template-Engine ist denn nun geeignet für mich? :/


----------



## ByeBye 182971 (6. Juli 2007)

deine eigene^^

ansonsten liste halt mal auf was du für funktionen brauchst


----------



## Leomuck (6. Juli 2007)

Soweit eigentlich nichts besonderes.

Abgesehen davon, dass ich viel mehr Funktionen bis dato auch nicht kenne, reichen mir die Funktionen um ein Template zu laden, Begriffe zu ersetzen und dann auszugeben.

[Smarty] assign(), display()

Allerdings spricht da jetzt der "Newbie" in mir


----------



## ByeBye 182971 (6. Juli 2007)

```
<?php

class Template
{
	
	var $source;
	var $file;
	var $vars;
	var $result;
	var $dir = 'templates/';
	
	function Template($filename)
	{
		if (is_dir($dir))
		{
			$file = $this->tpldir.$filename;
		
			if(!is_file($file) || !is_readable($file))
			{
				die('Datei nicht vorhanden/lesbar.');
			}
		
			$this->source = implode(file($file));
		}
		else die('Kein Ordner.');
	}
	
	function assign($var, $value)
	{
		$this->vars[$var] = $value;
	}
	
	function parse()
	{
		foreach ($this->vars as $search => $replace)
		{
			$this->result = str_replace('{'.$search.'}', $replace, $this->source);
		}
		
		$this->vars = null;
	}
	
	function show()
	{
		echo $this->result;
	}
}
?>
```

so ähnlich kann sie aussehen keine ahnung ob die t hab sie grad kurz gebastelt.
das sind wenige funktionen und das reicht für das was du vorhast!


----------



## Leomuck (6. Juli 2007)

Wuidedui O.O

Ist ja klasse =)

Funktioniert, jedoch nicht die "is_dir()"-Funktion, zeigt mir immer an "Kein Ordner".


```
$dir = './';
```


```
$dir = '';
```


```
$dir = './templates/';
```


```
$dir = 'templates/';
```


```
$dir = './templates';
```


```
$dir = 'templates';
```
Ergibt alles "Kein Ordner." (templates-Ordner existiert definitiv.).

Ähnliches passiert mir "is_file()" bzw. "is_readable".

Wenn $dir = '' ist, funktioniert es. Wenn $dir jedoch 'templates' (oder eine der oben geschriebenen Varianten) ist, der templates-Ordner existiert und die Datei drin liegt, kommt "Datei nicht vorhanden/lesbar.".


----------



## Flex (6. Juli 2007)

Wie rufst du denn die Klasse auf?


----------



## Leomuck (6. Juli 2007)

```
$blub = new template('test.tpl');
$test->assign('', '');
$test->parse();
$test->show();
```
Bitte nicht lachen, bin eben blutiger Anfänger in Sachen OOP und auch Templates


----------



## ByeBye 182971 (7. Juli 2007)

genau

ich hab noch ne adder funktion bei mir $test->get();
was praktisch noch $this->result .= $this->source; macht.

is ganz gut für schleifen und content einbinden....

aber bitte für die klasse hab sie grad schnell geschrieben sorry wenn fehler drin sind


----------



## ByeBye 182971 (7. Juli 2007)

```
<?php

class Template
{
    
    var $source;
    var $file;
    var $vars;
    var $result;
    var $dir = 'templates/';
    
    public function Template($filename)
    {
        if (is_dir($dir))
        {
            $file = $this->tpldir.$filename;
        
            if(!is_file($file) || !is_readable($file))
            {
                die('Datei nicht vorhanden/lesbar.');
            }
        
            $this->source = implode(file($file));
        }
        else die('Kein Ordner.');
    }
    
    public function assign($var, $value)
    {
        $this->vars[$var] = $value;
    }
    
    private function parse()
    {
        foreach ($this->vars as $search => $replace)
        {
            $this->result = str_replace('{'.$search.'}', $replace, $this->source);
        }
        
        $this->vars = null;
    }
    
    public function show()
    {
        $this->parse();
        echo $this->result;
    }
}
?>
```


```
//Aufruf über:
$test = new Template('test.tpl');
$test->assign('Title', 'TestPage');
$test->display();

//Jetzt wird parse automatisch ausgeführt.
```


----------



## Leomuck (7. Juli 2007)

Oki doki, vielen vielen Dank. Ich empfehle das Forum weiter (und bleibe natürlich selbst hier) 

Wobei der Aufruf dann mit show() getätigt wird, richtig? Oder ich ändere halt den Funktionsnamen.


----------



## ByeBye 182971 (7. Juli 2007)

jo genau

du kannst das ganze aber auch noch ähndern, wenn du nur show und assign brauchst kann man das auch auf die 2 variablen beschränken.....

aber es wird wohl kaum schneller gehen.....


----------



## Leomuck (8. Juli 2007)

Habe doch noch eine Frage, nochmal zu der Sache mit einem Gästebuch / Forum.

Ich habe mir mal ein wenig den Code von phpBB angeschaut und mir ist folgendes aufgefallen: in dem Template viewtopic_body.tpl (glaube ich) steht der Aufbau eines einzelnen Beitrags. Jetzt hat ein Topic doch höchstwahrscheinlich mehr als einen Beitrag, wie ist das gemacht?



> -------------------------
> | Autor | Message |
> -------------------------



So sieht das da abgerundet aus. Irgendwie muss man diesen Teil des Templates doch duplizieren können o.Ä.?


----------



## ByeBye 182971 (8. Juli 2007)

so wie ich das mit meiner get() funktion beschrieben habe.

ich bring mal ein beispiel:

```
// gb.php als bsp

//db ist connected

$t_gb = new Template;
$t_gb->file('gb.tpl'); // in gb.tpl ist das TPL für einen einzelnen post
while ($gb = mysql_fetch_row())
{
    $t_gb->append(); // Fügt wegen schleife $this->result .= $this->source
    $t_gb->assign('news', $gb['1']); // News aus db zu {news} im tpl
    // $t_gb->assign ......
    $t_gb->parse(); // Parsed jetzt die daten der schleife"runde"
}
$content = $t_gb->get(); // Die gesamten beiträge in $content

$t_main = new Template;
$t_main->file('main.tpl');
$t_main->append();
$t_main->assign('content', $content);
$t_main->parse();
$t_main->display(); // Jetzt erst wird angezeigt
```

So hab ich das gibt aber mehrere möglichkeiten smarty bieter schleifen im tpl aber davon halte ich nichts weils dann find ich die wirkung code und html zu trennen verfehlt!


----------



## Leomuck (8. Juli 2007)

Hm..so funktioniert gar nichts. Möglicherweise, bzw. sicher, stelle ich mich dumm an.


```
class template
{
	var $source;
	var $file;
	var $vars;
	var $result;
	var $dir = './';
		
	public function template($filename)
	{
		if(is_dir($dir))
		{
			$file = $this->tpldir.$filename;
				
			if(!is_file($file) || !is_readable($file))
			{
				die('Datei nicht vorhanden/lesbar.');
			}
				
			$this->source = implode(file($file));
		}
		else
			die('Kein Ordner.');
	}
		
	public function assign($var, $value)
	{
		$this->vars[$var] = $value;
	}
		
	private function parse()
	{
		foreach($this->vars as $search => $replace)
		{
			$this->result = str_replace('{'.$search.'}', $replace, $this->source);
		}
			
		$this->vars = NULL;
	}
		
	public function display()
	{
		$this->parse();
			
		echo $this->result;
	}
}
```
Fehler: Kein Ordner.
- Da habe ich die Funktion is_dir() erstmal rausgenommen.

Fehler: Invalid argument supplied for foreach()

Außerdem sind append() und get() ja nicht definiert in meinem "Template-System".
- Auch hier habe ich append() und get() erstmal auskommentiert.

Dann bekomme ich noch folgenden Fehler:
Call to private method template:arse() from context ''

Sorry, ich stehe irgendwie auf einem ganz breitem Schlauch.


----------



## ByeBye 182971 (8. Juli 2007)

hehe ja so wie ich das beschrieben habe brauchst du 2 neue funktionen und muss alle public setzen.....

das solltest du selber schreiben ich mag meine jetzt nicht posten saß ich zu lang davor um den denkansatz zu finden

Bei is_dir($dir) muss is_dir($this->dir) hin


----------



## Leomuck (8. Juli 2007)

Meine eigenen schreiben..ich dachte, ihr kennt mein derzeitiges Niveau 

Naja, dann muss ich halt im PHP-Skript die ganzen Beiträge (von z.B. einem Gästebuch) samt HTML/CSS machen :/


----------



## ByeBye 182971 (8. Juli 2007)

wieso gib doch einfach mit echo aus und html dann brauchst du keine template engine

ich will dir nicht alles schreiben sonst machst du ja nix mehr selber


----------



## Leomuck (8. Juli 2007)

Du, wenn ich auch nur ansatzweise Ahnung hätte, würde ich es versuchen. Und es wäre mir sehr viel lieber gewesen, ich hätte das "Template-System" alleine schreiben können.

Jedoch fehlt mir jeglicher Ansatz.

Btw. weißt du, wie der foreach()-Fehler zustande kommt?

Edit: Ich habe eine Idee, ich versuch mal mein bestes und melde mich dann wieder


----------



## Leomuck (9. Juli 2007)

Eigentlich könnte man doch auch folgendes machen:

```
while($row = mysql_fetch_object($result))
{
    $tpl = new template('insert.tpl');
    $tpl->assign('NEWS', $row->news);
    $tpl->display();
}
```
Oder entsteht da ein Nachteil?

Achso..das Problem mit der foreach()-Schleife besteht leider immer noch


----------



## ByeBye 182971 (9. Juli 2007)

ja es würde schon funktionieren ich hatte damit öfter probleme, da man nicht nur content in der while schleife ausgeben kann!

so muss man entweder per include arbeiten und in das maintpl einbinden

oder man muss entweder nur beiträge oder so ausgeben.....

keine ahnung müsste eigentlich funktionieren, aber mach mal einfach oben bei:

var $vars

ein "= array();" dran

sprich: var $vars = array();


----------



## Leomuck (9. Juli 2007)

Hi,

ich habe mal was einfaches versucht.

_template.php

```
<?php
	class template
	{
		var $source;
		var $file;
		var $vars = array();
		var $result;
		var $dir = './templates/';
		
		public function template($filename)
		{
			if(is_dir($this->dir))
			{
				$file = $this->dir.$filename;
				
				if(!is_file($file) || !is_readable($file))
					die('Datei nicht vorhanden/lesbar.');
				
				$this->source = implode(file($file));
			}
			else
				die('Kein Ordner.');
		}
		
		public function assign($var, $value)
		{
			$this->vars[$var] = $value;
		}
		
		private function parse()
		{
			foreach($this->vars as $search => $replace)
			{
				$this->result = str_replace('{'.$search.'}', $replace, $this->source);
			}
			
			$this->vars = NULL;
		}
		
		public function display()
		{
			$this->parse();
			
			echo $this->result;
		}
	}
?>
```

index.php

```
<?php
	session_start();

	include '_template.php';
	include '_mysql.php';
	//include '_functions.php';
	
	$index_header = new template('index_header.tpl');
	$index_header->display() or die('a');
	
	//include '_content.php';
	
	$index_footer = new template('index_footer.tpl');
	$index_footer->display() or die('b');
?>
```
Das Template existiert und liegt im "templates"-Ordner, sonst würde ich ja auch eine Fehlermeldung bekommen.

Das Ergebnis davon ist "a". Hast du eine Idee, wieso?

Sorry, dass ich soviel fragen muss =(


----------



## ByeBye 182971 (10. Juli 2007)

echo 'xyz' or die('a');

was soll das sein?

wieso machst du "or die a"? versteh ich nicht

zeigt er nix an?


----------

