template engine semplice

Jerry6565

Nuovo Utente
17 Giu 2008
3
0
0
Salve a tutti,

Sono nuovo in questo forum ma ho fatto un po' di ricerche prima di porre i miei quesiti. Piacere a tutti sono Ivo ^^

Volevo chiedere se qualcuno conosce un template engine, semplice e lineare e di poche righe che permetta giusto di sostituire variabili, creare loops, ed includere altri template attraverso ad una sintassi occhiabile...

Creai al suo tempo una classe, che mi è risultò davvero utile per diversi progetti, ma ora proprio non riesco ad implementarci alcune nuove funzioni che adesso ritengo fondamentali.

PHP:
class template {
private $__file;
    function __construct($f){ // $f => file
        $this->__file = file_get_contents($f);
    }
    function set($t) { // $ => tag (array[tag] = valore)
        foreach($t as $tag => $valore) {
            $this->__file = str_replace("{".$tag."}", $valore, $this->__file);
        }
    }
    function display() {
        return $this->__file;
    }
    function __destruct() {
        unset($this->__file);
    }
}

Ho pensato giustamente di muovermi verso le regExp, ma dopo diversi tentativi mi arrendo :( con sola farina del mio sacco non ci reisco :confused:

Potete darmi qualche dritta x aiutarmi creare una classe di questo tipo? vi ringrazio tantissimo.
 
Ciao,
io ho creato una mia classe per il template, ma per ora preferisco non renderla pubblica, anche perchè è ancora in fase alpha di testing.
Però posso darti qualche suggerimento per quanto riguarda le espressioni regolari.
Le tre che ti passo servono per sostituire le variabili, per creare loop e per gli if.
PHP:
$tpl = preg_replace('#\{([a-zA-Z0-9\._]+)\}#seU', 'classe::funzione_1("\1")', $tpl);
$tpl = preg_replace('#\{loop name\=\"(.*)\"\}(.*)\{\/loop\}#seU', 'classe::funzione_2("\1", \'\2\')', $tpl);
$tpl = preg_replace('#\{if exp\=\"(.+)\"\}(.*)\{else\}(.*)\{\/if\}#seU', 'classe::funzione_3("\1", "\2", "\3")', $tpl);
E rispettivamente funziano così:

Variabile normale
Codice:
{nome}

Variabile array
Codice:
{array.valore.2.bla} [COLOR="DarkOrange"]// equivale a $array['valore'][2]['bla'][/COLOR]

Loop
Codice:
{loop name="person"}
    Nome: {person.name}
    Età: {person.age}
{/loop}
[COLOR="DarkOrange"]/*
Equivale a:
$array = array(
    array('name' => 'Jacopo', 'age' => '19'),
    array('name' => 'Holly', 'age' => '29'),
); ecc...
*/[/COLOR]

Controllo (if)
Codice:
{if exp="variabile == true"}
    operazione 1
{else}
    operazione 2
{/if}

Ti dò un suggerimento: usa una variabile di classe per aggiungere tutte le variabili dalla funzione set(). Tipo così: classe::set('person', $array);
Lavoraci un pò su...

Comunque sia, se vuoi una classe molto scarna ma che alla fine ho letto ingiro che fa un buon lavoro guarda quì. Su questa però non saprò darti aiuto anche perchè non l'ho mai utilizzata!
 
Grazie per avermi risposto :) non è che magari posso contattarti via MP o altro per avere ulteriori delucidazioni in merito? sono nuovo nel forum xD non saprei nemmeno come fare!
 
Ho iniziato a stendere qualche cosa... ma quando arrivano i loop mi blocco :P non so come mai ma non riesco ad andare avanti... diciamo che mi perdo MI MANCA IL CONCETTO :crying:

vi faccio vedere cio' che fin ora ho scritto (nel poco tempo che ho):
PHP:
class template
{
	
	public	$__file,
			$__tags = array();
			
	
	function __construct($file = null)
	{
		$this->__file ='<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
						<title>{$header.title}</title>
						</head>
						<body>
						<h2>{$header->autor} <font size="2">[{$header-time}]</font></h2>
						<div style="border:dashed 1px #6C6C6C;">{$user.nome}</div>
						<h3>{$foo}</h3>
						</body>
						</html>';
		# da fare : if file exitst...
	}
	
	public function set($nome, $variabile)
	{
		if(is_array($variabile))
		{
			foreach($variabile as $k => $v)
				$this->__tags[$nome][$k] = $v;		
		}
		else if(is_object($variabile))
		{
			$variabile = get_object_vars( $variabile );
			foreach($variabile as $k => $v)
				$this->__tags[$nome][$k] = $v;
		}
		else
			$this->__tags[$nome] = $variabile;
	}
	
	public function display()
	{	
		$this->__file = preg_replace('#\{\$([a-zA-Z0-9\.\-\>_]+)\}#seU', 'self::phrase("\1")', $this->__file);
	}
	
	private function phrase($code)
	{
		$code = preg_split('/\.|\-\>|\-/', $code);
		
		if (count($code) == 1)
			return $this->__tags[$code[0]];
		else
		{
			$temp = $this->__tags[$code[0]];
			for ($i = 1; $i < count($code); $i++)
				$temp = $temp[$code[$i]];
			return $temp;
		}
	}	

}
 

Discussioni simili