ugrás a tartalomhoz

Php Templatező készítése

inf3rno · 2008. Aug. 16. (Szo), 00.12
Sziasztok!

Egy egyszerű templatezőt szeretnék csinálni az oldalamhoz phpban, nem szeretnék semmi extrát, mint SMarty, vagy ilyenek, csak nagyon alap dolgokat:
foreach, if-else, esetleg switch, de az már extra..
Az egész úgy indult, hogy eredetileg mysqlhez írtam egy sql statement templatezőt, aztán kicsit belegondoltam, hogy jobban járok, ha csinálok egy sima templatezőt, és abból extendelem ki a db_statement objectemet. Ezért bindParams, compile, meg ilyeneket a függvények nevei. Ami most megvan az így néz ki:

class Template
{
	protected $pattern="{\$([\w_]+)}";
	public function __construct($template,$pattern=null)
	{
		$this->template=$template;
		$this->params=array();
		$this->cache=null;
		if ($pattern)
		{
			$this->pattern=$pattern;
		}
	}
	
	public function bindParam($key,$value)
	{
		$this->params[$key]=$value;
		$this->cache=null;
		return $this;
	}
	
	public function bindParams($source)
	{
		foreach($source as $key => $value)
		{
			$this->bindParam($key,$value);
		}
		return $this;
	}

	protected function replace_template($key)
	{
		return $this->params[$key];
	}
	
	public function compile()
	{
		if (!is_string($this->cache))
		{
			$this->cache=preg_replace("/".$this->pattern."/e",'$this->replace_template(\1)',$this->template);
		}
		return $this->cache;
	}
	
}
Ezt szeretném kicsit továbbfejleszteni, hogy egy foreach kezelést is el tudjon végezni.

A problémám abban van, hogy ez a mostani rész a compile-ban a replace_template metódust hívja meg minden egyes elemrem, és ez nekem azért hasznos, mert így nem kell kiescapelnem a külső forrásból jövő adatokból azokat a részeket, amik ugyanolyanok, mint ami a változókat kéri le. Például ha valaki {$pista} változót egy olyan stringre állítja, hogy "{$zsuzsi}", akkor azt nyilván escapelni kell abban az esetben, ha a feldolgozó kód többször is áthaladhat afölött a rész fölött.
Ez olyan esetben fordulhat elő, mint például a foreach, amikor a cikluson belüli rész többször lefut, ilyenkor nyilván célszerű kesselni azokat az értékeket, amelyek változatlanok maradtak.

Nekem azzal van a problémám, hogy ezt a kesselést ennek a programszerkezetnek a megtartásával hogyan lehet elérni? Ha sehogy sem, akkor azzal kapcsolatban szeretnék választ kapni, hogy hogyan kell módosítanom mindehhez a program szerkezetét?

Üdv. Laci
 
1

Feldolgozással kapcsolatosan

inf3rno · 2008. Aug. 16. (Szo), 00.48
Gondolkodtam kicsit a blokkok feldolgozásával kapcsolatban.
Arra jutottam, hogy ennek a szerkezetnek a megtartásával úgy lehet megoldani a dolgot, ha blokkonként több classre szedem szét a templatet, és a változók közé automatikusan felveszem a blokkokat.

Szóval mondjuk a legegyszerűbb példa:
"{$user->name} tulajdonságai:
{foreach($user->properties as $property => $value)}
{$property}: {$value}
{/foreach}"
Először kiszűröm regexel a blokko(ka)t, és létrehozok blokkonként egy azonosítót, ezután valahogy így fog kinézni a dolog:
"{$user->name} tulajdonságai:{$blocks->1}"
A blokkban pedig:
"{$property}: {$value}"
A blokk nyilván egy új object lenne. Az eredeti objectet ki kéne egészíteni egy komolyabb cache kezeléssel annyiban, hogy változónként meg lehessen adni, a frissítés gyakoriságát. Szóval, hogy konstansról, vagy rendes változóról van e szó. Esetleg lehetne két különböző jelölésformát alkalmazni, hogy ne kelljen ezzel sokat bajlódni.
"{#user->name} tulajdonságai:
{foreach(#user->properties as $property => $value)}
{$property}: {$value}
{/foreach}"
Nézzük a blokkot:
"{$property}: {$value}"
Az object létrehozását valahogy így képzelem el:

$this->create_block($block_arguments,$block_template);
ahol a $block_arguments:

array("foreach","#user->properties","$property","$value");
a $block_template pedig:
"{$property}: {$value}"
Itt egy újabb kérdés merül fel, a blokkon belül saját környezet legyen e, vagy maradjon meg az eredeti template környezete (értsd változói). Na ezen még gondolkodok :D
2

PHP

Joó Ádám · 2008. Szep. 6. (Szo), 20.43
Fontold meg a PHP használatát inkább. Minek írni egy programozási nyelvet PHP-ban, amikor maga is az? Ráadásul kiváló sablonozásra:

<?php if (!empty($array)): ?>
    <ul>
        <?php foreach ($array as $item): ?>
            <li><?php echo $item ?></li>
        <?php endforeach ?>
    </ul>
<?php else: ?>
    <p>Nincs megjeleníthető elem.</p>
<?php endif ?>
3

mi lenne ezzel a célod?

Hodicska Gergely · 2008. Szep. 8. (H), 01.57
Elég sok féle template kezelő létezik már, nem biztos, hogy megéri sajátot írni. Illetve manapság általában egyre inkább az a tendencia, hogy a template sima PHP fájl, kár még egy külön réteget bevonni, hacsak nincs valami nagyon komoly indok erre.


Üdv,
Felhő
4

Igaz

inf3rno · 2008. Nov. 1. (Szo), 10.27
Igen, igazad van, csináltam egy sajátot nem ezen az alapon, amit írtam, hanem kicsit komolyabban átgondoltan, és a végére hasonló lett a motorja, mint a Smartynak, szóval tényleg jobban megérte volna, ha fogom azt felrakom a Smartyt, és spórolok egy-két hónapot.