Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> multiwidoki, sprawa czysto filozoficzna ;)
chmolu
post
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:

  1. // plik header.php
  2. <?php $this->executeHelper('MenuViewHelper'); ?>
  3. <head><title><?php echo $title ?></title></head>
  4.  
  5. ---------------------
  6.  
  7. //plik article.php
  8. inlude('header.php');
  9.  
  10. tutaj jakas tresc
  11.  
  12. include('footer.php');


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)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
chmolu
post
Post #2





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 8.10.2004

Ostrzeżenie: (0%)
-----


Wyskrobałem coś takiego:

  1. <?php
  2.  
  3. interface IView {
  4. public function render();
  5. }
  6.  
  7. abstract class CachedView implements IView {
  8. // oczywiscie to wszystko powinno byc zaimplementowane;)
  9. protected function isCached() {}
  10. protected function loadCache() {}
  11. protected function clearCache() {}
  12. }
  13.  
  14. /** 
  15.  * Prosty system szablonow w postaci skryptow php
  16.  *
  17.  */
  18. abstract class PHPView extends CachedView {
  19. private $vars = array();
  20.  
  21. protected function assign($var, $value = false) {
  22. if (is_array($var)) {
  23. $this->vars = array_merge($this->vars, $var);
  24. } else {
  25. $this->vars[$var] = $value;
  26. }
  27. }
  28.  
  29. protected function fetch($_tpl_file) {
  30. if (!is_readable($_tpl_file)) {
  31. throw new TemplateException('TPL file ' . $_tpl_file .' does not exists');
  32. }
  33.  
  34. extract($this->vars, EXTR_PREFIX_SAME, '_');
  35. include($_tpl_file);
  36. }
  37. }
  38.  
  39. class CompositeView implements IView {
  40. private $components = array();
  41.  
  42. public function addView(IView $view) {
  43. $this->components[] = $view;
  44. }
  45.  
  46. public function render() {
  47. foreach ($this->components as $view) {
  48. $view->render();
  49. }
  50. }
  51. }
  52.  
  53. class ShowArticle extends PHPView {
  54. public function render() {
  55. $this->assign('content', $art->loadArticle());
  56.  
  57. return $this->fetch('show_article.php');
  58. }
  59. }
  60.  
  61.  
  62. $composite = new CompositeView();
  63. $composite->add(new ShowHeader());
  64. $composite->add(new ShowMenu());
  65. $composite->add(new ShowArticle());
  66. $composite->add(new ShowFooter());
  67.  
  68. ?>

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 :/
Go to the top of the page
+Quote Post

Posty w temacie
- chmolu   multiwidoki   4.08.2005, 15:05:18
- - bela_666   Ja robię tak. Określam requesty, które są dopasowy...   4.08.2005, 16:11:03
- - chmolu   Można bardziej szczegółowo? Z przykładami   4.08.2005, 16:23:42
- - bela_666   Fragment konfiga [XML] pobierz, plaintext <requ...   4.08.2005, 16:37:33
- - chmolu   Hm... sam nie wiem. Pomyślę jeszcze nad tym. A mo...   4.08.2005, 16:52:42
- - chmolu   Wyskrobałem coś takiego: [PHP] pobierz, plaintext...   4.08.2005, 21:04:02
- - Vengeance   W szablonie głównym dodawaj pozostałe szablony (np...   4.08.2005, 21:48:54
- - NuLL   @chmolu - fajowski pomysł z kompozytowym widokiem ...   4.08.2005, 22:24:56
- - chmolu   CytatW szablonie głównym dodawaj pozostałe szablon...   6.08.2005, 17:08:54
- - NuLL   Pomysł mam Tylko zapomniałem o nim tu napisać. Ta...   6.08.2005, 17:28:20
- - chmolu   Moglbys rozwinąć tę myśl? Wygląda ciekawie. Jakiś...   6.08.2005, 17:41:07
- - NuLL   Spróbuje coś jutro skodzić. Sam walcze z buforami ...   6.08.2005, 17:48:16
- - chmolu   Spróbujmy jeszcze bardziej skomplikować sytuację :...   6.08.2005, 18:06:15
- - NuLL   [PHP] pobierz, plaintext <?php $buffer=new...   6.08.2005, 18:11:14
- - Vengeance   chmolu: Wydaje mi się że powoli zaczynasz przesadz...   6.08.2005, 20:06:00
- - NuLL   @vee - to jest przepis na multiwidok wg. mnie a ni...   6.08.2005, 20:10:49
- - Vengeance   pisalem juz wiele rzeczy, i zwykly glowny TPL z in...   6.08.2005, 20:21:26
- - chmolu   Cytatchmolu: Wydaje mi się że powoli zaczynasz prz...   6.08.2005, 20:41:25
- - Vengeance   "życie kompilować" hmm google ani wiki n...   6.08.2005, 23:20:10
- - matid   A co do multiwidoków, to czy najlepszym wyjściem n...   6.08.2005, 23:29:06
- - chmolu   Cytat"życie kompilować" hmm google ani w...   7.08.2005, 00:12:38
- - chmolu   CytatSprawdzone rozwiązanie stosowane w Smalltalku...   7.08.2005, 11:54:11
- - emilio   A to Composite View ?   7.08.2005, 13:23:16
- - chmolu   A masz jakąś propozycję, jak to sensownie przenieś...   7.08.2005, 13:31:01
- - emilio   To jest implementacja wzorca Composite (skorzystał...   7.08.2005, 14:57:11
- - chmolu   Hmm.. ciekawe, jakby to się sprawdziło w praktyce....   7.08.2005, 16:21:50


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 4.10.2025 - 08:35