Strict Standards: Redefining already defined constructor for class wpdb in /blog/wp-includes/wp-db.php on line 49

Deprecated: Assigning the return value of new by reference is deprecated in /blog/wp-includes/cache.php on line 35

Strict Standards: Redefining already defined constructor for class WP_Object_Cache in /blog/wp-includes/cache.php on line 400

Strict Standards: Declaration of Walker_Page::start_lvl() should be compatible with Walker::start_lvl($output) in /blog/wp-includes/classes.php on line 534

Strict Standards: Declaration of Walker_Page::end_lvl() should be compatible with Walker::end_lvl($output) in /blog/wp-includes/classes.php on line 534

Strict Standards: Declaration of Walker_Page::start_el() should be compatible with Walker::start_el($output) in /blog/wp-includes/classes.php on line 534

Strict Standards: Declaration of Walker_Page::end_el() should be compatible with Walker::end_el($output) in /blog/wp-includes/classes.php on line 534

Strict Standards: Declaration of Walker_PageDropdown::start_el() should be compatible with Walker::start_el($output) in /blog/wp-includes/classes.php on line 553

Strict Standards: Declaration of Walker_Category::start_lvl() should be compatible with Walker::start_lvl($output) in /blog/wp-includes/classes.php on line 649

Strict Standards: Declaration of Walker_Category::end_lvl() should be compatible with Walker::end_lvl($output) in /blog/wp-includes/classes.php on line 649

Strict Standards: Declaration of Walker_Category::start_el() should be compatible with Walker::start_el($output) in /blog/wp-includes/classes.php on line 649

Strict Standards: Declaration of Walker_Category::end_el() should be compatible with Walker::end_el($output) in /blog/wp-includes/classes.php on line 649

Strict Standards: Declaration of Walker_CategoryDropdown::start_el() should be compatible with Walker::start_el($output) in /blog/wp-includes/classes.php on line 674

Deprecated: Assigning the return value of new by reference is deprecated in /blog/wp-includes/query.php on line 15

Deprecated: Assigning the return value of new by reference is deprecated in /blog/wp-includes/theme.php on line 505

Strict Standards: Non-static method Advanced_Permalinks::get() should not be called statically in /blog/wp-content/plugins/advanced-permalinks/advanced-permalinks.php on line 825

Strict Standards: call_user_func_array() expects parameter 1 to be a valid callback, non-static method GoogleSitemapGeneratorLoader::Enable() should not be called statically in /blog/wp-includes/plugin.php on line 123

Warning: call_user_func_array() expects parameter 2 to be array, null given in /blog/wp-includes/plugin.php on line 123
[Smarty-PHP] Co to są Smarty i jak je stosować? » Porady PHP, Porady Smarty » egrafik.pl
BAZA WIEDZY
KURSY
Bazy danych w PHP
Kurs AdvancedAJAX
Kurs ASP
Kurs ASP.NET
Kurs C++
Kurs CSS
Kurs HTML
Kurs HTML drugi
Kurs JavaScript
Kurs MySQL
Kurs PHP
Kurs RSS
Kurs XHTML
Obiekty DOM
MANUALE
CSS1 - W3C
DOM - w budowie
PHP 2005
PHP 2006
Wyrażenia regularne
SHOUTBOX
STAT
Online: 12 | UU: 506

Strict Standards: Resource ID#251 used as offset, casting to integer (251) in /forum2/db/mysql4.php on line 223

Strict Standards: Resource ID#251 used as offset, casting to integer (251) in /forum2/db/mysql4.php on line 224
[Smarty-PHP] Co to są Smarty i jak je stosować?
Porady PHP, Porady Smarty | 5 maj 2008 | Wizyt: 137112

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Strict Standards: Only variables should be assigned by reference in /blog/wp-includes/post.php on line 114

Deprecated: Function eregi() is deprecated in /blog/wp-content/plugins/tpbc.php on line 96

Język HTML, choć całkiem bogaty, nie daje wystarczających możliwości do tworzenia dynamicznych treści stron WWW. Z pomocą przyszedł język skryptowy PHP. Można w łatwy sposób wykorzystywać możliwości PHP zakorzeniając skrypty w źródle HTML, ale czy to aby jedyne wygodne rozwiązanie?

Wykorzystanie możliwości programowania i manipulowania kodem html to świetna sprawa. Pod warunkiem, że zajmująca sie tym osoba zna się zarówno na tworzeniu wyglądu strony, jak i na programowaniu. Problem pojawia się wtedy, gdy nad jednym projektem równocześnie pracuje wiele osób. Zazwyczaj dzielą się zadaniami i komptenencjami w taki sposób, że jedni odpowiadają za warstwę prezentacji danych, a inni za tworzenie możliwości dynamicznego zarządzania treścią. W takich przypadkach programiści starają tak pisać skrypty tak, by osoba znająca jedynie HTML nie musiała się przejmować, że coś "zepsuje". To jednak często niemożliwe, a jak wiadomo nie trudno o pomyłkę w kodzie PHP powodującą wyłożenie się całej strony.

Rozpatrzmy ten problem na przykładzie:

Kod: php

    <?php
      $zmienna = "Witaj świecie";
    ?>
    <html>
      <head>
      </head>
        <body>
          <?php
            echo"<div>";
            echo $zmienna;
            echo "</div>";
          ?>
        </body>
    </html> 

Wygląda całkiem dobrze. Wydaje się, że nic więcej nie trzeba. Ale to prosty przykład. Idźmy dalej.

Kod: php

    <?php
    //dołączenie konfiguracji połączenia z bazą
    include "config.php";
    if(!($db = @mysql_connect(SERWER, UZYTKOWNIK, HASLO))) //połączenie z bazą
      die("Nie można połączyć się z bazą.");
    if(!@mysql_select_db(NAZWA_BAZY, $db)) //wybierz bazę
      die("Baza nie istnieje!");
    $sql = "SELECT * FROM uzytkownicy";
     
    if(($result = @mysql_query($sql, $db)) == 0)
    {
      echo "\n<hr />Błąd: <span style=’font-weight:bold;’>".mysql_error()."</span><br /><br />\n";
      die("Zapytanie (<span style=’font-weight:bold;’>$sql</span>) w pliku <span style=’font-weight:bold;’>$_SERVER[’PHP_SELF’]</span>");
    }
    $uzytkownik = array();
     
    ?>
    <table>
      <tr>
        <td><strong>Imie</strong></td>
        <td><strong>Nazwisko</strong></td>
        <td><strong>Email</strong></td>
      </tr>
    <?php
    while($tmp = mysql_fetch_assoc($result))
    {
    ?>
      <tr>
        <td><?php echo $tmp["Imie"];?></td>
        <td><?php echo $tmp["Nazwisko"];?></td>
        <td><?php echo $tmp["Email"];?></td>
      </tr>
    <?php
    }
    ?> 

Wygląda całkiem nieźle. A to dlatego, że oddzieliliśmy tagi HTML od poleceń PHP. Ale czy to wystarczający sposób na usprawnienie wspólnej pracy programistów i designerów. Otóż nie. Spróbujemy ułatwić im życie separując PHP i HTML jeszcze bardziej. Spróbujmy kod z drugiego przykładu zmodyfikować i rozdzielić na dwa pliki. Nazwijmy pierwszy z nich przyklad2.php. Oto on:

Kod: php

    <?php
    //dołączenie konfiguracji połączenia z bazą
    include "config.php";
    if(!($db = @mysql_connect(SERWER, UZYTKOWNIK, HASLO))) //połączenie z bazą
      die("Nie można połączyć się z bazą.");
    if(!@mysql_select_db(NAZWA_BAZY, $db)) //wybierz bazę
      die("Baza nie istnieje!");
    $sql = "SELECT * FROM uzytkownicy";
     
    if(($result = @mysql_query($sql, $db)) == 0)
    {
      echo "\n<hr />Błąd: <span style=’font-weight:bold;’>".mysql_error()."</span><br /><br />\n";
      die("Zapytanie (<span style=’font-weight:bold;’>$sql</span>) w pliku <span style=’font-weight:bold;’>$_SERVER[’PHP_SELF’]</span>");
    }
    $uzytkownik = array();
     
    while($tmp = mysql_fetch_assoc($result))
    {
      $uzytkownik [] = $tmp;
    }
    include "templates/przyklad2.tpl.php";
    ?> 

Drugi plik nazwijmy przyklad2.tpl.php i wsadźmy go do katalogu templates.

Kod: php

    <html>
      <head>
        <title>Przykład 2</title>
      </head>
        <body>
          <table>
            <tr style="font-weight:bold;">
              <td>Imie</td>
              <td>Nazwisko</td>
              <td>Email</td>
            </tr>
    <?php
    for($i=0; $i<count($uzytkownik); $i++)
    {
    ?>
            <tr>
              <td><?php echo $uzytkownik[$i]["Imie"];?></td>
              <td><?php echo $uzytkownik[$i]["Nazwisko"];?></td>
              <td><?php echo $uzytkownik[$i]["Email"];?></td>
            </tr>
    <?php
    }?>
          </table>
        </body>
    </html> 

To wygląda już znacznie lepiej. Teraz designer nie musi nawet zaglądać do pliku z kodem php. Nie naraża się więc na to, że edytując plik naruszy tak starannie napisany przez programistę kod php. Inną przewagą szablonów jest to, że mogą one być dołączane wiele razy do tego samego pliku. Nie musimy wtedy dla różnych stron powtarzać tego samego kodu. Możemy dodatkowo oddzielić główkę i stopkę i podzielić je na dwa pliki, a następnie dołączyć te pliki do pliku przyklad2.tpl.php. Rozdzielenie warstwy prezentecji od warstwy programowej może stać się jeszcze bardziej efektywne, gdy zastosujemy specjalnie do tego celu stworzony system szablonów zwany: SMARTY TEMPLATE ENGINE.

Nie wszyscy są do tego rozwiązania przekonani, jednak ja poznając głębiej jego możliwości, muszę stwierdzić, że jest on bardzo przydatny w kontekście oddzielenia funkcji programisty i designera. W następnym przykładzie pokażę jak przykład2 przystosować do współpracy ze smartami.

Na początek zainstaluj najnowszą wersję Smarty. Po ściągnięciu na dysk rozpakuj pliki do tymczasowego folderu. Następnie zajmij się konfiguracją wszystkich katalogów i plików. Potrzebne będą następujące katalogi: templates, templates_c, cache oraz config. Katalog templates ma służyć umieszczaniu nowo stworzonych szablonów - templatów. Katalog templates_c służy skompilowaniu templatów, cache do "keszowania", config do konfiguracji. Możesz katalogi nazwać jak chcesz, jednak musisz to skonfigurować, aby Smasty o tym wiedziały:). Stworzyłem jeszcze jeden katalog o nazwie smarty, gdzie powinno się skopiować katalog libs. W tym momencie struktura Twoich katalogów powinna wyglądać tak:

[cache]
[configs]
[smarty]
    [libs]
[templates]
[templates_c]

Upewnij się, że katalogi templates_c i templates są zapisywalne przez serwer. Można jeszcze stworzyć dodatkowy katalog do przechowywania podstawowej konfiguracji dla bazy danych i smartów. Poniżej plik config.php

Kod: php

    <?php
    //db konfiguracja
    define ("SERWER","localhost");
    define ("UZYTKOWNIK","root");
    define ("HASLO","");
    define ("NAZWA_BAZY","test");
    /*******************
    SMARTY
    *******************/

    require_once("smarty/libs/Smarty.class.php");
    $smarty = new Smarty;
    ?> 

Jeżeli zechcesz zmienić nazwy katalogów, dodaj koniecznie taki kod:

Kod: php

    $smarty->template_dir = "path_to_your_template_dir";
    $smarty->compile_dir = "path_to_your_compile_dir"

Teraz zmodyfikujmy nasz ostatni przykład tak by działał ze Smarty. Oto przyklad.php:

Kod: php

    <?php
    //dołączenie konfiguracji połączenia z bazą
    include "includes/config.php";
    if(!($db = @mysql_connect(SERWER, UZYTKOWNIK, HASLO))) //połączenie z bazą
      die("Nie można połączyć się bazą.");
    if(!@mysql_select_db(NAZWA_BAZY, $db)) //wybierz bazę
      die("Baza nie istnieje!");
    $sql = "SELECT * FROM uzytkownicy";
     
    if(($result = @mysql_query($sql, $db)) == 0)
    {
      echo "\n<hr />Błąd: <span style=’font-weight:bold;’>".mysql_error()."</span><br /><br />\n";
      die("Zapytanie było (<span style=’font-weight:bold;’>$sql</span>) w pliku <span style=’font-weight:bold;’>$_SERVER[’PHP_SELF’]</span>");
    }
    $uzytkownik = array();
     
    while($tmp = mysql_fetch_assoc($result))
    {
      $uzytkownik [] = $tmp;
    }
    $smarty->assign("title", "Przykład zastosowania Smarty");
    $smarty->assign("uzytkownik", $uzytkownik);
    $smarty->display("przyklad.tpl.htm");
    ?> 

Pewnie zauważyłeś, że jedyną różnicą są 3 ostatnie linie kodu. Pierwsza przypisuje do zmiennej "title" (pod taką nazwą będzie rozpoznawana w pliku szablonu czyli .tpl) jakiś ciąg znaków (Przykład zastosowania Smarty). Druga do zmiennej "uzytkownik" przypisuje tablicę "$uzytkownik". Trzecia wskazuje plik szablonu do wyświetlenia po wykonaniu całego kodu z pliku przyklad.php. Plik przyklad.tpl.htm, który mówimy powinien wyglądać tak:

Kod: php

    {include file="glowka.tpl.htm"}
    <table>
      <tr style="font-weight:bold;">
        <td>Nr</td>
        <td>Imię</td>
        <td>Nazwisko</td>
        <td>Email</td>
      </tr>
    {section name=c loop=$uzytkownik}
      <tr>
        <td>{$smarty.section.c.iteration}</td>
        <td>{$uzytkownik[c].Imie}</td>
        <td>{$uzytkownik[c].Nazwisko}</td>
        <td>{$uzytkownik[c].Email}</td>
      </tr>
    {/section}
    </table>
    {include file="stopka.tpl.htm"} 

W pierwszej linii dołączyłem plik glowka.tpl.htm, a w ostatniej stopka.tpl.htm. Polecenie {inlcude} podobnie jak w kodzie php dołączą inne pliki do obecnego. Wszystkie zmienne, które są dostępne w naszym obecnym szablonie - templejcie :) będą również dostępne dla dołączanych szablonów. Poniższy przykład zademonstruje to ze zmienną $title. Plik glowka.tpl.htm wygląda tak:

Kod: php

    <html>
      <head>
        <title>{$title}</title>
      </head>
        <body> 

a stopka.tpl.htm:

Kod: php

    </body>
    </html>   

W pliku przyklad.tpl.htm mamy pętlę:

Kod: php

    {section name=c loop=$uzytkownik}
      <tr>
        <td>{$smarty.section.c.iteration}</td>
        <td>{$uzytkownik[c].Imie}</td>
        <td>{$uzytkownik[c].Nazwisko}</td>
        <td>{$uzytkownik[c].Email}</td>
      </tr>
    {/section} 

Tag {section} zajmuje się wykonaniem pętli po tablicy z danymi pobranymi z bazy danych i musi być zamknięty tagiem {/section}. Element {section} potrzebuje dwa atrybuty: name i loop. Atrybut name jest nazwą sekcji, a atrybut loop jest wartością wskazującą ile razy ma wykonać się pętla. {section} posiada jeszcze inne dodatkowe atrybuty takie jak: start, step, max, show. Możesz potestować ich działanie. Element {section} posiada również swoje własne zmienne określające jego własności. Jedną z nich jest pokazującą liczbę iteracji w pętli jest {$smarty.section.c.iteration}. Przedstawione tutaj zagadnienia są podstawowym opsiem możliwości technologii Smarty. A możliwości tego narzędzia są bardzo duże i zapewniają, moim zdaniem, wielke ułatwienie w tworzeniu systemów internetowych.

Opracowanie: Adam Suchowski

nowe Porady PHP » zobacz wszystkie
nowe Porady Smarty » zobacz wszystkie

WordPress database error: [Incorrect file format 'wp_comments']
SELECT * FROM wp_comments WHERE comment_post_ID = '884' AND comment_approved = '1' ORDER BY comment_date desc

Dodaj komentarz









 
| | | |
Copyright © 2006-2013 egrafik.pl | Kontakt | Reklama | Projekty domów
jocker