Autor wpisu: Diabl0, dodany: 15.11.2008 23:19, tagi: php
Dzisiaj odgrzewany kotlet, ale nadal wiele osób korzysta z Smarty i może im się to przydać.
Wiele osób korzystających z Smarty’ego używa go tylko jako systemu szablonów do separacji kodu PHP od HTML. Dużo mniej osób zdaje sobie natomiast sprawę z jego rozbudowanego mechanizmu cache i potencjału jaki w nim drzemie.
Zapewne dla wielu osób jednym z większych braków Smarty’ego jest możliwość określenia czasu trzymania cache (cache_lifetime) dla poszczególnych plików szablonów. Normalne włączenie cache i ustawienie jakiegoś cache_lifetime sprawia że strona traci swoją dynamiczność a przy bardziej rozbudowanych projektach potrafią się dziać „cuda” gdy na przykład po zalogowaniu wciąż pokazuje nam się formularz logowania zamiast profil użytkownika. Poniżej postaram się przedstawić swój pomysł na ominięcie tego efektu, a przy okazji często znaczne przyśpieszenie działania całego serwisu i ograniczenie ilości przetwarzanych danych.
Pomysł
Pracując nad jedym z projektów głównym celem było zminimalizowanie ilości zapytań do bazy danych. Pierwszym pomysłem było pobieranie danych z bazy i trzymanie ich w PEAR::Cache do ponownego wykorzystania. Jednakże przeglądając różne fora w poszukiwaniu innych pomysłów na optymalizację zwróciłem uwagę na wbudowany w Smarty’ego mechanizm cache i zastanowiło mnie czy nie dało by się go przerobić tak aby pasował do potrzeb obecnego projektu… Przeglądając dokumentację odnośnie cache zarysował mi się pewien pomysł który postanowiłem przetestować.
Z grubsza polega on na zbudowaniu szablonu na zasadzie modułów. W PHP wykonywane są podstawowe operacje w rodzaju rozpoznania akcji, pobrania danych użytkownika i wywołania odpowiedniego szablonu. Natomiast szablony zostały podzielone na „moduły” odpowiedzialne za wyświetlenie niewielkich fragmentów serwisu w rodzaju listy kategorii czy listy ostatnich tematów na forum.
Działanie
W typowym rozwiązaniu lista tematów czy kategorii została by na początku pobrana z bazy danych i w formie tablicy przekazana do szablonu. W moim rozwiązaniu nie pobieram tych danych tylko od razu wywołuję główny szablon. Tam natomiast znajdują się tagi {insert} Smarty’ego realizujące za mnie brudną robotę. W zamierzeniu twórców powinny służyć one do wstawiania treści która nie jest cacheowana (funkcja wykonuje się nawet w szablonie który jest w cache). Ja postanowiłem wykorzystać to do przeciwnego celu – wstawiania cacheowanego szablonu do szablonu który nie jest cacheowany. Aby lepiej to zrozumieć proszę przyjrzeć się poniższym kawałkom kodu:
strona.tpl (nie jest cacheowana)
<HTML> <HEAD> </HEAD> <BODY> {$smarty.now|date_format} <HR> {insert file=’tematy_forum’} </BODY> </HTML>
tematy_forum.tpl (ma być cacheowany)
<TABLE> <TBODY> {foreach from=$forum_latest_topics item=topic} <TR> <TD>{$topic.title|truncate:30}</TD> </TR> {/foreach} <TR><TD>{$smarty.now|date_format}</TD></TR> </TBODY> </TABLE>
I najważniejszy plik insert.tematy_forum.php który powinien zostać utworzony w katalogu funkcji Smarty’ego