X36WWW. Vícevrstvá architektura webové aplikace Martin Klíma. Tvorba Webu 2 1



Podobné dokumenty

HTTP. Tenký klient. Server (HTML) IV. datová vrstva. III. vrstva aplikační logiky. I. presentační vrstva. II. vrstva webu.

Ing. Přemysl Brada, MSc., Ph.D. Ing. Martin Dostal. Katedra informatiky a výpočetní techniky, FAV, ZČU v Plzni

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

HTML Hypertext Markup Language

IS pro podporu BOZP na FIT ČVUT

1. Struktura stránky, zásady při psaní kódu, MVC pattern. Web pro kodéry (Petr Kosnar, ČVUT, FJFI, KFE, PINF 2008)

Programování v jazyce JavaScript

Programování v jazyce JavaScript

(X)HTML, CSS a jquery

WWW a HTML. Základní pojmy. Ivo Peterka

Mgr. Vlastislav Kučera přednáška č. 2

Dynamické stránky v praxi. Bedřich Košata

HTML - Úvod. Zpracoval: Petr Lasák

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Programování v jazyce JavaScript

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

Bottle -- příklad. Databáze. Testovací data. id Jedinečný identifikátor řádku: Bude typu INT s AUTO_INCREMENT a nastavíme ho jako primární klíč

Tvorba WWW stránek. přehled technologií používaných na webu principy jednotlivých technologií a možnosti jejich vzájemného kombinování

Mgr. Vlastislav Kučera lekce č. 2

Šablonovací systém htmltmpl vypracoval: Michal Vajbar, Šablonovací systém htmltmpl

Plánování a vývoj základního frameworku

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Architektura softwarových systémů

Název Live prez Sear enta Maps

!!Via!AUREA,!s.r.o.!

Instalace a konfigurace web serveru. WA1 Martin Klíma

Webové Aplikace (6. přednáška)

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Tvorba informačních systémů

Objekty a OOP KAPITOLA 3. První kroky s OOP. V této kapitole: První kroky s OOP. Rozšiřujeme třídy Šablony Soubory projektu

Pear - hruška Systém pro implementaci a distribuci znovupoužitelných komponent (v PHP) Strukturovaná knihovna open-source (PHP) skriptů Systém pro dis

PŘEHLED A MOŽNOSTI VYUŽITÍ WEBOVÝCH MAPOVÝCH SLUŽEB

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové technologie

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

Semestrální úloha 1 z předmětu Programovací jazyk C. Textový merge. Student:

Návrh a tvorba WWW stránek 1/14. PHP a databáze

KIV/PIA 2012 Ing. Jan Tichava

Tvorba stránek v HTML ve Wordu

Pokročilé techniky tvorby sestav v Caché. ZENové Reporty

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

M4 PDF rozšíření. Modul pro PrestaShop.

Printris. Hra Printris je psána pomocí příkazů Javascriptu a standardních příkazů HTML.

Rezervační systém Tvorba WWW stránek

Architektura aplikace

Stručný úvod pro programátory. Michal Kuchta

Michal Augustýn ALWIL Software Microsoft Most Valuable Professional

Tvorba informačních systémů

Programování v jazyce JavaScript

Kapitola 4. Šablony se Smarty

Tvorba webu. Úvod a základní principy. Martin Urza

Databáze MS-Access. Obsah. Co je to databáze? Doc. Ing. Radim Farana, CSc. Ing. Jolana Škutová

Django Urls, views, templates

Jak importovat šablony tiskových sestav do aplikace MarkTime PORTAL. Administrační manuál Bellman Group, s.r.o. 2007/09/23 verze 1.

Programátorská příručka

Kód, který se nebude často měnit

Střední odborná škola a Střední odborné učiliště, Hořovice

1 Webový server, instalace PHP a MySQL 13

Úvod do Operačních Systémů

Snadný vývoj webových aplikací s Nette. Lukáš Jelínek

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Výjimky a ošetřování chyb v PHP. Who is General Failure and why is he reading my disk?!

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

13. Vytváření webových stránek

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

K práci budeme využívat souborového manažeru Unreal Commander alespoň si ho procvičíme

AJAX. Dynamické změny obsahu stránek

Tvorba webových stránek

Koláčky, sezení. Martin Klíma

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Použití databází na Webu

Základy HTML. Autor: Palito

návrhový vzor Singleton.

Úvod do tvorby internetových aplikací

1. Webový server, instalace PHP a MySQL 13

Jaku b Su ch ý 1

BI-AWD. Administrace Webového a Databázového serveru Virtualizace HTTP serveru

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

MS Excel makra a VBA

TNPW1 Cvičení aneta.bartuskova@uhk.cz

Objektově orientované programování v PHP 5. Martin Klíma

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

WWW technologie. HTTP protokol

MySQLi (objektově) Příklad vytvoření instance třídy včetně parametrů pro připojení: $mysqli = new mysqli('localhost', 'login', 'heslo', 'databaze');

Tvorba WWW stránek. Mojmír Volf

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Dokumentace k API SSLmarketu. verze 1.3

1. Distribuce Javy. 2. Vlastnosti J2EE aplikace. 3. Fyzická architektura J2EE aplikace. Distribuce Javy se liší podle jejího zamýšleného použití:

Skriptovací jazyky. Obsah

Základy HTML, URL, HTTP, druhy skriptování, formuláře

Tlačítko Teachers Guide obsahuje odkaz na stručný popis hry a její účel v projektu Ingot.

Uspořádání klient-server. Standardy pro Web

Úvod do programování - Java. Cvičení č.4

PHP. Čtvrtek 8. září. Čtvrtek 15. září. Anonymní test znalostí

Aplikační vrstva. Úvod do Php. Ing. Martin Dostal

Internet WEB stránky HTML, Hypertext MarkUp Language - nadtextový jazyk - Místo příkazů obsahuje tagy - značky

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Základy informatiky. HTML, tvorba WWW stránek. Daniela Szturcová Část převzata z přednášky P. Děrgela

JavaScript 101. "Trocha života do statických stránek"

Komponentově orientované webové frameworky. Jiří Stránský twitter.com/jistr

Transkript:

X36WWW Vícevrstvá architektura webové aplikace Martin Klíma 1

Architktura MVC M = Model V = View C = Controller Model reprezentuje aplikační logiku View reprezentuje prezentační logiku C reprezentuje logiku, která to vše řídí 2

MVC 1. http request Controller 2. použij Model 3. použij DB Klient 4. zobraz 5. http response View Model Databáze Model 3

Výhody MVC Dobré oddělení aplikační (Model) a prezentační (View) logiky Přehlednost Objektovost Možnost dělby práce view má na starosti grafik model má na starosti programátor Lepší testování Co se v praxi nejvíc mění (u webové aplikace) view 4

Nevýhody MVC Složitější projekt Více různých souborů Pro malé věci možná zbytečné. to je možná moc silné tvrzení 5

PHP a MVC PHP nemá nativní podporu pro MVC Nicméně je to možné "naroubovat" Frameworky, které to podporují Prado Zend Framework FastTemplate PHPLib Smarty smarty.php.net 6

Smarty Sada PHP souborů Odděluje aplikační a prezentační logiku MC = aplikační logika V = prezentační logika Server Klient Prezentační logika Aplikační Logika Databáze 7

PHP Skript Aplikační logika POUZE ZDE vlož šablonovací engine vytvoř šablonový objekt zavolej model přiřaď hodnoty do šabl. objektu nahraj a zobraz template (šablonu) Template <html>... <body> <h1>{$nadpis}</h1> uživatelovo jméno: {$jmeno} </body> </html> 8

Co se děje v pozadí 1. Proveď PHP skript aplikační logika, model 2. Vytvoř se Templatovací objekt 3. Tomuto objektu se přiřaď datové struktury z ap. logiky 4. Zavolej metodu display 1. je zapnuta cache? ano-jdi na bod 8 2. ne existuje přeložená šablona? ano jdi na bod 5 3. proveď lexikální analýzu šablony 4. expanduj příkazy pseudoskriptu do podoby PHP kódu 5. přeloženou šablonu ulož 6. proveď příkazy pseudoskriptu 7. výsledek ulož do cache (pokud je zapnuta) 8. výsledek zobraz na standardní výstup 9

Šablona = prezentační logika Vlastní jazyk Velice jednoduchý Zaměřený na prezentaci informací zobrazení iterace podmínky filtry 10

Smarty Doporučená struktura adresářů smarty templates templates_c configs cache web_root / smarty Šablony Zkompilované šablony Konfiguračné soub. cache 11

Ukázka jednoduché aplikace (ukaž datum) Model: zajistí datum Controller: všechno zavolá View: definuje, jak to bude vypadat 12

Controller smarty_datum.php <? require("setup.php"); // toto je controller // zavolam model $datum_a_cas = new DatumCas(); //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); // priradim mu hodnoty z modelu $smarty->assign("datum", $datum_a_cas->getdate()); // zavolam view $smarty->display("smarty_datum.html");?> 13

Model datumcas.php class DatumCas { // konstruktor public function construct(){ } } public static function getdate() { // vraci aktualni datum return date("d.m.y"); } 14

View smarty_datum.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>smarty datum</title> </head> <body> <h1>dnes je: {$datum}</h1> </body> </html> 15

Iterace Potřeba zobrazit pole dat Vede na cykly v prezentační logice Příklad: zobrazte seznam uživatelů Controller: všechno zavolá Model: zajistí seznam jako pole a sáhne do db View: iteruje přes pole a zajistí jeho prezentaci 16

Controller smarty_uzivatele.php require("setup.php"); // toto je controller // zavolam model $uzivatele = Uzivatele::getList(); //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); // priradim mu hodnoty z modelu $smarty->assign("uzivatele", $uzivatele); // zavolam view $smarty->display("smarty_uzivatele.html"); 17

Model uzivatele.php class Uzivatele { public static function getlist(){ $vysledek = array(); try { // sestav dotaz $dotaz = "SELECT * FROM uzivatele"; // nacti vysledek $db = DB::getInstance(); $sql_vysledek = $db->query($dotaz); } } // iteruj radky v db while ($radek = $db->fetch($sql_vysledek)) { $vysledek[] = $radek; } } catch (DBException $e) {} // vrat pole radku return $vysledek; 18

View smarty_uzivatele.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>smarty uživatelé</title> <meta http-equiv="content-type" content="text/html; charset=windows-1250" /> </head> <body> <h1>tabulka uživatelů našeho systému</h1> <table summary="seznam uživatelů"> <tr> <th>id</th> <th>jméno</th> <th>příjmení</th> </tr> {foreach from=$uzivatele item=uzivatel} <tr> </body> <td>{$uzivatel.id}</td> <td>{$uzivatel.jmeno}</td> <td>{$uzivatel.prijmeni}</td> </tr> {/foreach} </table> 19 Pozor!!! Chyba

Chyba v prezentační logice Prezentační logika musí zajistit, aby byl text zobrazen ve správném kódování Využijeme modifikátory Smarty V tomto případě modifikátor escape {foreach from=$uzivatele item=uzivatel} <tr> <td>{$uzivatel.id}</td> <td>{$uzivatel.jmeno escape:"html"}</td> <td>{$uzivatel.prijmeni escape:"html"}</td> </tr> {/foreach} 20

Modifikátory Existuje řada připravených modifikátorů capitalize lower cat nl2br count_characters regex_replace count_paragraphs replace count_sentences spacify count_words string_format date_format strip default strip_tags escape truncate indent upper wordwrap Modifikátory lze řetězit {$uzivatel.jmeno truncate escape:"html" capitalize} 21

Nový požadavek text ve dvou sloupcích PHP kód zůstává beze změny Mění je jen prezentační logika programátor nemusí dělat prakticky nic vše je na grafikovi 22

Modifikovaná prezentační logika <table summary="seznam uživatelů"> <tr> <th>jméno</th> <th>příjmení</th> <th>jméno</th> <th>příjmení</th> </tr> {section name=i loop=$uzivatele} {if ($smarty.section.i.iteration mod 2) == 1} <tr> {/if} <td>{$uzivatele[i].jmeno escape:"html"}</td> <td>{$uzivatele[i].prijmeni escape:"html"}</td> {if ($smarty.section.i.iteration mod 2) == 0} </tr> {/if} {/section} {if $smarty.section.i.rownum mod 2 == 1} <td> --- </td> <td> --- </td> </tr> {/if} 23 Lichá položka? Ano: vlož značku <tr> Sudá položka? Ano: ukonči značku </tr> Co se stane, když je lichý počet položek

Výsledek 24

Další požadavek: střídání řádků Řešení: opět čistě jen prezentační logika 25

Prezentační logika střídání řádků <table summary="seznam uzivatelu db"> {section name=i loop=$uzivatele} {if ($smarty.section.i.iteration mod 2) == 1} <tr class="{cycle values="lichy, sudy"}"> {/if} <td>{$uzivatele[i].jmeno escape:"html"}</td> <td>{$uzivatele[i].prijmeni escape:"html"}</td> {if ($smarty.section.i.iteration mod 2) == 0} </tr> {/if} {/section} {if $smarty.section.i.rownum mod 2 == 1} <td> --- </td> <td> --- </td> </tr> {/if} </table> 26 Cyklicky střídá parametry oddělené čárkou

Střídání řádků vložení CSS stylu <title>pokusny formular</title> <style type="text/css"> tr.lichy { background-color: grey; } tr.sudy { background-color: white; } </style> Pozor! Konflikt značek { a } Smarty parser interpretuje tyto značky </head> <table summary="seznam uzivatelu db"> {section name=i loop=$uzivatele} {if ($smarty.section.i.iteration mod 2) == 1} {/if} <tr class="{cycle values="lichy, sudy"}"> <td>{$uzivatele[i].jmeno escape:"htmlall"}</td> <td>{$uzivatele[i].prijmeni escape:"htmlall"}</td> {if ($smarty.section.i.iteration mod 2) == 0} </tr> {/if} {/section} {if $smarty.section.i.rownum mod 2 == 1} <td> --- </td> <td> --- </td> </tr> 27

Střídání řádků vložení CSS stylu <title>pokusny formular</title> {literal} <style type="text/css"> tr.lichy { background-color: grey; } tr.sudy { background-color: white; } </style> {/literal} </head> <table summary="seznam uzivatelu db"> {section name=i loop=$uzivatele} {if ($smarty.section.i.iteration mod 2) == 1} {/if} <tr class="{cycle values="lichy, sudy"}"> <td>{$uzivatele[i].jmeno escape:"htmlall"}</td> <td>{$uzivatele[i].prijmeni escape:"htmlall"}</td> {if ($smarty.section.i.iteration mod 2) == 0} </tr> {/if} {/section} {if $smarty.section.i.rownum mod 2 == 1} <td> --- </td> <td> --- </td> </tr> 28 Neinterpretuj jako Smarty kód Pozor! Konflikt značek { a } Smarty parser interpretuje tyto značky

Cache Jednou vygenerovaný výsledek může být uložen a použit znovu Výhoda: Výrazné zrychlení odezvy Méně dotazů do db Nevýhoda: Zabírá prostor na disku Aditivní kód Uživatel nedostává aktuální data Delší zpracování stránek, které nejsou v cache 29

Příklad jen aplikační logika require("setup.php"); // zavolam model $uzivatele = Uzivatele::getList(); //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); Zde NEšetříme čas Zapni cache s dobou života 120 sec $smarty->caching = true; $smarty->cache_lifetime = 120; // v sekundach // priradim mu hodnoty z modelu $smarty->assign("uzivatele", $uzivatele); // zavolam view $smarty->display("smarty_uzivatele2.html"); Zde šetříme čas 30

Příklad cache - oprava require("setup.php"); // toto je controller, pohrajeme si s cache //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); $smarty->caching = true; $smarty->cache_lifetime = 120; // v sekundach Zapni cache s dobou života 120 sec if (!$smarty->is_cached("smarty_uzivatele2.html")){ // zavolam model jen kdyz je to potreba $uzivatele = Uzivatele::getList(); // priradim hodnoty z modelu $smarty->assign("uzivatele", $uzivatele); } // zavolam view $smarty->display("smarty_uzivatele2.html"); Zde šetříme čas když to lze Zde šetříme čas kuk smarty3-caching/index2.php 31

Více různých uživatelů V praxi máme různý vzhled stránky pro různé role Administrátor Registrovaný Anonymní Jak to řešit? Každý role dostane svojí vlastní větev cache Rozlišení jednotlivých cache je příslušnost k roli 32

Cache multiple require("setup.php"); //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); $smarty->caching = true; $smarty->cache_lifetime = 120; // v sekundach // co jsem za roli? zeptam se modelu $user = new User(); $role = $user->getrole(); if (!$smarty->is_cached("smarty_uzivatele2.html", $role)){ // zavolam model jen kdyz je to potreba $uzivatele = Uzivatele::getList(); // priradim hodnoty z modelu $smarty->assign("uzivatele", $uzivatele); echo "cache missed role $role"; } else { echo "cache hit, role $role"; } // zavolam view $smarty->display("smarty_uzivatele2.html", $role); 33

Debug - ladění Umožňuje zobrazit parametry přiřazené k template objektu. Do těla template stačí napsat značku {debug} 34

Výsledek 35

Filtry Životní cyklus šablony Prochází řadou filtrů Před překladem Po překladu Po vykonání Prefilter Kompilace Postfilter Display Output filter 36

Prefilter Textový filter, kterým je prohnán template ještě předtím, než je zkompilován Hodí se k odstranění uživatelských komentářů, preprocessing obecně Prefilter Kompilace Postfilter Display Output filter 37

Postfilter Textový filter, kterým je prohnán template poté, co byl zkompilován Hodí se např. k přidání nějaké spec. informace Prefilter Kompilace Postfilter Display Output filter 38

Output filter Textový filter, kterým je prohnán template poté, co byl zkompilován Pracuje tedy nad kompletním výstupem Hodí se např. k zvýraznění některých slov, jejich potlačení, ochrana před vulgaritami atd. Prefilter Kompilace Postfilter Display (fetch) Output filter 39

Jak se filtry používají require("setup.php"); function muj_output_filter($tpl_output, &$smarty) { // provede nejakou textovou manipulaci $vzor[] = '/Trabant/'; $vzor[] = '/Tatra 613/'; $vzor[] = '/Lada/'; $nahrazeni[] = 'splašený vysavač'; $nahrazeni[] = 'papalášfáro'; $nahrazeni[] = 'Žigulík'; // proved nahrazeni a vrat vysledek return preg_replace($vzor, $nahrazeni, $tpl_output); } //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); // registrace výstupní funkce $smarty->register_outputfilter("muj_output_filter"); // zavolam view $smarty->display("smarty_filtry.html"); 40

Jak se filtry používají zdrojová šablona <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="content-type" content= "text/html; charset=windows-1250"> <title> Pokus s filtrem </title> </head> <body> <h1>filtr</h1> <p>na této stránce se dějí zajímavé věci s filtry.</p> <p>franta říkal, že nejlepší auto je Trabant.</p> <p>pepa ale říkal, že nejlepší je jedině Tatra 613.</p> <p>já si ale myslím, že nejlepší je Lada.</p> </body> </html> 41

Jak se filtry používají - výsledek <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="content-type" content= "text/html; charset=windows-1250"> <title> Pokus s filtrem </title> </head> <body> <h1>filtr</h1> <p>na této stránce se dějí zajímavé věci s filtry.</p> <p>franta říkal, že nejlepší auto je splašený vysavač.</p> <p>pepa ale říkal, že nejlepší je jedině papalášfáro.</p> <p>já si ale myslím, že nejlepší je Žigulík.</p> </body> </html> 42

Registrace funkcí Mohu volat funkce přímo ze šablony Mohu tím nahradit uživatelskou značku Funkce přijímá parametry 43

Registrace funkcí require("setup.php"); function banner ($params, $smarty) { $cislo_banneru = rand(1,3); if (isset($params['width'])) $width = $params['width']; else $width="400"; if (isset($params['height'])) $height = $params['height']; else $height="150"; $to_return = "<img alt='banner' src='banners/banner". $cislo_banneru.".png' width='$width' height='$height' />"; return $to_return; } //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); // registruji funkci $smarty->register_function('banner', 'banner'); // zavolam view $smarty->display("smarty_register_function.html"); 44

Registrace funkcí - view <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>smarty banner</title> </head> <body> <h1>na této stránce se zobrazí náhodný banner</h1> {banner width=300, height=100} </body> </html> 45

Registrace blokových funkcí require("setup.php"); function prehazovac ($params, $content, $smarty) { $slova = split("[( )\n\t]+", trim($content)); $to_return = ""; foreach ($slova as $slovo) { if (strlen($slovo)>5) {$slovo = Texty::prehod($slovo);} $to_return.= $slovo." "; } return $to_return; } //vyrobim smarty objekt $smarty = MojeSmarty::getInstance(); // registruji funkci $smarty->register_block('prehod_pismenka', 'prehazovac'); // zavolam view $smarty->display("smarty_register_block_function.html"); 46

Registrace blokových funkcí view <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250" /> <title>smarty block function</title> </head> <body> <p> {prehod_pismenka} Mobilní operátoři si připravili na začátek nového měsíce několik zlevněných telefonů a také mnoho novinek. Zaujme především vlajková loď Samsungu pro letošní rok, model U900 Soul. Mezi novými modely ovšem nechybí ani luxusní Nokia za 30 tisíc nebo low-endy s logem LG. {/prehod_pismenka} </p> </body> </html> 47

Přiřazení <?php // inicializace smarty engine require_once("init_smarty.php"); // vyrobim si data, v tomto pripade info o datumu $datum = date ("d.m.y"); // vyrobim slozita data $pole_hodnot = array("jmeno"=>"františek", "Prijmeni"=>"Vomáčka"); // vytvor sablonu $templatovaci_objekt = new T_Template(); //prirad data do sablony Získání výsledku mailu $templatovaci_objekt->assign("datum", $datum); $templatovaci_objekt->assign_by_ref("jmeno", $pole_hodnot); // ziskej slouceny mail $text_dopisu = $templatovaci_objekt->fetch("mail.tpl"); // odesli ho mail("vomacka@post.cz", "Automaticky mail", $text_dopisu); $templatovaci_objekt->assign("dopis",$text_dopisu ); // nech to zobrazit $templatovaci_objekt->display('fetch.html');?> Výstup html

Šablony fetch.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html> <head> <title> Ukazka sestaveni dopisu </title> </head> <body> Ahoj, prave Ti byl zaslan tento mail:<br/> <pre> {$dopis} </pre> </body> </html> mail.tpl Vážený pane/paní {$jmeno.jmeno} {$jmeno.prijmeni} blablabla blablalba blablabla S pozdravem Martin Klíma

Přiřazení register object class Trida { public function metodajedna ($params, &$smarty) { echo "toto je metoda 1"; } public function metodadva($params, &$smarty) { echo "toto je metoda 1"; } } // inicializace smarty engine require_once("init_smarty.php"); // instance Tridy $objekt = new Trida(); // vytvor sablonu $templatovaci_objekt = new T_Template(); Registrace tridy a definice viditelnych metod // registruj novou funkci $templatovaci_objekt->register_object('obj', $objekt,array("metodajedna")); // nech to zobrazit $templatovaci_objekt->display('register_object.html');

Používejte Smarty, je to dobré Děkuji za pozornost, Martin Klíma