Buch gesucht, OOP / Templates

Code:
$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 :(
 
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
 
PHP:
<?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;
    }
}
?>

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

//Jetzt wird parse automatisch ausgeführt.
 
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.
 
Zuletzt bearbeitet:
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.....
 
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.Ä.?
 
so wie ich das mit meiner get() funktion beschrieben habe.

ich bring mal ein beispiel:
PHP:
// 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!
 
Hm..so funktioniert gar nichts. Möglicherweise, bzw. sicher, stelle ich mich dumm an.

PHP:
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::parse() from context ''

Sorry, ich stehe irgendwie auf einem ganz breitem Schlauch.
 
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
 
Zurück