0%
0%

Kaj je CakePHP ? CakePHP je PHP framework ki uporablja MVC arhitekturo. MVC je Model Controller View. Kaj to pomeni. To pomeni da imamo strukturo strani ločeno po Model-ih View-ih in Controller-jih.

Kaj vse omogoča ta zadeva sem kar skopiral iz njihove strani …

  1. /*
  2. * Model, View, Controller Architecture
  3. * View Helpers for AJAX, Javascript, HTML Forms and more
  4. * Built-in Validation
  5. * Application Scaffolding
  6. * Application and CRUD code generation via Bake
  7. * Access Control Lists
  8. * Data Sanitization
  9. * Security, Session, and Request Handling Components
  10. * Flexible View Caching
  11. * And More...
  12. */

Struktura CakePHP frameworka:

/app
../models -> Z modeli ločimo template od engina strani.
../controlers -> Kontrolerji nam pomagajo pri upravljanju neke sekcije na strani (blog, galerija,…)
../views -> Templati za stran, modele, itd.
../plugins -> Plugini so dodatki za CakePHP framework. Recimo naredite neko aplikacijo in jo potem date kot plugin. Plugin je ubistvu celoten site. Recimo Blog plugin ipd. Plugini imajo isto sturkturo kot tu ki jo sedaj opisujem. Primer: /app/plugins/ime_plugina/controllers …
../vendors -> Mapa kamor damo knjižnice ki niso od CakePHP frameworka. PEAR, PHPMailer,…

Za začetek naredite naslednje. V ‘app/config/routes.php’ zamenjajte vrstico:

  1. Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));

z
  1. Router::connect('/', array('controller' => 'index', 'action' => 'index'));

in pa naredimo file app_controller.php v ‘app/’ direktoriju. V file dodajte naslednje:
  1. < ?php
  2. class AppController extends Controller {
  3. var $ext = '.tpl';
  4. var $layout = 'default';
  5. }
  6. ?>

Kaj tu naredimo ? V routes.php povemo frameworku kaj naj pokliče ko pridemo na osnovno stran. V našem primeru IndexController in pa funkcijo index() v tem kontrolerju.

Z app_controller.php sistemu nastavimo default nastavitve.
$ext pomeni kakšne končnice bomo uporabljaji za template.
Z $layout spremenljivko povemo sistemu da naj uporablja default.tpl template za našo stran. To lahko spremenimo v vsakem kontrolerju z istim načinom kot tu. Tu zato definiramo da nam ni treba v vsakem kontrolerju to ponavljati.

Models
Modeli nam omogočajo da ločimo logiko (engine, ne najdem prave besede) strani od templatov. Z modeli recimo dostopamo do baze in delamo operacije na njej… Naj poudarim da cake kliče tabele v bazi v množini!! Recimo da imamo model Product v tem modelu bo cake sam od sebe klical tabelo v bazi ‘prefix_products’! ‘prefix_’ se seveda doda le v primeru če smo ga nastavili v configu. Seveda v samem modelu lahko tudi nastavimo kateri primary key se bo uporabil (po defaultu je to polje ‘id’) in katero tabelo naj cake vzame v primeru če naša tabela v bazi ni v množini.

Primer kako bi izgledal Model Product:
Model: app/models/product.php
Tabela: products
Polja: product_id (int:auto_increment), name (varchar:25), description(text), hidden(boolean)

  1. < ?php
  2.  
  3. /* app/models/product.php */
  4.  
  5. class Product extends AppModel {
  6.  
  7. var $name = 'Product';
  8.  
  9. var $primaryKey = 'product_id'; // primary key
  10.  
  11. }
  12.  
  13. ?>

Ko ustvarimo model name cake ponuja že ogromno funkncionalnosti. Tako imamo recimo v kontrolerju na razpolago že model Product in tako lahko že komuniciramo z bazo. Recimo findAll(’hidden=0′, ‘*’) funkcija nam bo vrnila vse zadetke ki ustrezajo danim pogojem. Za celoten spisek funkcij in spremenljivk ki so na razpolago v modelu poglejte TU

Controllers
Kontrolerji nam pomagajo da upravljamo neko sekcijo na strani. Naj nadaljujem kar z primerom Products. Imamo app/controllers/products_controller.php. Ko gremo na stran www.nasadomena.com/products/ se pokliče omenjeni kontroler in v njem index fukncija. V prve nam bo javilo napako ker še nismo naredili templata za index funkcijo. Naredi file ‘app/views/products/index.tpl’ in stem se znebimo omenjenega error-ja.
Primer:

  1. < ?php
  2.  
  3. /* app/controllers/products_controller.php */
  4.  
  5. class ProductsController extends AppController {
  6.  
  7. function index()
  8. {
  9. $this->set('products', $this->Product->findAll('hidden=0', '*'));
  10. }
  11.  
  12. }
  13. ?>

Če sprobamo in gremo na www.nasadomena.com/products/view/?id=1 nam bo zopet javilo error ki nam pove da moramo narediti v kontrolerju funkcijo view().
  1. < ?php
  2.  
  3. /* app/controllers/products_controller.php */
  4.  
  5. class ProductsController extends AppController {
  6.  
  7. function index()
  8. {
  9. $this->set('products', $this->Product->findAll('hidden=0', '*'));
  10. }
  11.  
  12. function view()
  13. {
  14. $this->set('product', $this->Product->find(array('hidden=0', 'product_id='.$this->params['url']['id']) , '*'));
  15. }
  16.  
  17. }
  18. ?>

Kaj je $this->set() in pa $this->Product->findAll() ?
$this->set(): funkcija ki nam nastavi parametre za v template. Recimo $this->set(’test’, ‘Testni parameter’); bomo v templatu klicali kot $test.

$this->Product->findAll(): ->Product pomeni ime Modela ki ga kličemo. Uporabljamo namreč model Product! ->findAll() je predefinirana fukncija frameworka ki nam je na razpolago v vsakem Modelu ki ga naredimo. findAll() potegne podatke iz baze glede na podane parametre.

Tako kot modeli imajo tudi kontrolerji že pred definirane funkcije in spremenljivke. KLIK

Ko naredimo to funkcijo in gremo zopet na omenjeni naslov www.mojadomena.com/products/view/?id=1 nam bo javilo napako da template za view() funkcijo ne obatsaja. Naredimo ga. Naredite file ‘app/views/products/view.tpl’ in zadeva bo šla skozi.

V ‘app/views/products/index.tpl’ dodajmo naslednje:

  1. <ul>
  2. < ?php foreach($products as $product): ?>
  3. <li><a href="view/?id=<?php echo $product['Product']['product_id'] ?>">< ?php echo $product['Product']['name'] ?></a></li>
  4. < ?php endforeach; ?>
  5. </ul>

V ‘app/views/products/view.tpl/’ dodajmo še naslednje:
  1. <strong>Ime izdelka:</strong> < ?php echo $product['Product']['name'] ?>
  2. <strong>Opis izdelka:</strong> < ?php echo $product['Product']['description'] ?>

Zadeva je preprosta. Npr. url ‘www.mojadomena.com/products/view/?id=1′ pomeni naslednje:
/products/ = Kličemo kontroler ProductsController -> products_controller.php
view = Kličemo funkcijo view() v ProductsController-ju
?id=1 = Funkciji view() v kontrolerju ProductsController podamo ID produkta ki si ga želimo ogledati.

Če view na koncu url naslova ni podam potem se po defaultu kliče funkcija index(). To lahko spremenimo in nastavimo na kaj drugega. V ‘app/config/’ direktoriju imate file routes.php in dodamo naslednjo vrstico:

  1. Router::connect('/products', array('controller' => 'products', 'action' => 'test'));

Kaj pomeni to ? To pomeni da namesto ko bomo prišli na www.nasadomena.com/products/ cake nebo klical index() funkcije vendar bo klical test() funkcijo v kontrolerju. Seveda moramo za to funkcijo tudi narediti template.

V mojem primeru sem naredil v test() funkciji intreni forward na index() funkcijo:

  1. function test()
  2. {
  3. $this->setAction('index');
  4. }

$this->setAction() je funkcija ki naredi interni forward na eno od funkcij ki jih imamo v kontrolerju. Zelo uporabna zadeva!

Če ste opazili smo pozabili dodati IndexController. Dodajmo ga. Postpek je isti kot za ProductsController.
Naredimo file ‘app/controllers/index_controller.php’ in dodajmo naslednje v njega:

  1. < ?php
  2.  
  3. class IndexController extends AppController
  4. {
  5. var $uses = array();
  6.  
  7. function index()
  8. {
  9. $this->pageTitle = 'Naša prva stran';
  10. }
  11. }
  12.  
  13. ?>

Kaj pomeni spremenljivka $uses ? Pa še prazna je po vrhu :( Z $uses povemo sistemu katere Modele rabimo v tem Index kontrolerju. Če pustimo prazno potem ne kličemo nobenega Modela. Lahko pa kličemo kateregakoli ki ga pač imamo. Če probate $uses spremenljivko zakomentirati boste opazili da nam bo sistem vrnil error ker nismo naredili Modela Index. Zato smo uporabili prazen $uses in sistemu rekli da naj ne išče nobenega Modela za Index kontroler.
$this->PageTitle že samo po sebi pove da nastavimo naslov za našo stran. Vendar samo v index kontrolerju! Recimo če bi želeli imeti isti naslov na vseh straneh potem dodamo to v app_controller.php in v naših kontolerjih samo doštukamo naslov. Primer če imamo v app_contolerju nastvaljen var $pageTitle = ‘Test stran - ‘;
  1. function index() {
  2. $this->pageTitle .= '123';
  3. }

Tako bo naslov strani naslednji: ‘Test stran - 123′. Upam da je vsem jasno kaj sem hotel povedati :)
Naredimo template za IndexController in index() funkcijo. NAredimo file ‘app/views/index/index.tpl’ in dodajmo naslednje v njega:
  1. Prva stran ki se kliče iz kontrolerja index_controller.php. Funkcija index()

Naredimo še glavni layout template. NAredite file ‘app/views/layouts/default.tpl’. V file dodajmo naslednje:
  1. < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
  4. <p style="border: 1px dotted silver; float: left; margin-right: 20px; width: 150px">
  5. Menu
  6. <li><a href="http://www.linux-si.org/wp-admin/%3C?php%20echo%20$this-%3Ebase;%20?%3E">Domov</a></li>
  7. <li><a href="products/">Produkti</a></li>
  8. </ul>
  9. </p><p style="border: 1px solid black; float: left">
  10. < ?php echo $content_for_layout ?></p>

Seveda ne pozabimo še na config baze: editirajte file ‘app/config/database.php’ in si nastavite vse potrebno za povezavo z bazo. host, username, password, baza… Če database.php še nimate potem so preimenujte database.php.default v database.php. Poglejte si tudi malo ostale confige! Recimo v core.php si nastavite DEGBU na 0 kajti drugače boste dobivali debug informacije od frameworka. Seveda imate to lahko vklopljeno… Po defaultu je debug nastavljen na 2.

Ne pozabite da mora biti ‘app/tmp’ direktorij pisljiv za web server! celoten tmp/ direktorij in pod direktoriji!

Jaz sem uporabil CakePHP iz SVN-ja. 1.2Nightly build verzijo. Delal sem na PHP 5.2.1, MySQL 5.0.24a, Apache/2.0.55

V naslednjih dneh pričakujte nadaljvenja. In sicer, pisalo se bo o naslednjih funkcionalnostih.
- Zakaj uporabiti helperje
- Uporaba HTML helperja
- Uporaba Ajax helperja
- Uporaba scaffoldinga
- …

Seveda bomo z primeri nadgradili kar smo že začeli….

iNobl: 21% [?]