RTFB!
3 Mar
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 …
/* * Model, View, Controller Architecture * View Helpers for AJAX, Javascript, HTML Forms and more * Built-in Validation * Application Scaffolding * Application and CRUD code generation via Bake * Access Control Lists * Data Sanitization * Security, Session, and Request Handling Components * Flexible View Caching * And More... */
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:
< ?php class AppController extends Controller { var $ext = '.tpl'; var $layout = 'default'; } ?>
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)
< ?php /* app/models/product.php */ class Product extends AppModel { var $name = 'Product'; var $primaryKey = 'product_id'; // primary key } ?>
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:
< ?php /* app/controllers/products_controller.php */ class ProductsController extends AppController { function index() { $this->set('products', $this->Product->findAll('hidden=0', '*')); } } ?>
< ?php /* app/controllers/products_controller.php */ class ProductsController extends AppController { function index() { $this->set('products', $this->Product->findAll('hidden=0', '*')); } function view() { $this->set('product', $this->Product->find(array('hidden=0', 'product_id='.$this->params['url']['id']) , '*')); } } ?>
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:
<ul> < ?php foreach($products as $product): ?> <li><a href="view/?id=<?php echo $product['Product']['product_id'] ?>">< ?php echo $product['Product']['name'] ?></a></li> < ?php endforeach; ?> </ul>
Č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:
V mojem primeru sem naredil v test() funkciji intreni forward na index() funkcijo:
function test() { $this->setAction('index'); }
$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:
< ?php class IndexController extends AppController { function index() { $this->pageTitle = 'Naša prva stran'; } } ?>
function index() { $this->pageTitle .= '123'; }
Prva stran ki se kliče iz kontrolerja index_controller.php. Funkcija index()
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" /> <p style="border: 1px dotted silver; float: left; margin-right: 20px; width: 150px"> Menu </ul> </p><p style="border: 1px solid black; float: left"> < ?php echo $content_for_layout ?></p>
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% [?]
Tagi:
7 Responses for "Prvi koraki v CakePHP"
Pismo, huda zadevica. Morm res sprobat tole
Kaj z mysql tud deluje to?
wooow, tega pa ne dojamem.niti pol.
hah
Sej ne rabiš vedet tega
Ti se rajši lepo nasmej, to ti gre odlično
Super, končno nekaj tudi v slovenščini. Zelo pohvalno, bom spremljal naprej, ker sem nekje na začetku s CakePHP.
Hm,
kaj pa recimo da imam jaz primarni ključ, start DATETIME
in imam recimo stran: http://localhost/logs/view/2010-06-23 11:30:47 mi sparsa ter vrne kao nič.
Evo recimo datoteke:
log.php
logs_controller.php
set(’logs_var’, $this->Log->find(’all’));
}
function view($id = null) {
$this->Log->start = $id;
$this->set(’log’, $this->Log->read());
}
}
?>
index.ctp
Blog posts
Start
Firm
Diff
link($log['Log']['start'],array(’controller’ => ‘logs’, ‘action’ => ‘view’, $log['Log']['start'])); ?>
view.ctp
echo $log['Log']['firm'];
Pri view.ctp ne prikaze nič, zgleda da ne mara presledkov v url-ju. Kako to popraviti?
Naslednje vprašanje kako se da enostavno uporabljati jquery s cakephp, namreč ajax se mi zdi res super oz. ga zelo veliko uporabljam v smislu update(”div id”, “update.php”, param);
In še, kje naj bi se nahajal cakephp če imamo več strani na strežniku torej direktoriju?
www/
cakephp/
webroot/
site1/
site2/
Hm,
kaj pa recimo da imam jaz primarni ključ, start DATETIME
in imam recimo stran: http://localhost/logs/view/2010-06-23 11:30:47 mi sparsa ter vrne kao nič.
Evo recimo datoteke:
log.php
class Log extends AppModel {
var $name = ‘Log’;
var $useTable = ‘logs’;
var $primaryKey = ’start’;
}
logs_controller.php
class LogsController extends AppController {
var $name = ‘Logs’;
function index() {
$this->set(’logs_var’, $this->Log->find(’all’));
}
function view($id = null) {
$this->Log->start = $id;
$this->set(’log’, $this->Log->read());
}
}
index.ctp
Blog posts
Start
Firm
Diff
link($log['Log']['start'],array(’controller’ => ‘logs’, ‘action’ => ‘view’, $log['Log']['start'])); ?>
view.ctp
echo $log['Log']['firm'];
Pri view.ctp ne prikaze nič, zgleda da ne mara presledkov v url-ju. Kako to popraviti?
Naslednje vprašanje kako se da enostavno uporabljati jquery s cakephp, namreč ajax se mi zdi res super oz. ga zelo veliko uporabljam v smislu update(”div id”, “update.php”, param);
In še, kje naj bi se nahajal cakephp če imamo več strani na strežniku torej direktoriju?
www/
cakephp/
webroot/
site1/
site2/
Hm,
kaj pa recimo da imam jaz primarni kljuc, start DATETIME
in imam recimo stran: http://localhost/logs/view/2010-06-23 11:30:47 mi sparsa ter vrne kao nic.
Evo recimo datoteke:
log.php
?php
class Log extends AppModel {
var $name = ‘Log’;
var $useTable = ‘logs’;
var $primaryKey = ’start’;
}
?
logs_controller.php
?php
class LogsController extends AppController {
var $name = ‘Logs’;
function index() {
$this-set(’logs_var’, $this-Log-find(’all’));
}
function view($id = null) {
$this-Log-start = $id;
$this-set(’log’, $this-Log-read());
}
}
?
index.ctp
h1Blog posts/h1
table
tr
thStart/th
thFirm/th
thDiff/th
/tr
?php foreach ($logs_var as $log): ?
tr
td?php echo $log['Log']['start']; ?/td
td?php echo $log['Log']['firm']; ?/td
td
?php
echo $html-link($log['Log']['start'],array(’controller’ = ‘logs’, ‘action’ = ‘view’, $log['Log']['start'])); ?
/td
/tr
?php endforeach; ?
/table
view.ctp
echo $log['Log']['firm'];
Pri view.ctp ne prikaze nic, zgleda da ne mara presledkov v url-ju. Kako to popraviti?
Naslednje vprašanje kako se da enostavno uporabljati jquery s cakephp, namrec ajax se mi zdi res super oz. ga zelo veliko uporabljam v smislu update(”div id”, “update.php”, param);
In še, kje naj bi se nahajal cakephp ce imamo vec strani na strežniku torej direktoriju?
www/
cakephp/
webroot/
site1/
site2/
Leave a reply