Stručný úvod pro programátory Michal Kuchta
Alespoň základní znalost PHP Základy klasického OOP a jeho implementaci v PHP Schopnost oprostit se od konvenčního tvoření stránek 2
Framework pro snazší vývoj aplikací v PHP Abstrakce databáze Programový přístup k tvorbě webové aplikace Ověřování uživatelů SEO-friendly URL 3
PHP 5.2 a novější MySQL 5 a novější Apache s podporou mod_rewrite (nebo kompatibilní) (XAMPP?) 4
$ svn co http://svn.gcm.cz/nixfw/ $ cd nixfw $ rm r.svn apps/.svn $ svn co <url aplikace>. $ vim.htaccess Přepsat RewriteBase na root aplikace $ cp apps/site-specific.config.php.dist apps/sitespecific.config.php Vytvořit MySQL databázi a naimportovat do ní soubor scripts/db/database.sql $ vim apps/site-specific.config.php BasePath stejná hodnota jako pro RewriteBase (bez koncového /) Nastavení připojení k MySQL 5
/ - adresář přístupný z webu, libovolný podadresář lze z webu odkazovat /scripts/ - NixFW, obvykle není nutno zasahovat pro vývoj aplikace /apps/ - dostupné moduly (aplikace) Pokud je aplikace samostatná (má vlastní SubWeb), je třeba ji navázat na globální routování. /apps/config.php globální konfigurace /apps/site-specific.config.php konfigurace specifická pro jeden konkrétní server necommituje se do SVN! 6
Modul (aplikace) umístěna v podadresáři adresáře /apps/. Může obsahovat následující podadresáře: templates/ - šablony pro tuto aplikaci templates/design.php výchozí šablona obsahující celou strukturu webu (<html><body> </body></html>). Na patřičném místě <?php include find_template($template);?> pro vložení obsahové části classes/ - třídy modely, controllery, collections, formuláře, Je dobrým zvykem rozdělovat třídy podle jejich typu do dalších podadresářů locale/ - lokalizace pro tuto aplikaci 7
Nová aplikace založit adresář v apps/ Vytvořit podadresářovou strukturu (classes, templates) Začít tvořit controllery (v classes/controllers), navázat je správně na routing (lze použít autorouting) v config.php Vytvořit modely pro data (v classes/models) Vytvořit šablony v adresáři templates Formuláře v classes/forms 8
Způsob vývoje aplikací, kdy jsou data oddělena od jejich řízení a výsledné reprezentace uživateli Model reprezentuje data View frontend prezentace dat uživateli Controller provádí operace s modely a připravuje data pro View. 9
Model reprezentace jedné datové entity (článek, kategorie, ), třída DbRow Collection kolekce, sdružuje datové entity jednoho typu (pole DbRow), třída Collection Controller provádí akce s modely a kolekcemi (spojuje backend a frontend), třída Page, View šablona obsahuje HTML+PHP zobrazující data 10
Potomci třídy DbRow class Article extends DbRow { } DbTree stromová struktura v databázi class DbTree extends DbRow; class ContentTree extends DbTree { } Automatická konfigurace Podle názvu třídy se pokusí získat seznam sloupců z databáze a automaticky se tak nastavit Pokud to selže, ruční konfigurace pomocí properties objektu 11
Získávání hodnot z databáze Konstruktor $article = new Article(10); Pozor na typy musí být int!! throws SQLNoResultException Modifikace hodnot $article->name = Testovací článek ; Uložení hodnot $article->save($commit = true); podpora transakcí automatický commit, ale jde zakázat, viz parametr metody Save(). 12
class Collection construct($objectname) kolekce objektů typu objectname musí být potomci DbRow. Nebo automatická detekce typu podle názvu kolekce $c = new ArticlesCollection() === $c = new Collection( Article ); $c->setorder($column, $direction) $c->setlimit($from, $count) $c->setcondition($column, $match, $value) 13
Iterace: foreach ($c as $article) { echo $article->name; } Stránkování: class Paging $paging = new Paging($collection); O vše se postará, v šabloně je pak pouze třeba zobrazit stránkovací tlačítka 14
Obecně potomek třídy RequestProcessor. Potomci třídy Page vizuální reprezentace dat Potomci třídy ActionProcessor akce, jejímž výsledkem není HTML stránka, ale jen nějaká akce v backendu (ActionLogin, ) Metody v controlleru jednotlivé stránky function index() { $this->display( articles/index.php ); } 15
$this->set($varname, $value) nastavení hodnoty proměnné dostupné v šabloně $this->redirect($path) přesměrování místo zobrazení stránky Automatický rendering Název šablony podle názvu metody a názvu controlleru Articles::View() => articles/view.php Messages::Add( Text, Message::Success); - zprávy o stavu pro uživatele Message::Success, Message::Information, Message::Warning, Message::Error 16
Šablony, ze kterých se sestavuje výsledná podoba dat pro uživatele. Nepoužívá se žádný šablonový systém pouze čisté PHP Spouštěné v kontextu controlleru, jsou k dispozici všechny funkce a properties controlleru. Lokální proměnné nastavené voláním funkce Set() v controlleru. 17
Převod URL na správné volání metody ve třídě Autorouting URL začíná /, parametry (:controller, :action, ) Např.: Vzor: /:controller/:action/* URL: /articles/view/10 Provede kód: $c = new ArticlesPage; $c->view(10); 18
Globání konfigurace v apps/config.php, proměnná $web_config. Třída SubWeb hierarchie routování (má vlastní web_config). $web_config[$url_vzor] = $akce $url_vzor autorouting rule nebo regexp $akce název třídy nebo pole obsahující výchozí hodnoty parametrů (controller, action, ) 19
Usnadnění a zpřehlednění šablon class HTMLHelper extends Helper { } Automaticky dostupní v šablonách (HTMLHelper jako $html, NumberHelper jako $number, ) $html->url() zpětné generování URL podle nastavení $web_config. echo $html->url(array( controller => articles, action => view, 10)); 20
Třída User reprezentace jednoho uživatele $user->haspriv( název práva ) true/false singleton class CurrentUser aktuálně přihlášený uživatel CurrentUser::isLoggedIn() CurrentUser::i() class User Skupiny uživatelů dědění oprávnění Anonymní < Přihlášení < Skupina < Uživatel 21
Uživatel může být ve více skupinách Pokud alespoň jedna ze skupin má právo, uživatel má právo. Nelze říct: Členové skupiny Administrators mohou vše Avšak administrátoři, kteří jsou zároveň členy skupiny BannedUsers nemohou editovat články. V takovémto případě se musí editace článků zakázat každému uživateli zvlášť. 22
Permanentní vlastnosti uživatele $user->getprop($name); $user->setprop($name, $value); 23
Uložení hodnot platných pro jednu uživatelskou návštěvu stránky Session::Get($name); Session::Set($name, $value); 24
Podpora lokalizace statických textů t($string, [$quantity]) z aktuálně platné domény - set_domain($domain) d($domain, $string, [$quantity]) z explicitně určené domény s($string, [$quantity]) hledá překlad ve všech doménách Umístění v locale/<kód>/<domain>.php Definice jazyka v locale/<kód>.php 25
Formuláře se programují podobně jako GUI v C#, Javě, Pythonu, class ArticleAddForm extends Form { } Metoda CreateControls() vytvoření formulářových políček $this->insertcontrol(new TextInput( Název, name, výchozí hodnota )); Metoda Initialized() $this->name = Přidat článek ; $this->submitvalue = Přidat ; $this->callback = AddArticle ; 26
Callback metoda (AddArticle) function AddArticle() { $article = new Article(); $article->name = $this->getcontrol( name )->value; $article->save(); Messages::Add( Článek byl úspěšně vytvořen., Message::Information); } Pokud callback metoda není specifikována, zavolá se zpět controller s nastavenou proměnnou $this->form. Použití ve view: $a = new ArticleAddForm(); $a->show(); $a->free(); 27
Otázky? Jabber, email: niximor@gmail.com ICQ: 61766147 Doxygen: http://home.gcm.cz:10080/nixfw_doc/ + Cheatsheet 28