Niezalogowany (Zaloguj się)

Kategorie

Vanilla 1.0.3 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • CommentAuthoradmirau
    • CommentTimeDec 27th 2006
     
    Problem:

    Chcemy stworzyć uniwersalny szablon strony,
    tak aby wszystkie podstrony były podobne do siebie,
    ale różniły się zawartością.

    Rozwiązanie:
    PHPTAL pozwala na tworzenie tzw. makr, które należy rozumieć jako elementy szablonu, które mogą zostać wielokrotnie wykorzystane.

    Ilustruje to poniższy szablon:

    ---
    plik: bloki.html
    <code lang="xml">
    <head metal:define-macro="naglowki_strony">
    <title tal:content="title">przykładowy tytuł strony</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
    </head>


    <div metal:define-macro="menu">
    <ul>
    <li><a href="#">link 1</a></li>
    <li><a href="#">link 2</a></li>
    <li><a href="#">link 3</a></li>
    <li><a href="#">link 4</a></li>
    </ul>
    </div>

    <div metal:define-macro="stopka">
    to jest stopka
    </div>

    <div metal:define-macro="stopka2">
    to jest inna wersja stopki
    </div>

    <div metal:define-macro="naglowek">
    <h1>to jest nagłówek</h1>
    </div>

    <div metal:define-macro="naglowek2">
    <h2>to jest inna wersja nagłówka</h2>
    </div>
    </code>

    Powyższy plik, jest zbiorem elementów HTML,
    które możemy wykorzystać wielokrotnie.

    Każdemu z bloków (macro), nadałem nazwę, za pomocą atrybutu:
    <code>
    tal:define-macro="nazwa_makra"
    </code>


    Przykładowy szablon, który wykorzystuje niektóre z tych bloków,
    może wyglądać na przykład tak:

    ---
    plik: strona.html
    <code lang="xml">
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>

    <span metal:use-macro="bloki.html/naglowki_strony"/>

    <body>

    <span metal:use-macro="bloki.html/naglowek"/>
    <span metal:use-macro="bloki.html/menu"/>

    <div>
    <p>
    to jest główna tresć strony
    </p>
    </div>

    <span metal:use-macro="bloki.html/stopka2"/>
    </body>
    </html>
    </code>

    Każdorazowe użycie:
    <code>
    metal:use-macro="nazwa_pliku_makr.html/nazwa_makra"
    </code>
    powoduje dołączenie makra ze wskazanego pliku.

    Plik wyświetlający nasz szablon, będzie wyglądał tak:

    ---
    plik: strona.php

    <code lang="php">
    <?php

    /* Konfiguracja PHPTAL */

    $stara_sciezka = ini_get('include_path');
    // dla serwera na windows trzeba użyć ';' zamaist ':' w lini poniżej
    ini_set('include_path', $stara_sciezka.':/sciezka/do/bibiotek/PHPTAL-1.1.7');

    // katalog z szablonami
    define('PHPTAL_TEMPLATE_REPOSITORY', '/sciezka/do/szablonow/_tpl/');

    // katalog dla szablonów skompilowanych
    // uwaga: katalog musi mieć prawa do zapisu!
    define('PHPTAL_PHP_CODE_DESTINATION', '/sciezka/do/szablonow/skompilowanych/');

    // wymuś kompilację za każdym razem
    define('PHPTAL_FORCE_REPARSE', 1);

    require_once 'PHPTAL.php';

    /* Koniec konfiguracji PHPTAL */

    $szablon = new PHPTAL('strona.html');
    $szablon->title='Nasz dynamiczny tytuł strony!';

    try {
    // wyświetlenie szablonu
    echo $szablon->execute();
    }
    // wyświetlenie błędu, jeśli wystąpił podczas wyświetlania
    catch (Exception $e){
    echo $e;
    }

    ?>
    </code>

    Podglądając źródło HTML w przeglądarce,
    możesz zobaczyć wynik:
    <code lang="xml">
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html>

    <head>
    <title>Nasz dynamiczny tytuł strony!</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"/>
    </head>
    <body>

    <div>
    <h1>to jest nagłówek</h1>

    </div> <div>
    <ul>
    <li><a href="#">link 1</a></li>
    <li><a href="#">link 2</a></li>
    <li><a href="#">link 3</a></li>
    <li><a href="#">link 4</a></li>
    </ul>

    </div>
    <div>
    <p>
    to jest główna tresć strony
    </p>
    </div>

    <div>
    to jest inna wersja stopki
    </div> </body>
    </html>
    </code>