Jarda Jirava

Vývojář a architekt řešení postavených na technologii .net framework. Zabývám se jak vývojem webových aplikací za pomoci asp.net, tak také desktopových aplikací winform. Při návrhu řešení a samotném vývoji pak využívám dlouholetých zkušeností se zpracováním obchodní logiky a pravidel aplikací získaných z vývoje komerčních aplikací pro finanční a bankovní instituce.

Microsoft MVP

Microsoft MVP - Client App dev

Silverlight minesweeper

Get Microsoft Silverlight

Navrhi COOL design a vyhraj zkušební let po Evropě!

Poslední příspěvky

26
IV

Zend framework - kompletace

Jak jsem minule slíbil, blížíme se do finále. Vlastně by se dalo říct, že je to takové malé finále, protože těch témat, která se dají k Zend frameworku napsat je zatím spousta a prozatím se tímto tématem mnoho lidí nezabývá.

Model View Presenter

Posledním krokem ke kompletaci naší aplikace, která aplikuje návrhový vzor Model View Presenter je vytvoření modelu. Jelikož je toto pouze úvod, model bude skutečně jednoduchý, tak abych mohl demonstrovat jeho použití. V reálné aplikaci by se dalo předpokládat, že s modelem bude zároveň vytvořena servisní nebo-li business vrstva aplikace, která se bude starat o poskytování dat pro jednotlivé akce.

Náše třídy modelu pro aplikaci budou umístěny v adresáři models, který jsme si vytvořili hned na počátku při vytváření adresářové struktury aplikace. Každá třída by měla mít svůj vlastní soubor a též pojmenování třídy a souboru by mělo být shodné. Jelikož jsme uvedli adresář models jako include_path, můžeme používat oblíbenou statickou metodu Zend_Loader::loadClass pro načtení třídy k jejímu použití.

Já jsem vytvořil pouze jednoduchou třídu s dvěmy vlastnostmi, kterou nadále použiji a naplním v Controlleru a hodnoty z této třídy - Modelu - zobrazím ve View.

class TextStore {
 public $name;
 public $description;
}

 Kompletace - dáváme vše dohromady

Nyní již máme všechny potřebné třídy vytvořeny a je postačující vše poskládat jak skládanku a jít si hrát. Do vytvořeného výchozího controlleru nazvaného IndexController tedy doplníme následující kód:

function init() {
 $this->initView();
 Zend_Loader::loadClass('TextStore');
}

 

public function indexAction() {
 $this->view->title = "jirava.net - index"
 $store = new TextStore();
 $store->name = "Zend framework a Smarty template"
 $store->description = "úvodník do MVC frameworku pro PHP vývojáře"
 $this->view->store = $store;
 $this->render();
}

Ve funkci init(), která je volána při inicializaci controlleru, doplníme volání pro inicializace proměnné view. Voláním přepsané funkce initView() tak vytvoříme instanci Smarty engine, tak jak jsem jej popsal v minulém příspěvku o view Smarty. Zároveň v inicializační metodě požádáme o nahrání potřebných tříd, které budeme používat v daném controlleru.

Poté nám již zbývá implementovat výchozí akci indexAction(). Zde naplníme proměnné pro View, které použijeme ve vytvořeném template. Abychom měli ukázku toho, jak se dá použít náš model, vytvoříme si instanci třídy TextStore, naplníme ji a přiřadíme do proměnné. Implementace naší třídy pro Smarty zařídí, že dojde k vyvolání metody assign a přiřazení názvu proměnné a její hodnoty pro použití v template. Nakonec zbývá už jen požádat o vyrenderování výsledku vyvoláním metody render().

Doplnění k View

V příspěvku o složce View a využití Smarty jako šablonovacím systému jsem opoměl na několik věci, které se mi už nechtěly doplňovat do publikovaného příspěvku a tak si na ně udělám místo nyní.

Kam umisťovat šablony

Šablony pro naše jednotlivé akce se umísťují do adresáře views aplikace. Hierarchie a pojmenování je shodná podle názvu controllerů, případně modulů. S jediným rozdílem, že i pro výchozí controller Index je nutné vytvořit podsložku se stejným názvem. Dále platí pravidlo, že pokud použijeme pouze metodu render(), bude použit stejný název šablony (souboru) jako je název právě prováděné akce. Samozřejmě je možné předanými parametry metodě render toto chování upravit a požádat o vyrenderování jiné šablony.

Pro Smarty je zároveň nutné vytvořit adresář pro zkompilovanou šablonu a v případě, že chceme používat cache, tak také pro ni. Já jsem tyto adresáře umístil taktéž do adresáře views, ale toto chování se může změnit v konstruktoru třídy JiravaNet_View_Smarty.

Zdrojové soubory

Jak jsem slíbil tak také činím, k dispozici dávám zdrojové soubory této úvodní aplikace, která má za úkol seznámit PHPčkaře se Zend frameworkem. Aplikace obsahuje kompletní kód, tak jak byl v minulých příspěvcích popsán. Zároveň je ponecháno několik neokomentovaných implementací, které se pokusím vysvětlit zase někdy příště a zbývá také spousta věcí, které čekají na vysvětlení a implementaci.

Malé upozornění: Ve třídě Zend_Db_Statement_Db2 jsem doplňoval scházející uzavírací závorku u metody fetchObject.
Povzdechnutí: není nad možnost kompilace, i když jsem předpokládal, že pro Zend by to neměl být takový problém.

Publikováno pod: zend framework
25
IV

Zend framework - view Smarty

Předchozí příspěvek na téma Zend framework se věnoval controllerům. Jednou z hlavních složek MVC patternu. Dnes se chci věnovat další složce a tou je View.

Zend View

Již minule jsem ukázal jak je možné dostat výstup z akce do návštěvníkova prohlížeče. Ale jistě sami uznáte, že to nebyl zrovna elegantní přístup. Přeci jen, použití příkazu echo v business logice by se vůbec nemělo objevovat.

Právě vrstvu prezentační logiky řeší v tomto frameworku třída Zend_View, která implementuje vlastnosti a metody z abstraktní třídy Zend_View_Abstract. Co mě však trošku překvapilo, že je to vlastně jen další php, starající se o zobrazení. Stále se musí přepínat kontext z html do php interpretu a zpět. Což působí poněkud zvláštně, ale uznávám, že to může být pouze můj dojem a phpčkarům tento přístup nevadí.

Proto jsem se poohlédl po nějakém template systému, který by byl vhodný pro prezentaci dat a přitom byl uživatelsky přívětivější. Jako jeden z nejpoužívanějších a dostatečně podporovaných je systém Smarty template, který jsem se rozhodl implementovat do mojí aplikace.

View Smarty

Jaké kroky je nutné provést, abychom mohli používat v naší aplikaci Smarty. Jako první krok je nahrání template systému do adresářové struktury aplikace. V adresáři library, ve kterém je také nahrán Zend framework vytvoříme adresář Smarty a nahrajeme do něj obsah adresáře libs z instalace Smarty. Tím máme první krok hotový.

Již v prvním příspěvku popisujícím instalaci, jsem se zmínil o třídě Zend_Loader a jejím chování. Jelikož budeme potřebovat vytvořit vlastní třídy, budou se nám tyto znalosti hodit. Vlastní třídy je dobré vytvářet v samostatném namespace (alespoň tak jsem si to pojmenoval já) tedy v terminologii Zend v novém adresáři. Já si vytvořil adresář JiravaNet v podadresáři library, kam budu umísťovat vlastní třídy. Tím jsem také určil, jaký název budou mít moje třídy, vyskytující se v aplikaci.

Při mém letmém procházení nápovědy k Zend frameworku jsem našel i vzor třídy, který implementoval potřebný interface Zend_View_Interface a zpřístupnil tak Smarty. Jelikož však tato třída obsahovala Zend namespace, přejmenoval jsem ji a umístil do vlastního adresáře. Tuto třídu jsem nazval JiravaNet_View_Smarty. (samozřejmě bylo třeba ještě vytvořit jeden podadresář s názvem View a do něj umístit soubor smarty.php s příslušnou implementací třídy.

Tím jsem si připravil možnost použití dalšího template enginu pro použití v Zend frameworku. Ještě však zbývá jeden krok, a to instancování - injection - této nové třídy do controlleru.

$this->initView()

Tak jako v asp.net doporučuji pro třídu Page vytvořit potomka a teprve pomocí něj vytvářet konkrétní stránky, stejný princip je vhodný i v případě abstraktní třídy Zend_Controller_Action. Pokud to provedeme mnou popsaným způsobem, nebudeme se muset u každého dalšího controlleru starat o opakované akce a v případě nutnosti provést změnu, tuto budeme dělat pouze na jednom místě a to s vědomím, že nebudeme muset zasahovat do tříd frameworku. 

Jednou z opakovaných akcí je právě instancování enginu pro View, v tomto případě tedy instancování naší třídy JiravaNet_View_Smarty. To provedeme pomocí přepsání metody initView() a tak naplníme public proměnnou $view, která nám bude nadále sloužit v jednotlivých akcích controlleru, tak jak ji samotní tvůrci frameworku k tomuto účelu předurčili.

Ve vyvolané akci nám už zbývá jediné, naplnění proměnných, které bude využívat naše šablona, a na závěr akce zavoláme metodu render(), jenž se postará o vyrenderování obsahu a odeslání dat na klienta. 

Tento příspěvek byl spíše teoretický a jistě si říkáte, že schází nějaký ten kód, který do toho vnese více světla. Ještě chvíli vás nechám napnuté, nebude to však již dlouho trvat, zbývá jeden den a hlavní kostra aplikace bude hotová a její zdrojové kódy dám k dispozici. Snad mi vyjde zveřejnění těchto kódů na dříve než stihne Ronnie uveřejnit svůj Hello world na intervalu (zatím jen příslib).

Opět zítra ve stejnou dobu se budu těšit.

Publikováno pod: zend framework
24
IV

Zend framework - controllers

Dalším příspěvkem pokračuje můj krátký úvod do Zend frameworku, jakožto jednoho z mnoha MVC frameworků pro PHP.

Získáním instance třídy front controlleru a požádáním o zpracování požadavku, voláním metody dispatch() naše práce nekončí a je třeba ještě několik kroků. Tím navazujícím krokem je vytvoření konkrétního controlleru zodpovědného za zpracování akcí vyvolaných uživatelem.

Formát url

Nejdříve je třeba si říci, jakým způsobem je vlastně rozhodováno, který konkrétní controller bude vybrán ke zpracování požadavku. Tento výběr je založen na formátu url. Jelikož se pohybujeme v prostředí internetu, kde je jedním z rozhodujících faktorů úspěšnost našich stránek ve vyhledávačích a hlavně také návštěvnost takových stránek, snažíme se návštěvníkům všemožně pomoci. A právě model formátu url, je jedním ze zmiňovaných plus od různých SEO a SEM odborníků (ač tomu příliš nevěřím) a Zend framework jde právě tímto směrem. Tedy směrem hezkých url, která se dobře pamatují.

Jak už jsem se zmínil v předchozím příspěvku a jistě pozornější z vás si to pamatují, pro zobrazení požadované stránky je důležitý vyběr správného konkrétního controlleru a akce, požadované od uživatele. Právě podle těchto dvou parametrů se také při výběru rozhoduje získaný front controller.

Hezký formát url pro Zend framework tedy vypadá následovně:

http://www.example.com/controller/action/

Controller je poté odvozen od názvu třídy s přesně danými pravidly a akce je metoda náležející této třídě, taktéž s definovanými pravidly. (Zjednodušeně řečeno.)

Pravidla pro controller jsou stanovena takto:

Prvním, nevím jestli říci pravidlem, je nutnost podědit vytvářenou třídu controlleru od abstraktní třídy  Zend_Controller_Action. A pokračujeme v pravidlech, název controlleru je názvem třídy doplněného o slovo Controller s tím, že tento název musí začínat velkým písmenem, tedy {ControllernameController}. Zároveň je definice této třídy zapsána ve stejně pojmenovaném souboru s koncovkou php a umístěna v adresářové struktuře, tedy ./application/controllers.

Pro akce (action) je těch pravidel přeci jen o něco méně. Akce je definována jako public metoda dané trídy controlleru, pojmenována jako název akce doplněná o slovo Action. Název akce může, ale nemusí, začínat malým písmenem.

Jistě se teď někteří začnou ptát a co v případě, že chci navigovat přímo na root mojí aplikace, jde to vůbec? Nebo co se stane, když návštěvník začne zkoušet a odmaže celý název akce. I na tyto otázky má Zend framework odpověď a já vlastně také.

IndexController a indexAction

Přesně tak, tou správnou odpovědí je controller, který je nazván jako IndexController. Tento controller by měl být tím prvním co začnete tvořit, jakmile máte nastaven Zend framework a vytvořen soubor index.php.

Zároveň pokud v jakémkoli controlleru, tedy i IndexController, nadefinujete akci s názvem indexAction bude tato zpracována jako výchozí akce. Tato akce je tedy zpracována i pokud není uvedena ve formátu url předaném návštěvníkem/samotnou aplikací - návštěvník zadá pouze název domény s naší aplikací.

Konečně nějaký výstup

Určitě už se nemůžete dočkat a říkáte si, tohle všechno je pěkné, ale kdy konečně dostanu nějaký viditelný výsledek mého snažení. Pokud tedy poruším myšlenku vzoru MVC a odhlédnu jak od Modelu tak také View, můžeme si napsat první Controller, který zobrazí text na stránce.

class IndexController extends Zend_Controller_Action {
public function indexAction() {
echo "Konečně nějaký výstup z výchozího controlleru a výchozí akce.";
}
}

 Tímto máme zajištěno, že při vyvolání naší úvodní stránky (root aplikace) se nám v prohlížeči zobrazí uvedený text.

O tom, jak do zpracování zapojit také View a Model si povíme zase příště - však už to znáte.

Publikováno pod: zend framework
23
IV

Zend framework - index.php

V minulém příspěvku jsem popsal, jak jsem instaloval Zend framework pro použití v mojí PHP aplikaci pro webovou prezentaci. Skončil jsem u vytvořené adresářové struktury a vytvořeném .htaccess souboru.

Jenom toto však nestačí, abychom si zobrazili alespoň úvodní stránku. Ještě nás čeká provést několik kroků. Prvním z nich je vytvoření souboru index.php v rootu naší aplikace, tak jak bylo naznačeno v adresářové struktuře a napsat odpovídající kód.

Bootstrap index.php

Na soubor index.php jsou směrovány veškeré požadavky, to jsme si již definovali pomocí přepisovacích pravidel a tak v tomto souboru nalezneme Front Controller naší aplikace jenž má za úkol vybrat odpovídající konkrétní controller. Tento úkol za nás řeší Zend framework, přesněji řečeno třída Zend_Controller_Front, která obsahuje potřebné vlastnosti a metody.

Ještě dříve než se dostaneme k získání instance front controlleru, musíme nastavit include path, abychom mohli instancovat potřebné třídy. Pro vytvořenou adresářovou strukturu a to následovně:

set_include_path('.' . PATH_SEPARATOR . './library'
. PATH_SEPARATOR . './application/models/'
. PATH_SEPARATOR . get_include_path());

O zbytek se již postará jediný include a to třídy Zend_Loader.

include "Zend/Loader.php";

Tato, snad mohu říci, statická třída dokáže na základě include path nahrát kód pro třídu, kterou chceme použít. Jak už jsem se zmínil výše, úkolem souboru index.php je získat instanci třídy Zend_Controller_Front. Nejdříve tedy musíme nahrát kód této třídy a následně získat její instanci.

Zend_Loader::loadClass('Zend_Controller_Front');
$frontController = Zend_Controller_Front::getInstance();
$frontController->setControllerDirectory('./application/controllers');

 Nahrání kódu třídy je provedeno voláním statické metody loadClass s uvedením jména příslušné třídy. Na dalším řádku potom získáme instanci třídy. Celkem úmyslně zde neříkám, že vytvoříme novou instanci této třídy, protože voláním statické metody getInstance() získáme instanci již existující třídy, pokud tato již existuje, to vše je řešeno podle návrhového vzoru Singleton. Posledním řádkem pak už jenom nastavíme adresář, ve kterém jsou umístěny konkrétní controllery, přesně v duchu vytvořené adresářové struktury.

Posledním krokem, který vlastně vše zařídí je volání metody dispatch() nad získanou instancí front controlleru.

$frontController->dispatch();

 Toto volání zajistí volání konkrétního controlleru (z adresáře ./application/controllers), který odpovídá předaným parametrům - definovaným pomocí url.

A co dál 

Jak má takové url vypadat a jak napsat první controller, opět zítra ve stejnou dobu.

Zend_Loader

Nyní si dovolím ještě malinké odbočení a zastavím se u třídy Zend_Loader, která má za úkol nahrát potřebnou třídu. Jelikož tuto třídu budeme nejspíše chtít velice rádi využívat i v ostatních částech naší aplikace, je dobré si ji představit hned v úvodu. Tato třída nahraje soubor s definicí třídy na základě jednoduchého pravidla. Nahlíží do adresářové struktury v include path a z těchto adresářů dokáže nahrát definice tříd. Pokud chceme využívat strukturu adresářů, máme také možnost, podobně jako můžeme vidět na adresáři Zend. Podmínkou je oddělit název třídy podtržítky, kterými jsou odděleny jednotlivé adresáře. Takže například dnes zmíněná třída Zend_Controller_Front se nachází v adresářích ./library/Zend/Controller/ a souboru Front.php.

Publikováno pod: zend framework
22
IV

Zend framework - instalace

Při zpracování prezentace pro fotoateliér fotopavlik.cz jsem musel oprášit své, již hodně zastaralé, znalosti PHP. Již od začátku jsem však věděl, že použití některého z CMS systémů by bylo příliš robustním řešením na takto jednoduchou prezentaci. Zároveň jsem však z asp.net navyklý používat výhod, které poskytuje .net framework.

Zend Framework

Občas je fajn mít v kontakt listu lidi, kteří též dokáží poradit, a tak jsem se obrátil na Vlastu o doporučení na vhodný PHP framework. Jeho odpověď byla celkem jasná. Použij Zend Framework. A tak jsem příliš dlouho neváhal a stáhl si jej ve verzi 0.9.2. A započala druhá fáze a to jeho instalace, zprovoznění a to nejdůležitější, postavení nad tímto frameworkem jednoduchou aplikaci pro prezentaci a správu stránek.

Přestože budu popisovat instalaci na Windows systému, zprovoznění je shodné na systému s některou z Linux distribucí (aspoň tak se mi to povedlo rozchodit na hostingu). Před samotnou instalací jsem již měl nainstalován Apache server a také PostrgreSQL.

Po stažení souboru ZendFramework-0.9.2-Beta.zip jsem překopíroval složku library do rootu tvořené aplikace. A vytvořil potřebnou adresářovou strukturu pro správné fungování tohoto frameworku, který je založen na návrhovém vzoru MVC (Model - View - Controller). Dále bylo třeba vytvořit soubor .htaccess a vložit do něj rewrite pravidla pro tzv. bootstrapping. Tedy tak, aby docházelo k přepisu adresy na jediný soubor a to index.php, která poté obsluhuje veškeré zpracování. Právě zde dochází k vytvoření Controlleru, konkrétně získání instance třídy Zend_Controller a zpracování požadavku.

Adresářová struktura

Kompletní adresářová struktura aplikace je potom následující:

  • root
    • application
      • controllers
      • models
      • views
    • library
      • Zend
    • public
    • .htaccess
    • index.php

.htaccess

souboru .htaccess je poměrně jednoduchý a samozřejmě je možné jej dále rozšiřovat dle vašich požadavků. Jeho obsah je:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(js|ico|gif|jpg|png|css|pdf)$ index.php

Máme nainstalováno

To je pro úvodní instalaci a nastavení Zend Frameworku vše co je potřeba. Samozřejmě proto, abychom mohli spustit úvodní stránku je potřeba ještě několik kroků a to:

  • Získání instance Zend_Controller a nastavení potřebných vlastností a předání řízení na příslušný controller
  • Vytvoření Controlleru a definování příslušných akcí, které jsou povoleny pro danou aplikaci
  • Vytvoření příslušných view pro jednotlivé akce
  • a v neposlední řadě také definování modelu, protože bez dat by naše aplikace byla jen prázdnou obálkou
  • mnoho mnoho dalšího, pokud bude zájem ...

O tom všem však zase příště (konkrétně opět zítra ve stejnou dobu).

Publikováno pod: zend framework
6
IV

fotopavlik.cz - Dokončeno

Nestává se mi příliš často, abych mohl říci, že jsem dokončil webovou prezentaci. Přeci jen jsem spíše zaměřen na oblast intranetových a desktopových aplikací.

Možná navíc leckteré lidi překvapím, neboť prezentace je postavena na technologii PHP.

www.fotopavlik.cz

Prezentace fotoateliéru Michal Pavlík vychází z původní flash prezentace, která zůstává nadále součástí prezentace. Avšak přibyla ještě i textová, nebo lépe řečeno html verze pro prezentaci tohoto příjemného a zkušeného fotografa.

Doufám, že prezentace dosavadní tvorby zaměřené na fotografie lidí, stejně tak jako např. fotografie jídla a pití nebo fotografií přírody a objektů zaujmou stejně jako úmělecká tvorba. A pokud si náhodou chcete nechat nafotit reklamu nebo interiéry vašich kanceláří, určitě se na pana Pavlíka můžete obrátit, jistě vás neodmítne.

Je mi jasné, že ne každému se daná web aplikace může líbit, a tak jestli budete mít připomínky, budu rád za konstruktivní kritiku. A třeba se najdou i tací, kteří si nechají podobnou, nebo naopak úplně jinou aplikaci, též zhotovit.

Publikováno pod: odkazy