Niezalogowany (Zaloguj się)

Kategorie

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

    • CommentAuthoradmirau
    • CommentTimeDec 27th 2006
     
    Ten przykład demonstruje użycie filtra typu "post", czyli nakładanego na szablon po kompilacji

    Generuje listę linków użytych na stronie, przydatną przy drukowaniu strony.

    config.phptal.php
    <code lang="php">
    <?php

    /* Konfiguracja PHPTAL */

    // katalog z szablonami

    define('PHPTAL_TEMPLATE_REPOSITORY', SITE_PATH.'_tpl/');


    // katalog dla szablonów skompilowanych
    // uwaga: katalog musi mieć prawa do zapisu!

    define('PHPTAL_PHP_CODE_DESTINATION', SITE_PATH.'_compile/');

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


    // ścieżka do katalogu w którym zainstalowane jest PHPTAL
    ini_set('include_path', ini_get('include_path') . ':' . SITE_PATH . '_lib/');


    require_once 'PHPTAL.php';

    /* Koniec konfiguracji PHPTAL */

    class PHPTALx extends PHPTAL
    {
    public function DisplayTemplate($links=true){
    // wyświetlenie szablonu i ewentualne przechwycenie błędu
    // dorobić: info mailem do admina w razie draki
    try {
    if($links) $this->setPostFilter(new printLinks());
    echo $this->execute();
    }
    catch (Exception $e){
    echo '<pre>';
    echo $e;
    echo '</pre>';
    }
    }

    }
    </code>

    <code lang="php">
    /**
    * Zawartość pliku PHPTAL/filter.php
    *
    */
    interface PHPTAL_Filter
    {
    public function filter($str);
    }

    /**
    * Filtr dodający listę linków do strony
    *
    */

    class printLinks implements PHPTAL_Filter {
    public function filter($xhtml){
    $link_count=1;
    $this->_link_list = '';
    $xhtml = preg_replace('/<a[^>]*href="([^"]+)"[^>]*>(.+?)<\/a>/ie', '$this->_build_link_list($link_count++, "\\1", "\\2", "\\0")', $xhtml);
    //$this->printlinks = $this->_link_list;
    $xhtml = preg_replace('@<div id="printlinks"><\/div>@i', $this->_link_list, $xhtml);
    return $xhtml;
    }

    function _build_link_list($link_count, $link, $display, $a)
    {
    if ( substr($link, 0, 7) == 'http://' || substr($link, 0, 8) == 'https://' ||
    substr($link, 0, 7) == 'mailto:' ) {
    $this->_link_list .= "[$link_count] $link<br />\r\n";
    } else {
    $this->_link_list .= "[$link_count] " . $this->url;
    if ( substr($link, 0, 1) != '/' ) {
    $this->_link_list .= '/';
    }
    $this->_link_list .= "$link<br />\r\n";
    }

    return $a . '<sup class="printlinks">[' . $link_count . ']</sup>';
    }
    }

    ?>
    </code>

    sposób użycia:

    --
    plik: index.php

    <code lang="php">
    <?php
    require ('config.phptal.php');

    // nowy szablon
    $tpl=new PHPTALx('test_filter.html');

    // wyświetlenie szablonu
    $tpl->DisplayTemplate();

    ?>


    szablon

    plik: test_filter.html
    <code>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <title>TAAT Technologie Cyfrowe</title>
    <meta name="author" content="TAAT Technologie Cyfrowe" />
    <link rel="stylesheet" type="text/css" media="screen,projection,handheld" href="screen.css" />
    <link rel="stylesheet" type="text/css" media="print" href="print.css" />
    </head>

    <body>

    <h1>test 1</h1>
    <h2>cośtam</h2>
    <p>paragraf
    <ul>
    <li>cośtam2</li>
    <li><a href="http://link1" class="fdsf">link1 tekst</a></li>
    <li><a href="http://link2a" class="fdsf">link2a tekst</a></li>
    <li><a href="http://link3" class="fdsf">link3 tekst</a></li>
    <li><a href="http://link4" class="fdsf">link4 tekst</a></li>
    <li><a href="http://link5b" class="fdsf">link5b tekst</a></li>
    </ul>
    </p>

    <div class="printlinks">
    <h2>Linki na tej stronie:</h2>
    <div id="printlinks"></div>
    </div>

    </body>
    </html>
    </code>

    wynik

    źródło html:
    <code>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>TAAT Technologie Cyfrowe</title>
    <meta name="author" content="TAAT Technologie Cyfrowe"/>
    <link rel="stylesheet" type="text/css" media="screen,projection,handheld" href="screen.css"/>
    <link rel="stylesheet" type="text/css" media="print" href="print.css"/>
    </head>


    <body>

    <h1>test 1</h1>
    <h2>cośtam</h2>
    <p>paragraf
    <ul>
    <li>cośtam2</li>
    <li><a href="http://link1" class="fdsf">link1 tekst</a><sup class="printlinks">[1]</sup></li>

    <li><a href="http://link2a" class="fdsf">link2a tekst</a><sup class="printlinks">[2]</sup></li>
    <li><a href="http://link3" class="fdsf">link3 tekst</a><sup class="printlinks">[3]</sup></li>
    <li><a href="http://link4" class="fdsf">link4 tekst</a><sup class="printlinks">[4]</sup></li>
    <li><a href="http://link5b" class="fdsf">link5b tekst</a><sup class="printlinks">[5]</sup></li>
    </ul>

    </p>

    <div class="printlinks">
    <h2>Linki na tej stronie:</h2>
    [1] http://link1<br />
    [2] http://link2a<br />
    [3] http://link3<br />
    [4] http://link4<br />
    [5] http://link5b<br />

    </div>

    </body>
    </html>
    </code>


    w kodzie html wykorzystywana jest klasa CSS .printlinks

    która dla normalnego wyświetlania (media screen) wygląda tak:
    <code lang="css">
    .printlinks {
    display: none;
    }
    </code>

    czyli, elementy są ukryte,
    a dla wydruku (media print):
    <code lang="css">
    .printlinks {
    display: inline;
    }
    </code>

    Sposób działania

    Klasa filtruje szablon po komplilacji w poszukiwaniu linków.
    za każdym linkiem dodaje [nr],
    a w miejscu gdzie napotka ciąg znaków:

    <div id="printlinks"></div>

    wstawia listę linków

    W skrócie

    1. Includujesz plik config.phptal.php, zawierający filtr
    2. W szablonie, w miejscu w którym ma się pojawić lista linków wstawiasz:

    <div id="printlinks"></div>


    I to wszystko ;)