Evo praktican primer oop na primeru db layera.
Sve sto ubacujes u bazu i vadis iz nje od sad koristis kao objekat, iniciras ga recimo ovako:
Code:
class Menu extends Object {
function Menu () {
global $db;
$this->db = $db;
$this->tableName = TABLE_EXT . "menu";
$this->ids = array("menu_id");
$this->initProperty('menu_id', new IntType());
$foreignKeyObj = new ForeignKey('MenuCategories', 'cat_name');
$foreignKeyObj->setAttributes(array("onchange"=>"getSelectBoxElements(this)"));
$foreignKeyObj->setDefaultSelectedValueId(getGET('fk_category_id'));
$this->initProperty('fk_category_id', $foreignKeyObj);
$this->initProperty('base_name', new TextField());
$parentObj = new InternalKey('Menu', 'base_name');
$this->initProperty('parent_id', $parentObj);
$this->initProperty('url', new UrlType());
$this->initProperty('is_active', new CheckBox());
$this->initProperty('ordering', new IntType());
$imgObj = new ImgFile('image_file');
$imgObj->setUploadDir(UPLOAD_DIR . "menus/");
$imgObj->setUploadUrl(UPLOAD_URL . "menus/");
$imgObj->makeThumb = false;
$imgObj->resizeImage = true;
$imgObj->imageHeight = 50;
$imgObj->imageWidth = 50;
// $imgObj->thumbHeight = 0;
// $imgObj->thumbWidth = 0;
$this->initProperty('image_file', $imgObj);
}
}
I sad, svaki tip propertija ima svoje atribute i svojstva (sta vise, svaki property je sam objekat) Ovo je copy-paste, cisto za ideju, da ne objasnjavam sta svaki radi ponaosob (ako te interesuje, pisi).
Cela draz svega toga je upotreba objekta.
Kad pravis novi objekat (instancu objekta) setujes mu vrednosti ovako:
$menusObj = new Menu();
$menusObj->setProperties($_POST); //setuje sve vrednosti koje objekt poseduje, a nalaze se u postu ili bilo kom nizu (veoooma korisno kod velikih formi)
$menusObj->setProperty('is_active', getPOST('is_active', 0)); ///setuje pojedinacni property
i onda snimanje u bazu izgleda ovako:
$menusTransObj->store();
Kad ga editujes, izgleda prilicno isto:
$menusObj = new Menu();
$menusObj->get($menuId); //iz baze se izvade vec njegove sve vrednosti, tj uradi se select where id = $menuId
$menusObj->setProperties($_POST); //setuje sve vrednosti koje objekt poseduje, a nalaze se u postu
$menusObj->setProperty('is_active', getPOST('is_active', 0)); ///setuje pojedinacni property
i onda snimanje u bazu izgleda opet ovako:
$menusTransObj->store();
Objekat zna da li je iniciran "na prazno" tj da li je upravo kriran ili je get()-om izvucen iz baze pa prema tome bira koji ce sql da koristi.
Brisanje objekta izgleda ovako:
$menusObj->get($menuId);
$menusObj->delete();
Prednost je recimo sto ce se svaki property pobrinuti oko brisanja sopstvenih elemenata ukoliko su dodatni (brisanje sopstvenih slika i fajlova recimo)
kad ti treba neki property objekta, to je
$vrednost = $menusObj->getProperty('is_active');
Sve ove metode se same brinu oko toga da li su required, kog su tipa, kako se validiraju, kako se obradjuju pri unosu i pri citanju iz baze itd.
Crtanje forme za editovanje i kreiranje moze da izgleda ovako:
$smarty->assign('formElements', $menusObj->drawFormElements());
Gde ce svaki property u zavsnosti od sopstvenog tipa vratiti odgovarajuci element u formi.
Postoji i opcija za pretragu, pravljenjem kriterija objekta, na slicnu foru.
Paginacija se uz pomoc ovakvu unapred poznatu strukturu i metode objekta pravi recimo:
$pagin = new Pagin();
$itemsObj = $pagin->createPagin($itemsObj, $criteria, 'user_per_page', $config['products_per_page']);
i paginacija ce sama da pozove metode getObjects, kao i countObjects na osnovu $criteria objekta koji sadrzi pravila za formiranje sql upita i da kreira sve potrebne parametre. Ako treba nesto posebno da joj se setuje, dopise se nova metoda.
I sad najbolji deo: ovaj kod je potpuno identican (osim naravno kreiranja samog objekta) za bilokoj tip podataka koje skladistis u bazi. Useri, Proizvodi, kategorije, oglasi, vesti, baneri, galerije, sta god ide i cita se iz baze (cak i ne mora iz baze, prosiris metodom koja ti treba). Ako pak neki entitet u bazi ima poseban zahtev za recimo Store metodom, samo je napises u nasledjenoj klasi.
Posle nekog vremena upotrebe, sky is the limit ;)
Da ne spominjem ustedu vremena u pisanju 20-30 linija koda za kompletnu administraciju celog dela sajta sa svim procedurama unosa/editovanja/brisanja...
Kasnije samo uzmes kopiras ceo admin fajl, i samo find-replace Menu with User.
Credits kolegama Bati i Malisi koji su inicirali i podelili ideje, sad dal je ovo neki standard, ne znam.