Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]_autoload i klasa szablonu, łączenie
--Woody--
post
Post #1





Goście







Witam,
Szukałem na forum, ale jakoś nie umiem wykorzystać tego co znalazłem. Więc do rzeczy. Mam sobie klase szablonu template.php - standard. Wywołuje ja w indeksie łącząc z plikiem szablonu html i css. Wszystko ładnie działa, jednak w katalogu class koło klasy template mam jeszcze kilka klass, które wykorzystuje dołączając je żmudnie ręcznie. Chciałem sobie to zautomatyzować próbując wykorzystać __autoload i dopisując go do klasy template. Jednak za nic nie chce ze mną to współpracować. Oczywiście manual na temat __autoload przeczytałem i nic mi to nie dało, przykład z manuala działa ale już próba połączenia z moim template niestety nie. Może mi ktoś pomóc i łopatologicznie wytłumaczyć jak to ogarnąć lub podsunąć jakiś przykład, naprowadzić na dobrą drogę - cokolwiek.

Pozdrawiam
Woody
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
by_ikar
post
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Nie mam powodu dlaczego miałbym nie pokazać swojego kodu na forum - nie wstydzę się go (IMG:style_emoticons/default/tongue.gif) nie mniej, sama klasa templatek to nie wszystko, bo to jest tylko w sumie parser i domyślnie nie pobiera z jakiegoś cache przetworzonego szablonu. Podzielić na dwie klasy musiałem, żeby pierwsza klasa działała w sumie bez niczego, ponieważ wykorzystuje ją jeszcze do rendrowania szablonów stron błędów, a tak jako tako błędów być nie może, spowodowanych np przez system cache. Ale posiada ona swoje podstawowe funkcjonalności a wygląda ona tak: https://gist.github.com/1471387 jedyne co byś musiał w niej zmienić, to 35 linijkę:

  1. 'template_dir' => array(Config::get('path.app').DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR, Config::get('path.common').DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR)


zamiast tej tablicy ścieżek, bo można podać ich kilka, ze względu takiego że u siebie wykorzystuje coś w rodzaju aplikacji, gdzie jest domyślna aplikacja "common", która też służy jako aplikacja do współdzielenia (szablonów/tłumaczeń/modułów/komponentów/modeli) między innymi aplikacjami. Wymyśliłem sobie coś takiego, ponieważ w kilku miejscach zdarzało mi się wykorzystywać mojego fw, do kilku różnych aplikacji, więc żeby utrzymać jakoś w miarę rozsądnie ten kod, zrobiłem podział na aplikacje - raczej nic odkrywczego. Więc tą linijkę 35, możesz zmienić na taką linijkę:

  1. 'template_dir' => '/path/to/templates/'


Pamiętając o umieszczeniu slasha na końcu podanej ściezki. Możesz podać tablicę ścieżek. Z racji tego że jest to tylko parser, nie ma takich bajerów jak includowanie innych templatek, czy includowanie całego komponentu (coś w rodzaju akcji w module, może to być np jakiś system komentarzy etc). Jak tego używać? Już pokazuje:

  1. <?php
  2.  
  3. $template = new TemplateParser(); // tworzymy obiekt, możemy do konstruktora przekazać ustawienia
  4.  
  5. $template->add(array(
  6. 'title' => 'Tytuł mojej nowej strony!',
  7. 'content' => 'Lore ipsum'
  8. )); // podajesz tablicę asocjacyjną parametrów, gdzie kluczem jest nazwa zmiennej w szablonie
  9.  
  10. $wynik = $template->render('index'); //nazwa szablonu, bez rozszerzenia (domyślne rozszerzenie .tpl)
  11.  
  12. // do zmiennej $wynik został przekazany przetworzony szablon. Możemy ten szablon wyświetlić teraz:
  13.  
  14. echo $wynik;
  15.  
  16. // możemy go też przekazać dalej, lub wyświetlić dalej, w sumie gdzie chcemy.
  17. // U mnie przetworzony szablon jest przekazywany do klasy response, która przesyła go do przeglądarki wraz z nagłówkami.
  18.  


Tak wygląda kod php, a tak wygląda szablon:

  1. <!DOCTYPE html>
  2. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  3. <title>{@$title}</title>
  4. {ignore}
  5. body { margin: 0; padding: 0; text-align: center; background: #F2F2F2; font-family: Arial; font-size: 13px; line-height: 1.6; color: #444; }
  6. {/ignore}
  7. </style>
  8. </head>
  9.  
  10. {@$content}
  11.  
  12. </body>
  13. </html>


Przetworzony szablon wygląda tak:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  5. <title><?php echo $title ?></title>
  6. <style>
  7. body { margin: 0; padding: 0; text-align: center; background: #F2F2F2; font-family: Arial; font-size: 13px; line-height: 1.6; color: #444; }
  8. </style>
  9. </head>
  10. <body>
  11.  
  12. <?php echo $content ?>
  13.  
  14. </body>
  15. </html>


Pojedyncza małpa (@) w klamrach oznacza echo, ale można też normalnie używać echo i w sumie jakiejkolwiek składni php chcemy. Jedynie pamiętając, że jak będziemy w klamrze chcieli wykorzystać małpę, to musimy "escapować" małpę, małpą. Czyli postawić dwie mały, a wyjdzie nam jedna. Korzystanie z bloków kodu (pętle, warunki) jest takie samo jak w php, z tym że lepiej korzystać z alternatywnego zapisu tych bloków:

  1. <!DOCTYPE html>
  2. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  3. <title>{@$title}</title>
  4. {ignore}
  5. body { margin: 0; padding: 0; text-align: center; background: #F2F2F2; font-family: Arial; font-size: 13px; line-height: 1.6; color: #444; }
  6. {/ignore}
  7. </style>
  8. </head>
  9. {if(!empty($content)):}
  10. {@$content}
  11. {endif}
  12. </body>
  13. </html>


O alternatywnym zapisie można poczytać w dokumentacji php, a na szybko wygląda to tak:

  1. <?php
  2.  
  3. // warunek
  4. if($warunek):
  5. // ...
  6. endif;
  7.  
  8. if($warunek):
  9. // ...
  10. elseif($warunek2):
  11. // ...
  12. endif;
  13.  
  14. // blok switch
  15. switch($zmienna):
  16. case 1:
  17. // ...
  18. break;
  19.  
  20. case 2:
  21. // ...
  22. break;
  23.  
  24. default:
  25. // ...
  26. break;
  27. endswitch;
  28.  
  29. // pętla for
  30. for($i = 0; $i < 10; $i++):
  31. // ...
  32. endfor;
  33.  
  34. // pętla foreach
  35. foreach($array as $row):
  36. // ...
  37. endforeach;
  38.  
  39. // pętla while
  40. while($warunek):
  41. // ...
  42. endwhile;


Klamry prawdę mówiąc nie są niczym innym jak tagami php: <?php ({) oraz ?> (}). Ale żeby przypadkiem nam tych klamer nie podmieniło w miejscu w którym nie chcemy, a może to być css, javascript, lub nawet sam html. Wówczas taki kawałek kodu który zawiera klamry, łapiemy blokiem ignore:

  1. <!DOCTYPE html>
  2. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  3. <title>{@$title}</title>
  4. {ignore}
  5. body { margin: 0; padding: 0; text-align: center; background: #F2F2F2; font-family: Arial; font-size: 13px; line-height: 1.6; color: #444; }
  6. /* ten kod css zostanie pominięty, a w przetworzonym szablonie nie będzie bloku ignore */
  7. {/ignore}
  8. </style>
  9. </head>
  10.  
  11. {@$content}
  12.  
  13. </body>
  14. </html>


Odnośnie samej klasy szablonu - nie jest to szczyt, pewnie są lepsze, pewnie kale w oczy wredny eval, no ale inaczej nie wiedziałem jak to rozwiązać. Eval jest używany tylko wtedy kiedy nie można sobie za bardzo pozwolić na uruchomienie cache i skorzystanie z cache. W przypadku kiedy cache działa - czyli kiedy aplikacja działa prawidłowo, można napisać właściwą klasę szablonu, która nadpiszę metodę rendrer klasy TemplateParser, dodają dodatkowe funkcje (includowanie innych szablonów, lub includowanie komponentów), a wyglądać to może tak: https://gist.github.com/1471520 w ten sposób zyskujemy możliwość includowania komponentów i szablonów, oraz nasze szablony są już przetrzymywane w cache, dzięki czemu nie korzystamy z evala, a nasze szablony działają dużo szybciej, ponieważ cache szablonów, to zwykły kod php, czyli największym narzutem będzie includowanie tego szablonu. Użycie dodatkowych opcji:



  1. {include_component('layout::header')}
  2.  
  3. <div id="logowanie">
  4. <form method="post" action="{@BASE_URL}/login" name="logowanie">
  5. <label for="id_login">Login</label><br>
  6. <input type="text" id="id_login" name="login"><br>
  7. <label for="id_password">Hasło</label><br>
  8. <input type="password" id="id_password" name="password"><br>
  9. <button type="submit">Zaloguj</button>
  10. </form>
  11. </div>
  12.  
  13. {include('footer')}


komponentem może być nasz cały skomplikowany top strony, możemy przekazać do niego jakieś parametry etc. W stopce możemy mieć tylko zwykły kod html, więc wystarczy że zaincludujemy szablon.

Niektóre rozwiązania podpatrzone w symfony (metoda evaluate, z nieszczęsnym evalem ;p). Jak się komuś podoba - korzystać, nie zapominając napisać do tego klasy która będzie dziedziczyła klasę parsera i nadpisywała metodę render, która nie tylko nie potrzebnie przetworzy nam szablon w evalu, ale również w przypadku kiedy stosujemy cache, to metoda ta, sama sprawdzi czy szablon który chcemy przetworzyć, czy istnieje. W przypadku kiedy mamy w miarę przyzwoity system cache, w którym możemy podać sobie "zależność" od innego pliku, wówczas ta dodatkowa funkcjonalność parsera będzie zbędnym narzutem wydajnościowym (nie wielkim, ale grosz do grosza i będzie kokosza). Stosować możecie klasę gdzie chcecie, zmieniając ją jak chcecie, jedynie zostawiając info o autorze. Ewentualnie jak ktoś będzie chciał może zarzucić jakąś krytyką.

@watas odnośnie jakichś materiałów do czytania, w sumie obiektówki nie uczyłem się jakoś specjalnie z książek, znaczy podstawy tam przeczytałem, ale nie wiele tam na temat obiektywności tak na prawdę było. Resztę doczytałem z internetu, jak w sumie sporo osób. Czytaj blogi na planeta.php.pl analizuj popularne frameworki (symfony, zend, kohana, yii itp). W sumie najwięcej się nauczyłem z analizy frameworków.

EDIT: zapomniałem o jednej jeszcze rzeczy, w smarty podobał mi się sposób zapisywania tablicy wielowymiarowej:

  1. {$tablica.klucz.drugi_klucz.trzeci_klucz}


I w tej mojej klasie, również można tak zapisywać tablice, ale można również je zapisywać w klasyczny sposób:

  1. {$tablica['klucz']['drugi_klucz']['trzeci_klucz']}


Praktycznie żadnych ograniczeń, prócz właściwie 2:
- kod php umieszczamy w klamrach, lub w tagach php (nie wiem czy to ograniczenie, ten kod tak czy siak musimy umieścić w tagach, więc umieszczanie w klamrach chyba nie jest ograniczeniem)
- wewnątrz klamry lub kodu php, nie możemy umieszczać klamr przykładowo bloków warunkowych, lub pętli. Stąd alternatywny zapis tych instrukcji.

Ten post edytował by_ikar 13.12.2011, 11:36:52
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 10.10.2025 - 16:26