Mislio sam otvoriti novu temu, al' bih dobio po prstima od moderatora za "dupliranje" tema :)
Elem. Pre neki dan sam odlucio da pokusam da savladam Zend FW po cetvrti (4.) put. Vala, sad cu da istrajem :) Em mi dojadilo da stalno krecem 'skoro-pa-od-nule', em sam od poslednjeg pokusaja doooosta naucio o OOP (and still learnin'), tako da mi je vec lakse :)
Zasto Zendov FW? Ucinilo mi se najlogicnije da koristim FW koju je napisala firma koja je puno doprinela razvoju jezika. Meni dovoljan razlog.
Ne zelim da pametujem, samo da napisem/podelim svoja iskustva sa ovim FWom. Ako neko radi (a valjda radi) snjim, ili ako neko 'oce da krene da radi, nek' se pridruzi :) Ja i dalje ucim da ga koristim, tek sam pre koji dan krenuo da gledam, ceprkam. Zamisao mi je da kako nesto novo 'provalim', postujem ovde.
Za pocetak, 'teorija'. Bez ovoga je tesko shvatiti rad FWa. Bilo bi lepo kada bi svi procitali, pocetnici da lakse shvate nacin rada, a oni koji ga vec koriste, da isprave moje eventualne nenamerne greske :)
Do sada sam primetio, da je ZFW zahtevan samo po nekoliko stvari:
1.
Struktura file-ova
Otprilike ovakvu strukturu voli:
Code:
/
|--library/
| |--Zend/
|--application/
| |--config/
| |--config.ini
| |--file.xml
| |--controllers/
| |--IndexController.php
| |--FooController.php
| |--models/
| |--views/
| |--scripts/
| |--index/
| |--index.phtml
| |--dummy.phtml
| |--foo/
| |--index.phtml
| |--bar.phtml
|--public/
|----css/
|----images/
|----.htaccess
|----index.php
Ovo je neka osnovna varijanta.
E sad. DocumentRoot servera treba postaviti da pokazuje na
public, tj. kada se recimo ukuca
http://localhost/ onda da izbacuje sadrzaj direktorijuma public. Tako se preko browsera ne moze doci do samih skripti, sto povecava sigurnost.
index.php unutar public direktorijuma se naziva bootstrap file. O njemu ce vise biti kasnije (i .htaccess cu onda da objasnim).
/library/Zend/ sadrzi sve one klase i skripte koje su ljudi iz zenda napisali. To je sam core FWa.
U
application direktorijum, idu skripte i klase vezane za samu aplikaciju. Nakon sto je napravljen bootstrap file, programiranje aplikacije ce se svesti na pisanje fileova unutar application direktorijuma.
U config direktorijum mogu da se stavljaju razni konfiguracioni fileovi, za pristup bazi podataka i slicni. Nema veze sto se nalazi u recimo .ini fileu, korisnik preko browsera ne moze da stigne do tog filea (ako je DocumentRoot podesen kako treba), a ako neko, recimo provali na sam server, onda je vec totalno svejedno da li su podaci u .php ili .ini fileu.
U controllers direktorijum idu klase kontrolera za aplikaciju. U models idu modeli, a u views idu fileovi koji sluze za prikaz, neka vrsta template fileova.
Japan je u nekom od prethodnih postova napisao za sta sluzi koji deo: kontroler odlucuje sta se radi sa kojim podacima. Recimo ako je neki podatak dosao kontroleru od korisnika,
od view skripta, da li ga upisati u bazu, file, naci nesto u bazi na osnovu tog podatka... ili ako je stigao
od modela neki podatak, kontroler odlucuje da li ce da prikaze korisniku taj podatak u view fileu, da ga posalje nekom drugom modelu na dalju obradu... Kazem, i ja jos ucim, tako da nisam bas svestan svih mogucnosti MVC pristupa (verujem da su mogucnosti ogromne).
Dalje, svaki kontroler ima svoje
akcije. Recimo, postoji kontroler user. Unutar user kontrolera postoje akcije: showLoginForm, loginUser, logoutUser, registerNewUser, resetUserPassword, changePersonalInfo (ovo je samo primer, moze se i drugacije srediti...) Znaci, kontroler user se bavi akcijama korisnika, kao sto su login i logout. Malo je konfuzno. Sta sad. Ako neko zna ovo lakse i lepse da objasni, do it bre :) Ili recimo, imamo kontroler text, koji ima akcije writeNewText, updateText, deleteText, previewText, archiveText... Tako nekako :)
2.
Imena fileova, klasa, kontrolera, akcija
Ovo je mozda cak i vaznije od same strukture fileova.
Skripte unutar controllers direktorijuma, moraju da se pridrzavaju sledeceg:
Skripta nosi naziv kontrolera sa velikim pocetnim slovom, i sa reci Controller, extenzija .php. Primer: IndexController.php, UserController.php, FooController.php...
Unutar skripte za kontrolere definise se sama klasa kontrolera, sa pripadajucim akcijama. I tu ima pravila kojih se moramo pridrzavati:
Naziv klase je
isti kao i naziv skripte, samo sto izostavljamo extenziju .php. Znaci, ako je skripta IndexController.php, znamo da je unutar njega definisana klasa IndexController, ako je skripta FooController.php unutra je klasa FooController.
Akcije jednog kontrolera moraju da se pridrzavaju sledeceg: ime akcije sa malim pocetnim slovom iza kojeg sledi rec Action. Primer: indexAction, loginAction, logoutAction, barAction...
Unutar
/views/scripts/ direktorijuma pravila su sledeca:
Svaki definisan kontroler, mora imati svoj direktorijum unutar /views/scripts/ direktorijuma. Naziv direktorijuma mora da se slaze sa nazivom kontrolera, osim sto je prvo slovo malo. Unutar svakog direktorijuma kontrolera, mora postojati
.phtml file, za svaku akciju tog kontrolera. Ako neka od akcija nema svoj phtml file, javljace gresku. Cak iako je taj file prazan, mora da postoji. .phtml file mora da ima isti naziv kao i akcija na koju se odnosi (bez kljucne reci Action).
Dalje, bitno je da svaka aplikacija
MORA imati skriptu
IndexController.php, u controllers direktorijumu, unutar koje je definisana klasa
IndexController, a unutar koje je definisan najmanje
indexAction; najmanje, mora postojati index.phtml file unutar /views/scripts/index/ direktorijuma. To jednostavno mora; ako nesto od ovoga nedostaje, FW ce javljati gresku.
Svaki definisan kontroler, bez obzira kako se zove i cim se bavi, mora da ima definisan minimum indexAction, a ovaj da ima svoj index.phtml file.
Da prikazem taj 'minimum' zahteva:
Code:
File path and name: /application/controllers/IndexController.php
<?php
require_once("Zend/Controller/Action.php");
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
}
Namerno nisam zatvorio sa
?> ovaj PHP file. Zend sam zatvara svaki PHP skript.
Code:
File path and name: /application/views/scripts/index/index.phtml
<!-- Sadrzaj file-a ide od ove linije prema dole. Ovaj komentar je sad tu samo zbog ovog primera. -->
Ovo je obican html file, koji moze da ima u sebi i delove PHP koda. Vise o ovome kasnije.
Prikazacu jos koji primer:
Code:
File path and name: /application/controllers/FooController.php
<?php
require_once("Zend/Controller/Action.php");
class FooController extends Zend_Controller_Action
{
public function indexAction()
{
}
public function barAction()
{
}
public function dummyAction()
{
}
I pripadajuci .phtml fileovi (bez sadrzaja, samo putanje):
Code:
File path and name: /applications/views/scripts/foo/index.phtml
File path and name: /applications/views/scripts/foo/bar.phtml
File path and name: /applications/views/scripts/foo/dummy.phtml
You feel it? Ne bas, a? :)
Jos malo o ponasanju ZFWa. Kada ukucate u browser recimo:
http://localhost/ desava se sledece: ZFW poziva IndexController i indexAction unutar njega.
Radi na sledecem principu:
http://localhost/kontroler/akc...t_parametri=123&itd=qwerty
ZFW, uz pomoc bootstrap filea i .htaccessa, gleda koji je kontroler i koja je akcija u pitanju, i na osnovu toga radi ono sto je unutar kontrolera/akcije odredjeno. Ukoliko nije dat naziv akcije ili naziv kontrolera, onda se poziva indexAction, odnosno indexController.
Primer: imamo FooController.php, sa klasom FooController, koja ima akcije indexAction i barAction.
Ukoliko pozovemo samo
http://localhost/ dobijamo IndexController, indexAction, /views/scripts/index/index.phtml
Ukoliko pozovemo
http://localhost/foo/ dobijamo FooController, indexAction, /views/scripts/foo/index.phtml
Ukoliko pozovemo
http://localhost/foo/bar/ dobijamo FooController, barAction /views/scripts/foo/bar.phtml
Ukoliko pozovemo neku levu, nepostojecu akciju ili kontroler, ZFW ce izbaciti gresku (ukoliko je postavljeno da prikazuje greske, ako nije, dace belu stranu). Mada, najverovatnije, moze i da se podesi da izbaci neki odredjeni, postojeci kontroler i akciju, samo jos dotle ni ja nisam stigao :-/
E, sad jos samo bootstrap file i .htaccess, pa odo da spavam :)
Bootstrap file, iliti, index.php file u /public/ direktorijumu, sluzi da se postavi osnovno okruzenje za ZFW, da mu kazemo gde se sta nalazi i da pokrenemo sam FW.
Ovako izgleda moj jedan bootstrap file:
Code:
<?php
/**
* This is the general styling.
* application/controllers/IndexController.php -> class IndexController with it's public functions-actions (indexAction is a must!)
* application/controllers/FooController.php -> class FooController with it's public functions-actions (indexAction is a must!)
* views/scripts/index/index.phtml -> for IndexController, indexAction
* views/scripts/foo/bar.phtml -> for FooController, barAction
*
* Every action must have it's corresponding view file (.phtml)
* IE: FooController with barAction() has views/scripts/foo/bar.phtml
*
* To assign a variable from class FooController to bar.phtml use this in barAction():
* $this->view->variableName
* And then in the bar.phtml use this to echo it (or do something else with it...)
* echo $this->variableName;
*
*/
// Display any errors that may occur, this is recomended only for production versions...
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors',1); // set this to 0 on live version
// Set the default timezone (perhaps, it's needed just when You start to work with dates... Dunno if it's used anywhere else... )
date_default_timezone_set("Europe/Belgrade");
// Set the include paths, so ZFW knows where to look, and we don't need to bother with the path/to/file/ part...)
set_include_path('.' . PATH_SEPARATOR . '../library' .
PATH_SEPARATOR . '../application/models' .
PATH_SEPARATOR . get_include_path());
// Loader is used to load stuff automatically. For more info refer to the manual, chapter 22...
include("Zend/Loader.php");
// Yet again, look at the manual...
Zend_Loader::registerAutoload(); // It auto loads a class when it is called
// Load a config from an .ini file, more info in the manual, chapter 5...
// This is loading a configuration for a database connection...
$config = new Zend_Config_Ini('../application/config/db_config.ini', 'offline');
// Load a config to the registry, more info in the manual, chapter 31
$registry = Zend_Registry::getInstance();
$registry->set('config',$config);
/**
* Zend_Controller_Front's purpose is to initialize the request environment, route the incoming request, and then dispatch any discovered actions;
* it aggregates any responses and returns them when the process is complete.
*/
// More info in the manual, chapter 7...
$frontcontroller = Zend_Controller_Front::getInstance();
$frontcontroller->throwExceptions(true);
// Where can ZFW find the controllers?
$frontcontroller->setControllerDirectory('../application/controllers');
$frontcontroller->dispatch(); // Start...
Kolko pise u komentarima, tolko znam ja o ovome :) Najverovatnije, kako budem napredovao, tako ce se i ovaj bootstrap file siriti. Videcemo.
I jos za kraj .htaccess:
Code:
# Rewrite rules for Zend Framework
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php
# Security: Don't allow browsing of directories
Options -Indexes
# PHP settings
php_flag magic_quotes_gpc off
php_flag register_globals off
php_flag short_open_tag on
Uglavnom, svrha ovoga je: bilo sta da ukuca u browser korisnik, apache ga redirektuje na index.php (bootstrap), odakle ga ZFW salje na odgovarajuce mesto...
Tolko za ovu 'turu'... Pokusao sam da idem nekim logicnim (barem za mene) putem, i nadam se da nesto nisam izostavio. Na osnovu ovoga bi trebalo da uspete napraviti makar onu najjednostavniju, 'defaultnu', aplikaciju.
E, da. Zend mozete skinuti odavde:
http://framework.zend.com/download - tamo je i manual. Ja idem po ovoj najnovijoj 1.5.2 verziji.
cheers!
P.S.: Ukoliko budem bio editovao ovaj post, jasno cu naznaciti kada i gde sam editovao.