[php] template i foreach/if

0

witam, od niedawna zaczalem sie troche bawic klasami w php i wymyslilem ze napisze sobie klasy szablonow w php, problem w tym ze nie mam pomyslu na foreach i if , kod wyglada jak na razie tak;

<?php
class Template
{
	public $tpl;
	public $data;
	
	public function __construct($name)
	{
		$this -> tpl  = implode('', file($name));;
		$this -> data = array();
	}

	public function AddVars($vars = array())
	{
		foreach($vars as $key => $val) $this -> addVar($key, $val);
	}
	
	public function AddVar($var, $value)
	{
		$this -> data[$var] = $value;
	}
	
	public function Execute()
	{
		return preg_replace('/%([^%]+)%/e', '$this -> data["\\1"]', $this -> tpl);
	}

};
?>

chcialem ta klase wzbogacic o podmiane zmiennych z foreach i if , ale potrzebuje jakis wskazowek xD z gory dzieki za pomoc :)

0

Nie:

$this -> tpl  = implode('', file($name));;

Tylko:

$this -> tpl  = file_get_contents($name);
0

dzieki, poprawione :) tylko nadal nie wiem zabardzo jak sie za tego foreach i ifa zabrac :P moze jakies wskazowki / podpowiedzi ? :D

pzdr

0
foreach($this->data as $old => $new) {
   $this->data = str_replace($old, $new, $this->data);
}

Żeby dowiedzieć się jak to zoptymalizować przeczytaj:
http://pl.php.net/str_replace

0

@up jak widac foreach() ma zaimplementowany w metodzie AddVars().
Mu raczej chodzi o to jak zaimplementowac if/foreach w widoku(szablon) w moim fw w klasie widoku mam klase parsujaca szablon tak by moc do niego wsadzic kilka news'ow naraz np bez uzywania skladni php w szablonach.

private function Interpreter()
	{
		foreach($this -> vars as $key => $var)
			if(is_array($var))
			{
				$code = '';
				
				if(preg_match('!%FOREACH:' . substr($key, 1, -1) . '%(.*?)%END%!sei', $this -> code, $out))				
				{
					foreach($var as $no => $data)
					{
						$tpl = new View();
						$tpl -> UseViewFromString($out[1]);
						$tpl -> AddVars($data);
						
						$code .= $tpl -> ShowCode();
					}
					
					unset($tpl);
					
					$this -> code = strtr($this -> code, array($out[0] => $code));
				}
				
				
				unset($this -> vars[$key]);
			}
		
		$this -> code = preg_replace('!%FOREACH:[A-Z_]+%.*%END%!sei', '', $this -> code);
		
		$this -> code = strtr($this -> code, $this -> vars);
		
		if(preg_match_all('!%IF:([A-Z0-9_]+)%(.*?)%ELSE%(.*?)%FI%!sei', $this -> code, $out))
		{
			foreach($out[1] as $no => $var)
			{
				$replaced = ($this -> vars['%' . $var . '%']) ? $out[2][$no] : $out[3][$no];
				
				$tpl = new View();
				$tpl -> UseViewFromString($replaced);
				$tpl -> AddVars($this -> vars);
						
				$this -> code = strtr($this -> code, array($out[0][$no] => $tpl -> showCode()));
			}
		}
		
	}
0

klasie widoku mam klase parsujaca

Chcialem napisac metode.

0

przerobilem kod na cos takiego:

<?php

class TPL
{
	private		$tpl;
	private		$code;
	public		$vars;
	
	# Class constructor
	public function __construct($path = '', $data = array())
	{
		$this -> tpl         = $path;
		if ($path != '')
			$this -> code        = file_get_contents($this -> tpl);
		else
			$this -> code        = '';
		$this -> vars        = '';
		$this -> addVars($data);

	}
	
	public function useTplFromString($code)
	{
		$this -> code = $code;
	}
	
	# Add only one position to replace
	public function addVar($var, $value)
	{
		$this -> vars['%' . strtoupper($var) . '%'] = $value;
	}
	
	
	# Add array variables to replace
	public function addVars($vars = array())
	{
		foreach($vars as $key => $val) $this -> addVar($key, $val);
	}
	
	
	private function interpreter()
	{
		foreach($this -> vars as $key => $var)
			if(is_array($var))
			{
				$code = '';
				
				if(preg_match('!%FOREACH:' . substr($key, 1, -1) . '%(.*?)%END%!sei', $this -> code, $out))				
				{
					foreach($var as $no => $data)
					{
						$tpl = new tpl();
						$tpl -> useTplFromString($out[1]);
						$tpl -> addVars(array_merge($data, array('colorize' => ($no % 2 ? true : false))));
						
						$code .= $tpl -> showCode();
					}
					
					unset($tpl);
					
					$this -> code = strtr($this -> code, array($out[0] => $code));
				}
				
				
				unset($this -> vars[$key]);
			}
		
		$this -> code = preg_replace('!%FOREACH:[A-Z_]+%.*%END%!sei', '', $this -> code);
		
		$this -> code = strtr($this -> code, $this -> vars);
		
		if(preg_match_all('!%IF:([A-Z0-9_]+)%(.*?)%ELSE%(.*?)%FI%!sei', $this -> code, $out))
		{
			foreach($out[1] as $no => $var)
			{
				$replaced = ($this -> vars['%' . $var . '%']) ? $out[2][$no] : $out[3][$no];
				
				$tpl = new tpl();
				$tpl -> useTplFromString($replaced);
				$tpl -> addVars($this -> vars);
						
				$this -> code = strtr($this -> code, array($out[0][$no] => $tpl -> showCode()));
			}
		}
		
		if(preg_match_all('!%([a-z0-9\-_]+)::([a-z0-9\-_]+)%!sei', $this -> code, $out))
			foreach($out[0] as $no => $var)
			{
				if(function_exists($out[1][$no]))
					$this -> code = strtr($this -> code, array($var => $out[1][$no]($this -> vars['%' . $out[2][$no] . '%'])));
				
				else if(function_exists('functions::' . $out[1][$no])) 
					$this -> code = strtr($this -> code, array($var => 'functions::' . $out[1][$no]($this -> vars['%' . $out[2][$no] . '%'])));
					
				else $this -> code = strtr($this -> code, array($var => $this -> vars['%' . $out[2][$no] . '%']));
			}
	}
	
	
	
	
	# Load template file and replace veriables
	private function createCode()
	{
		
		$this -> interpreter();
		$this -> code = preg_replace('!%[A-Z\_:]+%!', '', $this -> code);
		
		//$this -> vars = array();
		return true;
	}
	
	
	# Return resoult code
	public function showCode()
	{
		if(!$this -> createCode()) return false;		
		return $this -> comments ? $this -> comment() : $this -> code;
	}
	
	
	
	# Class destructor
	public function __destruct()
	{
		unset($this -> tpl);
		unset($this -> code);
		unset($this -> vars);
	}
};


?>

tylko nie wiem czemu ani IF ani FOREACH nie dziala ;/

0

"nie działa" nie opisuje problemu...

0

juz w sumie dziala , okazalo sie, ze to inna fukcja powodowala bledy , dzieki za pomoc

0

@Cywek:
Najwidoczniej masz trochę umiejętności programistycznych, ale Twoje podejście do problemu template'ów wydaje się... oryginalne. Wzorowałeś się na jakimś istniejącym systemie lub schemacie, analizowałeś to zagadnienie, czy może ten sposób był pierwszym, jaki przyszedł Ci do głowy?

Nie znam odpowiedzi na te pytania, więc nie będę pisał, że coś jest bez sensu lub nieefektywne -- ja przyglądałem się temu tylko przez parę minut, Ty na pewno dłużej, więc może to moje spostrzeżenia byłyby w tym kontekście nieadekwatne. Napiszę jednak, co mnie... niepokoi, dziwi.

Sam sposób działania metody interpreter(). Prawdę mówiąc, nie do końca za Tobą nadążam. Żeby odpalić foreache iterujesz się najpierw przez wszystkie zadeklarowane w szablonie zmienne ($this->vars)? Zwykle robi się to inaczej. Szukasz foreachów, a gdy jakiegoś znajdziesz, wyłuskujesz z niego nazwę zmiennej i wykonujesz odpowiedni kod.

W ogóle takie szablony robi się przeważnie jako kompilowane. Czyli masz funkcję nie interpret() (raczej tak się powinna nazywać, bo interpreter() sugeruje obiekt), tylko compile($template_source). $template_source to kod zawierający tagi Twojego systemu szablonów. Wewnątrz metody zaś masz zmienną $compiled_php i w niej stopniowo tworzysz kod PHP na podstawie $template_source. Czyli np. "%FOREACH ... % ... %END%" zamieniasz na zwykły kod PHP typu "foreach ($this->var[...] as $k => $v) { ... }".

Wynik działania funkcji compile ewaluujesz. Niekoniecznie chodzi tu o eval. Zwykle robi się tak, że zapisujesz sobie ten wynik do jakiegoś pliku. I potem includujesz ten plik. Jest to o tyle fajne, że pozwala na łatwe cache'owanie. To jest jednak kompilacja (i piszesz kompilator), a nie interpretacja (gdzie piszesz interpreter). Jednak jak już Twój kompilator skompiluje kod szablonów do kodu PHP i zapisze ten kod PHP w pliku, to potem można używać już skompilowanej wersji i nie ma potrzeby ponownej kompilacji. Nawet gdy na stronę przybędzie news, to kod szablonu się przecież nie zmienia (dochodzi tylko wpis do bazy danych) i można użyć jego skompilowanej wersji.

Kolejna sprawa to bardziej kwestia... osobistych preferencji. Moim zdaniem funkcja interpreter() za bardzo Ci się rozrośnie. Widziałem to już milion razy. Metoda na setki linijek, podczas gdy tak naprawdę całe jej bloki są raczej słabo powiązane i sporadycznie wymieniają się zmiennymi lokalnymi. Co lepsi programiści dodają do kodu komentarze: "ten 20-linijkowy blok robi to". Ja jestem zwolennikiem pisania kodu, który nie potrzebuje komentarza. Chwila, chwila -- nie znaczy to, że jestem z tych, co nie chce im się pisać komentarzy, a i tak piszą niezrozumiały kod. Ja robię zwykle tak, że najpierw komentarz piszę, a potem węszę w całym kodzie i patrzę, jakie refaktoryzacje mogę zrobić, by dany komentarz nie był już potrzebny (naturalnie PHPDoc itd. zostawiam!). Często pomaga wydzielenie metody. Po co wprowadzać komentarz do bloku kodu "# compile foreach", skoro można zamiast tego wywołać metodę $this->compileForeach(); ? W tym wypadku trzeba użyć też zmiennej zbierającej wynik kompilacji. Jeśli trzeba by przekazać wiele parametrów, to można zawsze wydzielić nie metodę, a obiekt reprezentujący metodę (tworzymy klasę o nazwie zastępowanej metody, zmienne tymczasowe z zastępowanej metody stają się polami klasy, nowej klasie dajemy metodę execute()).

Oczywiście przy tym wszystkim warto rozumieć jak najwięcej z kodu, który się kompiluje. To po to, by móc wyłapać jak najwięcej błędów. Osobiście jestem nawet zwolennikiem użycia formalnego opisu składni (gramatyki) jako punktu odniesienia do kompilatora, ale w systemach szablonów może to być pewne przestrzelenie, no i różnie to może być z wydajnością.

Polecam zerknięcie sobie do kodu jakiegoś systemu szablonów. Nawet do kodu Smarty, które może jakieś super nie jest, ale daje radę. Kompilator znajduje się w pliku Smarty_Compiler.class.php. Oni tam mają co prawda podzieloną metodę _compile_file(), ale na pierwszy rzut oka jak dla mnie i tak jest zbyt duża, mając jakieś 200 linijek.

0

@up raczej watpie ze kod jest jego a raczej mojego znajomego to raz: http://www.zbt.mtvk.pl/lister/code/template.php.txt.

Dwa pomiedzy interpretowanym a kompilowanym szablonem nie widze zadnej roznicy.
Obydwa mozna cache'owac.
Z kompilowaniem tylko mozna sie nakombinowac.
Zreszta widac uzywasz chyba smarty a ten system to masakra.
WOle miec cos swojego pod moje rozwiazania niz uzywac jakas kobyle ktora na nic mi sie nie zda.

0

@marcio:
W jaki sposób możesz cache'ować interpretowany szablon w tych samych warunkach co kompilowany?

Może czegoś tu nie widzę, ale zcache'ować możesz rzeczywiście każdą stronę, tyle że... statyczną. W sensie: jeśli strona się w jakikolwiek sposób zmieni (np. ktoś napisze posta na forum), to zwykły cache statyczny (taki "HTML-owy") jest już unieważniony, bo wygenerowany kod HTML się zmienił. I wtedy trzeba odpalić szablon, a więc interpreter.

W przypadku szablonów kompilowanych jest nieco inaczej. Jeśli strona się zmieni, to statyczny cache również oczywiście nie zadziała, ale jest tu jeszcze druga warstwa cache'u: kod PHP będący skompilowanym kodem szablonu. Nie trzeba więc tu odpalać interpretera czy kompilatora i parsować szablonu ponownie, wystarczy zaincludować plik PHP ze skompilowanym szablonem. Powinno być to naturalnie znacznie szybsze niż interpretowanie, czy kompilacja.

O czymś zapomniałem? Mogę nie wiedzieć/nie pamiętać o jeszcze innym sposobie cache'owania, który pasowałby równie dobrze do interpretera.

A za Smarty -- szczerze mówiąc -- nie przepadam, choć siłą rzeczy go używałem (kto go nie używał?). Stosowałem różne szablony, w tym XSLT, javowe JSP, czy nawet cuda w stylu PHPTAL. Pisałem też własne systemy szablonów (napisałem też raczej sporo parserów), a i tak w niektórych projektach jako języka szablonów używam... np. PHP. Gdy pisze się zgodnie z pewnymi zasadami i dorobi parę funkcji pomocniczych, nie jest tak źle.

Btw., napisałeś "raczej watpie ze kod jest jego a raczej mojego znajomego"? Hmm? Sugerujesz, że Cywek wkleił nie swój kod?

0

(kto go nie używał?)

Ja ani razu...Zreszta jesli chodzi o szablony to nigdy nie uzywalem gotowych rozwiazan mowiac prawde prawie w ogole nie korzystam z gotowych rozwiazan w PHP no moze procz z kohany kiedys.

Btw., napisałeś "raczej watpie ze kod jest jego a raczej mojego znajomego"? Hmm? Sugerujesz, że Cywek wkleił nie swój kod?

Powiedzmy ze nie sugeruje a mam tylko takie przeczucie.
Kod prawie identyczny sposob dzialania,nazwy pol i metod,komentarze i sam struktura klasy tylko ze uproszczona(chodz link ktory podalem to i tak stara wersja klasy) do tego z tego co zauwazylem to brakuje mu funkcji comment() w klasie do poprawnego dzialania klasy bez niej raz jest Error dwa skrypt nie do konca dziala.
Ja tam nic do niego nie mam ale jak ktos modyfikuje skrypt kogos innego to warto napisac ze kod jest kogos innego tylko podpasowany pod siebie tym bardziej ze nikt go nie zje :).

Co do samego cache'owania i roznicy pomiedzy interpretowanym kodem i kompilowanym w tym przypadku dla mnie wyglada to tak.
W moim FW a dokladnie systemie blogowym ktory opiera sie na moim silniku wszystko dziala za pomoca komponentow,plugi'now,widget'ow i filtrow.
Kazdy widok wyzej wymienionych jest interpretowany poprzez klase View ktora jest podobna do klasy wyzej tylko rozbudowana i kilka rzeczy jest zmienionych.
Po czym wynik(html) zwracamy jest do glownego szablonu.

Jednak jak już Twój kompilator skompiluje kod szablonów do kodu PHP i zapisze ten kod PHP w pliku, to potem można używać już skompilowanej wersji i nie ma potrzeby ponownej kompilacji. Nawet gdy na stronę przybędzie news, to kod szablonu się przecież nie zmienia (dochodzi tylko wpis do bazy danych) i można użyć jego skompilowanej wersji.

Widzisz jak dla mnie mozna cache'owac na 2 sposoby.

1)Cache'owa tylko dane pobrane poprzez model i wsadzac je do pliku jako zeserializowana tablice po czym np w modelu komponentu news przy pobieraniu pierwszej strony news'ow sprawdzac czy istnieje cache jesli tak ponieramy dane za cache w przeciwnym razie pobieramy dane z bazy,robimy cache i tyle.

2)Cache'owac caly komponent czyli statyczne jak i dynamiczne tresci.
Co przez to rozumie.Zamiast cache'owac tylko dane z modelu to cache'owac caly szablon komponentu z godowym kodem html i danymi do niego juz wstawionymi.

Rozwiazanie nr. 2 jest wydajniejsze oprocz pierwszego ladowania lub update cache'u.
W obydwuch sytuacjach cache mozna usunac gdy np dodamy nowy news,edytujemy go lub usuniemy.
Wtedy tworzy sie nowy cache i hula.

Roznica wedlug mnie trwi w tym ze ty uzywasz w widokach czysty php a jak tak jakbym uzywal wlasny jezyk skryptowy jako tako twoje rozwiazanie powinno dzialac szybciej(z powodu kazdej interpretacji kodu zamiast raz skompilowac i tyle) jednak ja tez moge zrobic cache i wyjdzie na to samo ze moj kod tez bedzie kompilowany,
Czyli definicja taka sama a jak widac implementacja zalezy od kodera.

W przypadku szablonów kompilowanych jest nieco inaczej. Jeśli strona się zmieni, to statyczny cache również oczywiście nie zadziała, ale jest tu jeszcze druga warstwa cache'u: kod PHP będący skompilowanym kodem szablonu. Nie trzeba więc tu odpalać interpretera czy kompilatora i parsować szablonu ponownie, wystarczy zaincludować plik PHP ze skompilowanym szablonem. Powinno być to naturalnie znacznie szybsze niż interpretowanie, czy kompilacja.

Chyba jest pozno i nie potrafie zrozumiec jednej rzeczy.
Jesli cos jest statyczne czyli masz np taki kod html(twoj statyczny widok) do ktorego wrzucach dane jest nastepujacy:

<div>
//nasza skladnia php lub "wlasny jezyk skryptowy" za pomoca ktore obsluzymy dane ktore chcemy odebrac
<div>

I zmienisz go na taki bo chcesz uzyc jakiejs klasy z css'a zeby ladnie opakowac dane:

<div class="news">
//nasza skladnia php lub "wlasny jezyk skryptowy" za pomoca ktore obsluzymy dane ktore chcemy odebrac
<div>

To musisz na nowo skompilowac plik zeby wyglad widoku sie zmienil.
Chyba ze tez czegos nie zrozumialem.

Mam nadzieje ze bedziemy kontynuowac dyskusje gdzie bedzie wymiana pogladow a nie wojne lub flame bo dyskusja jest bardzo ciekawa.

0
marcioGuest napisał(a)

Mam nadzieje ze bedziemy kontynuowac dyskusje gdzie bedzie wymiana pogladow a nie wojne lub flame

Co to to nie :D. Ja od flejmów staram się stronić, mam raczej pragmatyczne podejście i nie wiążę się emocjonalnie z żadnym konkretnym rozwiązaniem czy wyjściem. I -- czasami odnoszę wrażenie, że to rzadka przypadłość -- rzadko mówię "A albo B". Czasem nie trzeba się zawsze decydować na A albo na B. Można użyć obu tych rzeczy, albo używać ich w zależności od potrzeb i sytuacji.

margioGuest napisał(a)

1)Cache'owa tylko dane pobrane poprzez model i wsadzac je do pliku jako zeserializowana tablice

No widzisz, o tym np. nie pomyślałem. A jest to istotne, bo tego typu cache potrafi znacznie zmniejszyć liczbę zapytań do bazy danych, które generalnie są czasochłonne.

marioGuest napisał(a)

2)Cache'owac caly komponent czyli statyczne jak i dynamiczne tresci.
Co przez to rozumie.Zamiast cache'owac tylko dane z modelu to cache'owac caly szablon komponentu z godowym kodem html i danymi do niego juz wstawionymi.

Dokładnie to miałem na myśli mówiąc o cache'owaniu statycznym (HTMLowym). Choć może nie użyłem właściwej, fachowej nazwy. Można tak cache'ować kod HTML całych stron, ale również poszczególnych komponentów -- tak, jak wspomniałeś.

marcioGuest napisał(a)

Chyba jest pozno i nie potrafie zrozumiec jednej rzeczy.
Jesli cos jest statyczne czyli masz np taki kod html(twoj statyczny widok) do ktorego wrzucach dane jest nastepujacy (...)

Wytłumaczę na konkretnym przykładzie. Dwa rozwiązania:

  1. Szablon kompilowany.
  2. Szablon interpretowany.
    Studium przypadku: forum internetowe.

Zauważ proszę, że w żadnym z tych przypadków NIE chodzi o to, że developer zmienił treść szablonu (czyli np. dodał klasę do diva). Rozpatruję tu sytuację, gdy developer siedzi sobie na kanapie i ogląda Star Treka, a napisane przez niego forum chodzi sobie samo i po prostu reaguje na akcje użytkowników.

Najpierw to, jak wygląda szablon kompilowany (sorki za składnię w stylu Smarty). Powiedzmy że jest to panel z prywatnymi wiadomościami:

{if $pm_count eq 0}
  <p>Nie masz żadnych prywatnych wiadomości</p>
{else}
  <p>Liczba prywatnych wiadomości: {$pm_count}</p>
{/if}

I to się teraz kompiluje do mniej więcej czegoś takiego:

<?php if ($this->pm_count === 0) { ?>
  <p>Nie masz żadnych prywatnych wiadomości</p>
<?php } else { ?>
  <p>Liczba prywatnych wiadomości: {$pm_count}</p>
<?php } ?>

W przypadku szablonu interpretowanego tego drugiego kodu nie ma (możemy założyć, że składnia samego szablonu pozostaje taka sama). Oczywiście liczba prywatnych wiadomości może pochodzić z bazy danych (lub tablicowego cache'u, o którym wspomniałeś).

Akcja: Ponowne wyświetlenie topicu, w którym nikt nie dopisał posta. Można więc użyć cache'a statycznego (HTML).

  1. Szablon kompilowany: na stronie nic się nie zmieniło. Można użyć zcache'owanego kodu HTML reprezentującego całą stronę. Do szablonu nawet nie trzeba zaglądać.
  2. Szablon interpretowany: tak samo jak powyżej.

Akcja: Pierwsze wyświetlenie topicu, w którym ktoś właśnie dopisał posta. Nie można użyć cache'a statycznego (HTML), bo kod HTML strony (lub raczej: komponentu wyświetlającego posty) się zmienił i trzeba wygenerować go od nowa. Co robią oba typy szablonów, by ponownie wygenerować kod HTML?

  1. Szablon kompilowany: odpala kod PHP będący skompilowaną wersją szablonu. Może to zrobić, bo sam kod szablonu się nie zmienił. Posty wyświetlane są nadal tak samo, tyle że teraz po prostu doszedł nowy post i jakiś tam foreach musi się wykonać raz więcej, by wygenerować HTML dla nowego posta.
  2. Szablon interpretowany: interpretuje bezpośrednio kod szablonu.

W obu przypadkach wynikowy HTML może trafić do statycznego cache'a -- przyda się to później.

Różnica polega na tym, że w przypadku szablonów kompilowanych odpalany jest zwykły skrypt PHP z natywnymi dla PHP pętlami foreach itd. W przypadku szablonu interpretowanego, interpreter przetwarza zaś szablon za pomocą wyrażeń regularnych i innych skomplikowanych i potencjalnie czasochłonnych konstrukcji.

Kompilowanie to jak dla mnie po prostu jeszcze jeden swoisty sposób cache'owania. Jakby: cachuje się wynik pracy interpretera ;). Bo interpreter nie pracuje interaktywnie. To, co my nazywamy interpreterem jest poniekąd i tak kompilatorem, bo kompiluje kod szablonu do kodu HTML. To, co nazywamy tu kompilatorem szablonów zaś kompiluje kod szablonu do kodu PHP, a ten dopiero generuje HTML. Wydaje się, że to dodatkowa pośredniość i złożoność, ale tak naprawdę kompilacja szablon->PHP (czyli jakby interpretacja szablonu) następuje tylko wtedy, gdy developer zmieni szablon, czyli bardzo rzadko. W przypadku interpretera zaś interpretacja szablonu następuje zawsze gdy dany komponent będzie miał wygenerować inny kod HTML, czyli gdy np. w komponencie z newsami dojdzie kolejny news.

edit: Co do tego kto jest autorem kodu nie będę się wypowiadał, bo nie chcę się w to zagłębiać, ale jeśli ktoś podpisał się pod czyimś kodem (który ew. nieco zmienił), to BARDZO nieładnie. Chyba że oryginalny autor kodu na takie zachowanie pozwala.

0

Akcja: Pierwsze wyświetlenie topicu, w którym ktoś właśnie dopisał posta. Nie można użyć cache'a statycznego (HTML), bo kod HTML strony (lub raczej: komponentu wyświetlającego posty) się zmienił i trzeba wygenerować go od nowa. Co robią oba typy szablonów, by ponownie wygenerować kod HTML?

  1. Szablon kompilowany: odpala kod PHP będący skompilowaną wersją szablonu. Może to zrobić, bo sam kod szablonu się nie zmienił. Posty wyświetlane są nadal tak samo, tyle że teraz po prostu doszedł nowy post i jakiś tam foreach musi się wykonać raz więcej, by wygenerować HTML dla nowego posta.
  2. Szablon interpretowany: interpretuje bezpośrednio kod szablonu.

Tu masz racje skompilowany szablon zadziala szybciej w tym przypadku ale mysle ze w przypadku nr 1 czyli gdy ogladamy topic bez nowych postow zadziala szybciej moj kod bo mam czysty HTML gotowy do wyswietlenia a u ciebie szablon z php musi byc zinterpretowany poprzez PHP.

Nie mniej jednak mysle ze sposob cache'u zalezy tez od "obiektu" ktory chcemy zcache'owac.
Ja np takie posty bym cache'owal tylko za pomoca plikow *.txt zamiast pobierac zawsze dane z bazy a szablon interpretowal za kazdym razem poniewaz posty moga byc dodawane np co 2min.
Inaczej maja sie news'y czy arty gdzie nie dodajesz nowego co 5min wtedy mozna cache'owac caly komponent.

0
marcioGuest napisał(a)

Tu masz racje skompilowany szablon zadziala szybciej w tym przypadku ale mysle ze w przypadku nr 1 czyli gdy ogladamy topic bez nowych postow zadziala szybciej moj kod bo mam czysty HTML gotowy do wyswietlenia a u ciebie szablon z php musi byc zinterpretowany poprzez PHP.

Tak, na pewno statyczny cache HTML kodu całej strony (kodu pojedynczego komponentu) zadziała szybciej niż wykonanie kodu PHP generującego taki HTML całej strony (kodu komponentu). Tyle że dla mnie to nie jest tak, że proponowany przez Ciebie sprytny cache HTML na poziomie komponentów można zastosować tylko do szablonów interpretowanych, a nie można do kompilowanych. Przeciwnie -- ja myślę o tym, by włączyć ten komponentowy cache HTML, który masz w swoim frameworku, do kompilowanego systemu szablonów. Nic przecież nie stoi na przeszkodzie.

marcioGuest napisał(a)

Nie mniej jednak mysle ze sposob cache'u zalezy tez od "obiektu" ktory chcemy zcache'owac. (...) posty moga byc dodawane np co 2min.

No właśnie, przyznam się że chwilę się zastanowiłem przed wybraniem tego przykładu z forum. Forum jest często edytowane. Ludzie piszą, a potem nawet parokrotnie edytują posty. W przypadku bloga BEZ komentarzy, gdzie wpisy pojawiają się raz na tydzień, bardzo możliwe że proste cache'owanie HTML na poziomie całej strony w zupełności by wystarczyło.

Forum to akurat dość trudny przykład. Moim zdaniem dobrze się sprawdza w nim cache'owanie na poziomie komponentów, bo ludzie nie tylko często dodają posty, ale i odświeżają tematy. Tyle że każdy widzi coś nieco innego, tj. inne tematy widzi jako nieprzeczytane, a gdzieś tam w rogu ma swój nick, liczbę nieprzeczytanych PW i tak dalej. Tego się zcache'ować praktycznie nie da, ale komponenty, które są widziane tak samo przez wielu użytkowników -- już tak. Na takim rzadko modyfikowanym blogu, jeszcze bez możliwości logowania, wystarczy cache'owanie całych stron, bo każdy widzi taki sam HTML.

1 użytkowników online, w tym zalogowanych: 0, gości: 1