![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Jest jedna rzecz, z którą jakoś nie mogę dać sobie rady. Wbrew pozorom problem nie jest taki znów banalny. Chodzi o to, jak w ładny sposób rozwiązać kwestię kilku widoków na stronie, tzn: nagłówek, menu, treść, reklama, stopka. Do tej pory robiłem to w następujący sposób: Szablon article.php jest wywoływany przez główną akcję. W includowanych plikach istnieje możliwość wywołania klasy typu helper, które wyciągają dane z bazy i robią wszystkie assigny. Do tej pory ten sposób mi odpowiadał, jednak teraz chcę, by można było cachować poszczególne części strony. Nie mówię tu o serializacji obiektów, czy tablic, ale o cachowaniu gotowego htmla. Powiedzmy, że mam jedną akcję wywoływaną w urlu i stronę, która składa się z: nagłówka, menu, treści artykułu, listy najnowszych tematów na forum oraz ze stopki. Przy czym, menu i treść artykułu są cachowane. Reszta nie. Jak to ładnie rozwiązać? Zapraszam szanowne grono do dyskusji (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() |
![]()
Post
#2
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Ja robię tak.
Określam requesty, które są dopasowywane do URLa. W requeście może siedzieć kilka akcji. Po wywołaniu wszystkich akcji, wynik ich jest przekazywany do widoku i zależnie od widoku i jego parametrów jest to wszystko wyświetlane. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Można bardziej szczegółowo?
Z przykładami (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#4
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Fragment konfiga
To umieszczam na ostatnim miejscu, a więc jeśli nie zostanie dopasowany do innych, to jest uruchamiany ten. A w nim znajdują się 2 akcję: Test i Dupa. Widokiem jest smarty - wszystkie widoki to pluginy - i zostaje uruchomiony z parametrem template równym index.tpl. Sam plugin jest konfigurowany przy 1. próbie dostępu do niego. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Hm... sam nie wiem. Pomyślę jeszcze nad tym.
A może zna ktoś lżejszy sposób? |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Wyskrobałem coś takiego:
Można to teraz łatwo do konfiguracji wywalić. Niby działa ładnie, ale jest jedna wada. Jako, że szablony są inicjalizowane lokalnie nie ma możliwości, żeby np. z widoku ShowArticle assignować zmienną dla ShowHeader(), czyli ustawić tytuł, słowa kluczowe etc. Muszę jeszcze trochę nad tym posiedziec :/ |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
W szablonie głównym dodawaj pozostałe szablony (np. menu) poprzez rozszerzoną metodę Include() która będzie potrafiła sprawdzić czy istnieje Cache (w formie czystego HTMLa wygenrowanego wcześniej) dla danego szablonu.
Jeżeli istnieje to go zwróci w czystej formie, a jeżeli nie to przystąp do generowania szablonu tak jak to robisz teraz. I dopiero w menu.tpl użyj odpowiednich ViewHelperów wykonujących odpowiednie zapytania do DAO i wykonujących wymagane Assigny(). Potem zwracasz HTML, a ww metoda Include() zapisuje go do Cache oraz zwraca do głównego szablonu. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
@chmolu - fajowski pomysł z kompozytowym widokiem (IMG:http://forum.php.pl/style_emoticons/default/cool.gif)
A może by tak dodać assign'y do całościowego widoku. Najpierw przetworzyc akcję, dodać w niej assigny a potem wypluć całość :?: |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat W szablonie głównym dodawaj pozostałe szablony (np. menu) poprzez rozszerzoną metodę Include() która będzie potrafiła sprawdzić czy istnieje Cache (w formie czystego HTMLa wygenrowanego wcześniej) dla danego szablonu. Jeżeli istnieje to go zwróci w czystej formie, a jeżeli nie to przystąp do generowania szablonu tak jak to robisz teraz. I dopiero w menu.tpl użyj odpowiednich ViewHelperów wykonujących odpowiednie zapytania do DAO i wykonujących wymagane Assigny(). Potem zwracasz HTML, a ww metoda Include() zapisuje go do Cache oraz zwraca do głównego szablonu. Myślałem trochę nad tym. No dobrze, mogę zrobić $this->include() i to sprawdzi mi, czy jest cache. Powiedzmy, że wywołuję szablon show_article.tpl.php. Wewnątrz includuję header.tpl.php. Metoda $this->include sprawdza, czy header posiada cache. Jeśli posiada, to zostaje wczytany. Ale... co jeśli w pliku header.tpl.php jest dołączany jeszcze menu.tpl.php?? Taka metoda nie nadaje się do większej hierarchii widoków. Naprawdę już nikt nie ma pomysłu, jak to zrealizować?? |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Pomysł mam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Tylko zapomniałem o nim tu napisać. Takie coś można by uzyskać tworząc system buforów wyjściowych. Można by napisać jakiś mini manager buforów który będzie je trzymał razem w kupie. Każdy widok który ma zostać obrobiony miałby swój bufor - można to zrobić przez dziedziczenie. Bufory dzięki managerowi moglby się komunikować lub podczas jakieś wstępnej pętli bo buforach w managerze dodać 'swoje' możliwe globalne assigny. I potem dopiero render. Tak ja to widze.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Moglbys rozwinąć tę myśl? Wygląda ciekawie. Jakiś pseudokod by się przydał :]
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Spróbuje coś jutro skodzić. Sam walcze z buforami w swoim systemie. Z tym że u mnie nie będzie managera buforów bo bufory będą w strkturze drezwiastej (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Jutro zedytuje posta i postram się coś napisać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Spróbujmy jeszcze bardziej skomplikować sytuację :]
Powiedzmy, że strona składa się z następujących części/bloków: - nagłówek, - menu, - reklama, - treść artykułu, - komentarze, - stopka Nagłówek jest statyczny, menu jest cachowane. Reklama nie jest. Treść artykułu jest pobierana z bazy danych w postaci XML'a (DocBook, OpenOffice), przekształcana za pomocą XSL do HTMLa i cachowana. Komentarze też są cachowane, dopóki nie dojdą nowe wpisy. Stopka jest statyczna. Oj, czarno to widzę (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
Z palca pisane - sama idea. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
chmolu: Wydaje mi się że powoli zaczynasz przesadzać i pisać nad wyrost... Najpierw zastanowił bym się czy kiedykolwiek przyda ci sie az taki system cache... i czy w ogole on ma sens.
Ja rozumiem... optymalizacja itd... Ale jak dla mnie lepiej skupic sie nad zapytaniami sql i samym kodem, zoptymalizowac go... niz sleczyc 3 miesiace nad pisaniem krowy do cache... ktorej nigdy nie wykorzystasz :] Ja wiem ze cache to modne teraz slowo... ale bez przesady chlopaki :/ |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) ![]() ![]() |
@vee - to jest przepis na multiwidok wg. mnie a nie na cache jak coś (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
pisalem juz wiele rzeczy, i zwykly glowny TPL z includem headera/footera ew. innych rzeczy zawsze mi starczal. Dodanie do tego Cache poszczegolnych includowanych elementow tez wg mnie nie jest trudne...
No a jak chcesz miec Cache Headera ale bez miejsca gdzie sa bannery... no coz :/ Wywal bannery albo tak rozdziel pliki TPL, by pozbyc sie problemu. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat chmolu: Wydaje mi się że powoli zaczynasz przesadzać Nie wiem dlaczego, ale zawsze lubię sobie życie kompilować. Zanim napisałeś tego posta uświadomiłem sobie, że rzeczywiście przeginam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Postanowiłem, że będę cachował tylko częściowo dane. Nie będę mordował się z tym co tutaj omawiamy, bo raczej już nic sensownego nie wymyślę. |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
"życie kompilować" hmm google ani wiki nie wyjaśniły mi tego pojęcia, wiec może ty to zrób (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) ![]() ![]() |
A co do multiwidoków, to czy najlepszym wyjściem nie będzie Composite View?
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 23:45 |