PHP tutoriál pro začátečníky (3)

MyEgo.cz

home foto blogy mywindows.cz kontakt

PHP tutoriál pro začátečníky (3)

Počítače 06.10.10

Připravení HTML kódu

Úvod

Šablonovací systém Smarty používá jako šablony html soubory s příponou .tpl (i když jako příponu klidně můžete používat klidně .html). Před zpracováním libovolné šablony je potřeba Smarty přiřadit proměnné, se kterými se bude pracovat, v našem případě se jedná o proměnou DB_RESULTS, kterou níže v php přiřadíme pomocí $smarty->assign().

Protože Smarty používá pro označování svých tagů tyto závorky {}, je možné, že bude docházet ke kolizím například s CSS kódem, který tyto závorky využívá také. Proto je CSS kód ukryt do tagu {literal}{/litaral}
Dalším objektem Smarty je už samotná iterace, používá se klasický tag {foreach}, který s pole DB_RESULTS projede veškeré řádky a přiřadí je do objektu {$row_obj}, který obsahuje proměnné "id" a "name". O přirazení proměnných do objektu se postará databázový layer EzSQL.

Kód

  1. Vytvořte si podadresář [html]
  2. V něm vytvořte nový soubor index.tpl s tímto obsahem
<html>
<meta http-equiv="refresh" content="30">
<style>{literal}
thead {
background-color: yellow;
font-weight: bold;
}
{/literal}</style>
<table>
<thead>
<tr>
<td>id</td>
<td>Name</td>
</tr>
</thead>
<tbody>
{foreach from=$DB_RESULTS item="row_obj"}
<tr>
<td>{$row_obj->id}</td>
<td>{$row_obj->name}</td>
</tr>
{/foreach}
</tbody>
</table>
<html>
Komentář

Jak vidíte jedná se o úplně klasický HTML kód s pár vloženými příkazy určenými pro šablonovací systém.

Připravení PHP kódu

<?php
error_reporting(E_ALL ^ E_NOTICE);
include_once "libs/ez_sql/ez_sql_core.php";
include_once "libs/ez_sql/ez_sql_mysql.php";
include_once "libs/smarty/Smarty.class.php";
$db = new ezSQL_mysql('root','','Test','127.0.0.1');
$results = $db->get_results("SELECT * FROM `Colors`");
$Smarty=new Smarty;
$Smarty->assign('DB_RESULTS', $results);
$Smarty->display('../html/index.tpl');
?>
Komentář

Povšimněte si, že PHP kód se nestará o samostatné zobrazení, to řeší knihovna Smarty. Na kódu je jasně vidět, že knihovně Smarty se předává především jméno šablony (v našem případě index.tpl) a proměnná (v našem případě $results). Výhodou použití databázové abstrakce EzSQL budiš „nasosání" objektu přímo z databáze, takže Smarty pak může volat jednotlivé sloupce prostě použitím hodnoty {$row_obj->name}.

Závěr

Problém PHP aplikací

Velkým problémem u PHP aplikací není často vývoj nové aplikace, ale úprava té stávající. Jak si v dalších dílech ukážeme, kombinace EzSQL + Smarty nám nabízí možnost vybudování si extrémně přehledné aplikace, jejíž návrh jde od HTML kódu k PHP kódu.

V tomhle je pro většinu největší problém pochopit šablonovací systém Smarty, který se snaží vývoj posunout tím směrem, abyste u hotové aplikace jednoduše prohlédli v prohlížeči výsledný HTML kód a k němu našli zdrojový PHP kód.

Viděl jsem již spoustu aplikací, které je téměř nemožné udržovat několik let tak, aby se v jejich kódu vůbec někdo vyznal. Často po několika letech vývoje aplikace v PHP dojdete k závěru, že je potřeba jí celou přepsat od začátku. Pokuď ovšem začnate s abstraktními vrstvami, jak pro databáze, tak pro šablony, tak byste k tomuto závěru neměli dojít nikdy. Moje osobní zkušenost je, že takto vyvinuté aplikace úspěšně fungují pět a více let, a nikdo je zatím nepřepisoval.

Mým cílem je naučit čtenáře psát profesionální aplikace, které i po letech půjdou upravovat jak lusknutím prstu. No uvidíme, zda-li se mi to podaří.

Výsledný kód je ke stažení zde - zdrojak.zip Podívejte se dále na obrázek jEditu, který edituje dva sobory zároveň (moje oblíbené okno), kdy vidíte zároveň šablonu i editovaný soubor.

TotalCommander
jEdit

O autorovi

Autor píše blog markoniuss.blogspot.com, kde se o něm můžete dozvědět veškeré informace


Komentáře

  1. 1 Václav Macůrek 08.10.10, 11:10:25
    FB

    ezSQL neznám - a Smarty mne zklamal složitostí. Místo něj jsem používal (než jsem si napsal svůj vlastní šablonovací systém) TemplatePower.

  2. 2 lopikol 10.10.10, 10:10:19
    FB

    Děkuji za tutoriál. Docela se mi hodí, ale mám problém. Potřeboval bych poradit s dotazem, kde budu brát data z tabulky kategorie a z tabulky clanky. kategorie chi brát id, seo, jmeno a zobrazeno. Z clanku kategorie a zobrazeno. poté tam msuí být u obou where zobrazeno=ano. A ještě bych potřeboval do sql dotazu dodat count(kategorie). Když to sepíšu, tak potřebuji spojit tyto dva dotazy do jednoho:

    "SELECT * FROM kategorie WHERE zobrazeno = 'ano' ORDER BY id" a "SELECT COUNT(kategorie) FROM clanky WHERE kategorie = $vysledek1[id] AND publikovat = 'ano' "

    $vysledek1[id] je id z tabulky kategorie.

  3. 3 Petr Novotný 10.10.10, 10:10:57
    FB

    [2] Doporučuji pročíst si dokumentaci k "LEFT JOIN", to by mělo vyřešit to vaše spojení dvou dotazů.

  4. 4 lopikol 10.10.10, 02:10:30
    FB

    [3] Děkuji za radu, koukal jsem na to, ale mám problém. Je mi jasné, že se to takto blbě řeší. Mám tento kod **"SELECT * FROM kategorie K LEFT JOIN (SELECT kategorie, COUNT(kategorie) AS soucet FROM clanky WHERE publikovat = 'ano') C ON C.kategorie = K.id WHERE K.zobrazeno = 'ano'"** vypíše to vše jak má až na ten součet. nepíše ho ke každé kategorii. Bphužel nevim jak to opravit. Problém bude nejspíš v **ON C.kategorie = K.id**

  5. 5 Václav Macůrek 13.10.10, 11:10:07
    FB

    Drobný dodatek k Smarty: kromě svého vlastního adresáře potřebuje ještě několik dalších - přesněji 4 - s samotnými šablonami, s kompilacemi šablon, s cachem a s konfiguračními soubory. Ty všechny je nutné vytvořit a poté nastavit pomocí konfiguračních metod. A přesně to je věc, proč mne Smarty zklamal složitostí - a proč jsem používal raději TemplatePower - který nepotřebuje více než jen svůj vlastní adresář s všeho všudy pěti soubory (z toho jeden je text licence - a další je soubor s příkladem na jednu z možností).

  6. 6 Petr Novotný 14.10.10, 06:10:25
    FB

    [5] Já uznávám, že Smarty je zpočátku těžší na pochopení, ale zase tak složité není a funkčnost, podpora je pro Smarty vynikající. Je potřeba se na produkt také dívat tak, kdo jej za 1 rok bude podporovat, a vývoj Smarty už běží roky.

    Krom toho, tebou zmiňované nevýhody, jako pár adresářů navíc, to opravdu není něco, čím bych chtěl šablonovací systémy porovnávat. Psal jsem pod Smarty pár větších projektů, a věř mi, že tenhle šablonovací systém si všichni pochvalovali i po letech používání.

  7. 7 Petr Novotný 14.10.10, 06:10:38
    FB

    [5] Projdi si třeba http://www.marys.cz, ten jsem navrhl na Smarty, je to web v 7 jazycích a neskutečně komplexní, když si to trošku projdeš, uvidíš tu komplexnost. Tady už neřešíš nějakou instalaci jednoho adresáře navíc, ale údržbu něčeho obrovského.

    A programátor, kterému jsem tu práci zadával taky při Smarty prskal, ale po půl roce si je pochvaloval, ono jde jenom o to si to trošku nastudovat a pochopit.

    Nebo celé http://www.europemc.cz/, tam mají hromadu projektů, i docela velkých a vše je také založeno na Smarty. Nebavím se tady o nějakých zkrachovalých projektech, ale o věcech co jsem navrhnul před přibližně 6-7 lety a fungují do dnes. Do dnes do toho firmy strkají peníze. Takových projektů je málo, většina firem platformy vymění za pár let, nebo to celé přeprogramují.

    Já se považuji více za architekta než programátora. Architekturu těch projektů jsem řešil já, programoval to někdo jiný.

Nový komentář