Citat:
ksrele:
function insert_in_basket($who, $what, $how_much)
{
$SQL = "INSERT INTO `basket` (`user`,`article`,`q`) VALUES ('$who', '$what', '$how_much')";
....
}
function get_articles_from_basket($who)
{
$SQL = "SELECT `article`,`q` FROM `basket` WHERE `user` = '$who')";
return $result
}
[/code]
I ajde neka mi neko objasni sta ce mi ovde klasa?
Evo probacu ja; tvoj glavni program ce na osnovu URL-a da pozove neki tzv. modul. Posto Zend i Symfony to zovu action, i ja cu. Imaj na umu da je ovo iz glave i samo primer.
Znaci, korisnik je kliknuo na link: site.com/viewBasket.html . Kontrolor pozove action (ili modul) klasu pod imenom viewBasket i metodu index()
Code:
class viewBasket extends BaseClass
{
public function index()
{
$this->assign( 'allProducts', Basket::getAll() ) ;
}
}
I to je to. Pritom tebe nimalo ne zanima kako ce to klasa Basket da uradi; da li ce izvuci iz $_SESSION-a, $_COOKIE-a ili iz baze... Nije bitno. Poenta je da jednom linijom imas sve sto ti treba sto je mnogo preglednije.
Vratimo se na pricu; kontroler je pozvao ovu metodu, metoda je uradila assign svih proizvoda i nakon toga kontroler uradi display fajla 'viewBasket/index.tpl' koji bi bio nesto poput:
Code:
{foreach from=$allProducts item=product}
Ime: {$product->getName()}
{/foreach}
Al zamisli sledecu situaciju; jednog dana hoces da ti sajt bude u vise jezika. Tada ti u tabeli products nece biti imena, vec ces koristiti neku many2many tabelu gde bi polja bila 'language_id' , 'product_id' i 'name'. Sta je poenta? Tebi ce i dalje .tpl fajlovi SVUDA da rade zato sto koristis metodu getName(). Jedino sto je potrebno jeste da izmenis tu metodu koja vise nece vracati sadrzaj kolone 'name' (jer je vise nema), vec na osnovu odabranog jezika da izvuce ime iz te many2many tabele.
Sta se desava kad korisnik hoce da doda nesto u korpu? Recimo da je link site.com/viewBasket/add/12.html . Kontroler pozove klasu viewBasket::add(12) , gde je 12 id proizvoda.
Code:
class viewBasket extends BaseClass
{
public function add($id)
{
Basket::add($id) ;
$this->assign( 'allProducts', Basket::getAll() ) ;
}
}
Opet; tebe ne zanima kako ce to metoda da uradi. Klasa Basket ce da upise u bazu, $_SESSION.... nebitno. Nadam se da me razumes sad.
Kako to konkretno ja radim? SVE klase nasledjuju klasu koja se zove BaseModel. Ona ima metodu getName() i koja izgleda ovako:
Code:
public function getName()
{
return $this->hasRelation('Language') ? $this->getTranslatedField('name') : $this->name ;
}
Metoda getTranslatedField() je malo ruznjikavo napisana pa je necu postovati dok je ne sredim. Elem; ako objekat ima relaciju sa Language klasom, znaci da je ime tog objekta u vise jezika. Tada se poziva getTranslatedField(). Ako nema relaciju, onda samo vrati sadrzaj kolone 'name'. Tako sam na samo
jednom mestu sredio visejezicku podrsku. Ako te zanima kako taj program radi u praksi, posalji mi PM i dacu ti linkove podatke za login.
Jos nesto; sta dobijas nasledjivanjem? Pogledaj ovaj
video ; ako pravilno postavis te action klase, dovoljno ti samo linija-dve da uradis prikaze forme, validaciju, obelezavanje gresaka itd. Evo kako jedna moja action klasa izgleda:
Code:
class BannerManager extends AdminManager
{
public function index($page=1)
{
$dql = Doctrine_Query::create()->from('Banner b')->orderBy('b.updated_at DESC') ;
$this->assign('allObjects', parent::setPagination($dql, $page)) ;
}
public function add()
{
$this->assign( 'object', parent::add(new Banner()) ) ;
}
public function edit($id, $page=1)
{
$this->assign('page', $page) ;
$this->assign( 'object', parent::edit(Banner::getById($id)) ) ;
}
public function delete($id)
{
$this->assign( 'object', parent::delete(Banner::getById($id)) ) ;
}
}
Ovo je deo iz administracije programa koji sad radim. SVE te action klase su skoro identicne; jedino sto umesto Banner::getById($id) imas Events::getById($id) kod izmene eventa, User::getById($id) kod izmene korisnika itd. Znaci cist copy&paste i za par minuta si dobio prikaz, izmenu i dodavanje neke nove klase/tabele. Kod izuzetno cist, pregledan i lako se upgrade-uje.
Uf.... izvini sto je zbrda-zdola napisano, nadam se da si ukapirao poentu.