Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Surowe szablony
Forum PHP.pl > Forum > PHP
R4D3K
Witam, chciałbym wszystkich zainteresowanych koderów zaprosić do dyskusji oraz uchylenia rąbka swojego fachu. Otóż odkąd zacząłem programować według wzorca MVC zacząłem myśleć o systemie szablonów. Na początku stworzyłem własną klasę, bazująca na wyrażeniach regularnych pcre, która parsowała dokument html w poszukiwaniu zmiennych,bloków itp i je podmieniała. Później wpadłem na odkrywczy fakt że po co odkrywać koło na nowo i zacząłem stosować smarty, w między czasie liznąłem trochę OPT. Jednak pewnego pięknego dnia natrafiłem na artykuł Pana W.Gajdy:
http://www.internetmaker.pl/artykul/2920,1...rezentacji.html
, otworzyłem swoje szablony i rzeczywiście okazało się, że powrót do "czystego PHP" to jest to !
Tylko według tej koncepcji znacznie uprościłem swój kod:
  1. <?php
  2. class main {
  3.    protected $model;
  4.    protected $zalogowany;
  5.    protected $leftcolumn;
  6.    protected $rightcolumn;
  7.    protected $cache_time=3600;
  8.    private $przykladowy_tekst;
  9.  
  10.    public function __construct() {
  11.  
  12.    }
  13.  
  14.    public function cache($template) {
  15.        if ((file_exists('./template_c/'.$template))&&(fileatime('./template_c/'.$template)>(time()-$this->cache_time))) {
  16.            $page=file_get_contents('./template_c/'.$template);
  17.        }
  18.        else {
  19.            ob_start();
  20.            include('./template/'.$template);
  21.            $page=ob_get_contents();
  22.            file_put_contents('./template_c/'.$template, $page);
  23.            ob_clean();
  24.        }
  25.        return $page;
  26.    }
  27.  
  28.    public function action() {
  29.        $this->przykladowy_tekst='Witaj świecie !';
  30.        echo $this->cache('main.php');
  31.    }
  32. }
  33. ?>

i właśnie tutaj stanąłem, bo nie wiem jak i czy wogle dalej dobrze myślę...otóż:
1.) jak tutaj zrobić dynamicznie ładowaną treść ? dać w sekcji <?php include($x); ?> i w zależności od danego żądania odpowiednio nadawać wartość $x ?
2.) Czy obsługę tak prostego systemu szablonów pisać w osobnej klasie i przesyłać dane metodą assign jak w smartym ? czy lepiej od razu zrobić to w kontrolerze 1-2 metody które ładują szablon cachują i tyle,a sam system szablonów to po prostu zapisane pliki .php z kodem HTML i wstawkami jak w tym artykule ?

Prosiłbym o jakiś przykładowy kod jeśli ktoś zechce się z nim podzielić
Zyx
Logika systemu szablonów osobno, szablony osobno. Popatrz sobie na Zend_View w ZF-ie, jak jest to rozwiązane.

A przy okazji polecam jeszcze taki tekst: http://www.zyxist.com/pokaz.php/uzyteczne_systemy_szablonow . Jakiś czas temu musiałem wrócić do szablonów PHP w jednym projekcie i to była masakra, szczególnie gdy przyszło budować formularze. Prawda jest taka, że 90% systemów szablonów po prostu reimplementuje PHP i powiela jak kalkę wszystkie jego wady i zalety, jednak nie znaczy to, że tak musi być zawsze, bo PHP nie ma monopolu na "jedyność słuszność".
aart3k
To ja tylko opowiem jak to jest w ZF.
Kontroler posiada takie pole co się zowie "view"
Wszystkie dane do view przekazuje się bezpośrednio jako pola tego wg schematu
$this->view->jakiesdane = "dane";

Potem dopiero Zend_View wg. określonego adaptera wywołuje skrypty phtml, które są właśnie esencją "powrotu do czystego php". Takie podejście jest w miarę OK, tylko wkurza nadmiarowość literek, ale można sobie przecież napisać funkcję ułatwiającą życie we własnym rozszerzeniu kontrolera winksmiley.jpg
R4D3K
Za Twoja namową Zyx poczytałem na temat Zend_View, i mniej więcej wiem jak to tam wygląda, jednak mam pytanie dotyczące Zend_Layout, otóż jak udało mi się dowiedzieć klasa ta służy do stworzenia kontenera strony www, czyli nagłówek+stopka:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  5. <title><?php echo $this->escape($this->title); ?></title>
  6. <link rel="stylesheet" type="text/css" media="screen"
  7. href="<?php echo $this->baseUrl;?>/public/styles/style.css" />
  8. </head>
  9.  
  10. <div id="content">
  11. <?php echo $this->layout()->content; ?>
  12. </div>
  13. </body>
  14.  
  15. </html>

dzięki takiemu rozwiązaniu do każdego naszego szablonu nie musimy już includować nagłówka i stopki itp. I moje pytanie jak to jest zaimplementowane (podejrzewam że zapewni dzięki metodom magicznym typu __call, ale mogę się mylić) , czy ktoś mogłbym mi słownie najlepiej kodem) pokazać jak ta metoda działa ?
Skoro szablon poprostu jest includowany (wtedy działa konstrukacja typu echo $view->zmienna), to czy tutaj jest to też zastępowane przez proste include ? czy wczytuje ten content i jakoś sprytnie podczas renderu jest to wklejane ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.