2. Tvoríme CMS s CakePHP - začíname pracovať
Opäť pokračujeme v našom seriály a tentokrát začneme pracovať priamo s frameworkom.
V minulej časti sme si niečo málo povedali o základných vlastnostiach a prednostiach CakePHP. Počnúc touto časťou bude každý diel venovaný tvorbe redakčného systému a na konkrétnych ukážkach si predstavíme jednotlivé prednosti a vlastnosti tohto skvelého frameworku.
1. krok – získavame framework
Základný balík si môžete stiahnuť priamo zo stránok CakePHP – download sekcia. V dobe písania tejto časti je aktuálna vývojová verzia 1.2.0.6311-beta. Po stiahnutí balíka rozbalíme príslušné súbory do adresára cakephp a umiestníme ho do zložky, kde bude prístupný webovému serveru (v mojom prípade je to zložka ~/www/cakephp a následne sa môžeme po spustení webového servera napr. Apache odkazovať na adresár prostredníctvom adresy http://localhost/cakephp). Týmto máme všetky potrebné súbory skopírované a framework pripravený k použitiu.
2. krok – prvé kroky
Medzi prvé kroky patrí nastavenie práv pre zápis pre adresár app/tmp/cache a zmena predvoleného hashovacieho stringu v súbore app/config/core.php
Configure::write('Security.salt', 'DYhG93b0asdf97473qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
Po zadaní adresy do webového prehliadača, v našom prípade http://localhost/cakephp, môžeme vidieť úvodnú obrazovku, ktorou nás CakePHP privíta a ktorá zároveň indikuje, že sa nám framework podarilo úspešne nainštalovať.
Ako môžeme vidieť na obrázku, Cake nám taktiež oznamuje, že nemáme nastavený prístup k databáze a to oznámením Your database configuration file is NOT present. Treba nám premenovať súbor app/config/database.php.default na app/config/database.php a v ňom upraviť nasledovnú časť (jednotlivé položky sú dosť intuitívne a nemusím ich predstavovať)
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'port' => '',
'login' => 'user',
'password' => 'password',
'database' => 'database_name',
'schema' => '',
'prefix' => '',
'encoding' => ''
);
Ak doplníme správne hodnoty a Cake bude schopný pripojiť sa k databáze, oznámi nám to nasledovnou hláškou Your database configuration file is present. Cake is able to connect to the database. Pre pokročilé možnosti pripojenia k databáze si môžete prečítať článok Pripojujeme sa k databáze v CakePHP
3. krok – upravujeme vzhľad
Na obrázku vyššie môžeme vidieť defaultný vzhľad CakePHP po prvom spustení. My si chceme však vzhľad prispôsobiť podľa vlastných potrieb. Nato, aby sme chápali, ako sa vykresľuje celý vzhľad, pozrime si nasledujúci obrázok

Modrou farbou je vykreslený tzv. layout stránky, ktorý sa vkladá do každej zobrazenej stránky a ak neurčíme inak, je pre všetky zobrazené stránky rovnaký (môžeme si to predstaviť, že na každej stránke so zobrazí napr. logo a práve dané logo bude umiestnené v jednom jedinom súbore, ktorý sa nazýva layout). Žltou farbou môžeme vidieť konkrétny view, pod ktorým si môžeme predstaviť napr. zoznam článkov, komentárov, noviniek atď.
Keď už vieme, ako celý zobrazovací mechanizmus pracuje, môžeme sa pustiť do prvých úprav. Najprv si zmeníme text úvodnej stránky v samotnom view a to vytvorením súboru app/views/pages/home.ctp a vložením skúšobného textu do novovytvoreného súboru. Po úprave môžeme vidieť niečo obdobné
Defaultný layout necháme nezmenený a pre tento seriál budeme používať pôvodný priamo z CakePHP. Ak by sme sa ho však rozhodli zmeniť, vytvorili by sme súbor **app/views/layouts/default.ctp" do ktorého by sme umiestnili napr. nasledovný kód
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?p echo $html -> charset("utf-8"); ?>
<title><?php echo $title_for_layout?></title>
<? echo $html -> css("stylesheet"); ?>
<? echo $javascript -> link("scriptaculous/prototype.js"); ?>
</head>
<body>
<div id="container">
<div id="header">
<div id="menu">
</div>
</div>
<?
if ($session->check('Message.flash')):
$session->flash();
endif;
?>
<div id="content">
<?php echo $content_for_layout ?>
</div>
<div id="footer">
<a href="mailto:tibor.pino@gmail.com">Vyrobil Tibor Piňo</a>
</div>
</div>
</body>
</html>
Jednotlivé časti layoutu si vysvetlíme neskôr, ale už aj teraz môžete vidieť, ako sa vkladajú css súbory, javascript súbory, ako sa zobrazuje view v layoute pomocou direktívy <?php echo $content_for_layout ?> atď.
A to by bolo pre túto časť zhruba všetko. V tejto časti sme sa už dostali k prvým úpravám vzhľadu, vysvetlili sme si ako funguje celý princíp zobrazovanie v Cake a taktiež ako si správne nakonfigurovať prístup k databáze. Týchto pár krokov nám stačí k ďalšej plnohodnotnej práci a v ďalšej časti si správne vytvoríme databázové tabuľky, vysvetlíme si vzťahy medzi jednotlivými tabuľkami a celý návrh otestujeme pomocou tzv. lešenia alebo scaffolding
Rád uvítam vaše nápady a pripomienky v diskusii k článku.
Súvisiace články
-
Kategórie
- Tipy a triky (25)
- Články (8)
- Fantom CMS (4)
- Zábava (2)
- Začíname s CakePHP (5)
-
Najčítanejšie články
-
Novinky
-
Seriál o CakePHP na www.debug.sk
15. 10. 2008
Od 7. októbra vychádza nový seriál o CakePHP na serveri zameranom na programovanie s názvom Debug.sk Autorom seriálu je autor tohto webu a kto by mal záujem, môžete daný seriál podporiť jeho prečítaním.
-
-
Nálepky
-
Nedávne komentáre
-
Rss kanály
-
Download
- 5. Tvoríme CMS s CakePHP - Controller a View (356 KB)
- Validácie v CakePHP (2 KB)
- 4 - Tvoríme CMS s CakePHP - Model (2 KB)
- Controller bez modelu (571 Bytes)
- Všetky súbory

Komentáre k článku
Nový komentár
Titulok: otazky
Autor: janko
Vytvorený: 08. 01. 2008 16:08
s cakeom sa teraz ucim a mal by som (na teraz) par otazok …
--1. ked mam vztah Uzivatel hasMany Komentar, parametrom dependent mozem nastavit ze pri vymazani Uzivatela sa vymazu vsetky jeho Komentare, ale mozem? a AKO nastavit, ze ked sa pokusim vymazat Uzivatela, ktory ma uz nejaky Komentar, aby bolo tomuto zabranene – ako je to v databaze pri foreign key akcia NO ACTION
--2. group by … Objednavka hasMany Polozka, pri polozkach su napr. ceny, v zozname objednavok chcem celkovu sumu objednavky, ktoru vypocitam zratanim poloziek .. teda SUM a GROUP BY. Pri asociacii hasMany pre mna nemozna uloha, group by nepozna a ked to uvediem v conditions, tak to da na zaciatok WHERE a to je samozrejme zly sql dotaz. Ja som to vyriesil, nasiel som niekde navod, ze v controllery pouzijem unbindModel(hasMany…) a bindModel(hasOne… Polozka), vsetko pekne funguje, len sa chcem spytat ci je to spravne a najjednoduchsie riesenie?
--3. taka blbostka – novy build 6311 zrusil funkciu generateList(), ma sa pouzivat find(‚list‘)/oba apostrofy maju byt samozrejme horne/, nejako sa mi nepodarilo narychlo zistit ako do toho dostanem parametre keyPath a valuePath?
Dakujem za reakcie :-)
Titulok: RE: otazky - 3
Autor: janko
Vytvorený: 08. 01. 2008 22:39
tak na moju otazku 3 som si uz prisiel – do modelu treba pridat
potom staci volat v controllery nad modelom iba ->find(‚list‘)
si tu takto sam so sebou diskutujem … ;-)
Titulok: Re: Otazky 1 a 2
Autor: Jitka aka poLK
Vytvorený: 09. 01. 2008 07:27
ad 1. class User
ad 2. nepouzivate-li ‚custom SQL query‘ pak JE to nejkratsi reseni (pokud vim). Kazdopadne doporucuji napsat si pro vas model nejake testy a po kazdem upgrade ‚cake core‘ (pred nahranim aplikace na produkcni server) je spustit,
Titulok: Poznamka k reseni pomoci beforeDelete() callbacku
Autor: Jitka aka poLK
Vytvorený: 09. 01. 2008 08:50
Pokud bude mazani v tabulce uzivatelu provedeno pomoci deleteAll($conditions, false, false), k provedeni callbacku beforeDelete() nedojde: Model::deleteAll()
Titulok: Pouziti User::deleteAll()
Autor: Jitka aka poLK
Vytvorený: 09. 01. 2008 08:55
…a jak tak ctu aktualni implementaci Model::deleteAll(): pokud se Vam reseni pomoci User::beforeDelete() libi, nepouzivejte User::deleteAll() :-)
Pocitate-li s budoucim pouzitim User::deleteAll(), nezbude Vam nez prekryt metody delete() a deleteAll() v tride User (reseni bez pouziti callbacku beforeDelete)
Titulok: pomenovanie klucov v poli
Autor: janko
Vytvorený: 10. 01. 2008 11:26
Dakujem za reakciu .. teraz by som mal este jednu otazku: Ako som pisal, ze riesim to GROUP BY cez hasOne „v otazke 2“ .. ako by som mohol pouzit custom query spolocne s paginate()? Vyskytuje sa mi jeden maly problem .. ked si v paginate fields zavolam SUM(suma) AS suma, Objednavka.cislo,… tak potom pole dat mam $objednavka[‚Objednavka‘][‚cislo‘] a $objednavka[‚0‘][‚suma‘], potreboval by som SUM(suma) AS Polozka.suma, aby to bolo $objednavka[‚Polozka‘][‚suma‘] ale to sa mysql nepaci. Teraz som si na to spravil funkciu, ktora premenuje key v poli, ale neriesi sa to inak? Keby som mohol pouzit custom query, tak sql dotaz by som uz sformulovat vedel.
Titulok: Re: pomenovanie klucov v poli
Autor: Jitka aka poLK
Vytvorený: 10. 01. 2008 13:15
Jisteze muzete pouzit sql dotaz i pro paginaci: pokud ve Vasem modelu implementujete metody paginate() a paginateCount(), tyto budou zavolany namisto vychozich findAll() a findCount() – a je jen na vas jakym zpusobem v techto metodach ziskate/upravite data pro paginaci – viz pouziti method_exists() v metode Controller::paginate().
Nejsem velkym priznivcem custom queries v CakePHP aplikaci (svadi to k uzivani i tam, kde to neni treba), ale paginace recordsetu s pouzitim agregacnich funkci je presne ten pripad, kdy se to IMHO vyplati.
Titulok: TranslateBehavior
Autor: Tibor
Vytvorený: 31. 01. 2008 14:08
Prave sa pokusam porozumiet TranslateBehavior a nie je mi jasna jedna vec. Akym sposobom mozem naraz ulozit napriklad titulok v troch jazykoch? Pre jeden jazyk to nie je problem, ale ja chcem docielit, aby som mal vo formulari v podstate 3 input prvky, a kazdy input prvok by znamenal iny jazyk pre titulok. A potom to chcem na jedenkrat ulozit.
Titulok: Re: TranslateBehavior
Autor: Jitka aka poLK
Vytvorený: 31. 01. 2008 19:46
Reseni: pockat nekolik hodin. Nedelam si legraci :)
Commit s hotovou opravou pro enhancement ticket #3940 je ve fronte, protoze nove uvedene metody Model::attach/detach() (respektive druha z jmenovanych) si vyzadaly implementaci noveho callbacku v tride Behavior.
Watch https://trac.cakephp.org/timeline !
:)
Titulok: Re: TranslateBehavior
Autor: Jitka aka poLK
Vytvorený: 02. 02. 2008 23:01
A je to.
Doufam, ze si vsichni cechoslovaci uzivaji ‚cze‘ v testech :)
Titulok: TranslateBehavior
Autor: Tibor
Vytvorený: 04. 02. 2008 13:52
No uz to testujem, insert skvely, len mi nefunguje operacia read. Data sa snazim vybrat nasledovne
a dostanem tento vysledok
Takze v podstate nemozem editovat vsetky jazyky naraz.
Este doplnim, ze v modely News mam nastavene toto
v tabulke news sa tieto stlpece nenachadzaju, takze sa to priamo uklada do tabulky i18n tak ako ma.
Dakujem za rady.
Titulok: Re: TranslateBehavior
Autor: Jitka aka poLK
Vytvorený: 04. 02. 2008 21:19
$this->News->bindTranslation(array(‚title‘ ⇒ ‚Title, 'seo_link‘ ⇒ ‚SeoLink‘, ‚text‘ ⇒ 'Text), false);
Titulok: Re: TranslateBehavior
Autor: Jitka aka poLK
Vytvorený: 04. 02. 2008 21:23
Doporucuji precist test cases pro TranslateBehavior – v tuto chvili je to jedina dostupna dokumentace s priklady pouziti.
Titulok: RE: TranslateBehavior
Autor: Tibor
Vytvorený: 04. 02. 2008 21:45
Tie som dokladne prestudoval, nasledovny postup som uz pouzil, ale dostavam takyto vysledok, co taktiez nie je ziaduce a v podstate nefunkcne
Ja predsa potrebujem dostat nasledovne, pretoze potom sa mi nenaplnaju input prvky
Alebo sa mylim?
Titulok: Dynamicka zmena jazyka
Autor: Tibor
Vytvorený: 04. 02. 2008 23:37
Este mi nie je celkom jasne, ako zmenit dynamicky jazyk stranky. Ked to robim nasledovne, tak to nefunguje, pretoze metoda &getInstance v triede I18n je volana skor, ako sa novy jazyk zapise do session
function beforeFilter() { $this->Session->write('Config.language', $language); }Titulok: Re: TranslateBehavior
Autor: Jitka aka poLK
Vytvorený: 05. 02. 2008 10:10
Automaticka uprava zaznamu (aby prekladana polozka obsahovala misto retezce dalsi dimenzi – pole) je kvuli zpetne kompaktibilite nezadouci. Ten dataset obsahuje vsechny informace ktere potrebujete. Chcete-li je mit ve forme [News][Title][slo] = ‚xxx‘:
Co se tyce volani I18n::getInstance() – dochazi k nemu jen v before/afterFind() a before/afterSave() metodach. Klic ‚Config.language‘ v session (nebo Configure singletonu) musite zmenit pred prvnim volanim modelu pouzivajiciho TranslateBehavior – anebo TranslateBehavior pripojte dynamicky pomoci Model::attach().
Neda se rici ze bych byla nadsena z toho, ze zaciname psat serial o TranslateBehavior v komentarich pod postem ‚CakePHP – zaciname pracovat‘. Myslim si, ze k pouzivani behaviors je ve Vasem serialu jeste kousek cesty, takze se pro priste off-topic komentaru zdrzim :) Nehlede k tomu, ze (prozatim) chybejici dokumentace k TranslateBehavior je zamerna – jeste stale se pracuje na podpore pro Model::$_schema, $query[‚conditions‘] a $query[‚order‘]. Teprve potom se muzete tesit na chybejici kapitolu na adrese http://tempdocs.cakephp.org/
Titulok: Re: TranslateBehavior
Autor: Jitka aka poLK
Vytvorený: 05. 02. 2008 10:36
A mimochodem – moznost array v YourModel::$locale existuje z jedineho duvodu: chybejici preklady. Priklad: array(‚ger‘, ‚eng‘) zpusobi, ze chybejici nemecke preklady budou nahrazeny anglickymi (ale zaznam zobrazen bude). Za vsechno se plati ;) (v tomto pripade slozitosti sql dotazu) proto doporucuji pouzivat array v YourModel::$locale jen v nezbytnych pripadech, anebo jeste lepe – psat kod tak, aby si programator mohl byt jisty, ze zadny chybejici preklad nebude.
Titulok: RE: TranslateBehavior
Autor: Tibor
Vytvorený: 05. 02. 2008 13:33
Dakujem za cenne rady. Serial bude pokracovat ale nie tu v komentaroch :-) Ide o to, ze tvorim jeden viacjazycny web a chcem maximalne vyuzit moznosti cakephp.
Pole v YourModel::$locale vyuzivam zdovodu, ze tak ako chcem na jedenkrat ulozit 3 jazykove mutacie daneho clanku, tak chcem najedenkrat editovat vsetky 3 mutacie pre daneho clanku, takze pri danej operacii edit potrebujem vybrat vsetky jazyky pre dany obsah.
Titulok: RE: TranslateBehavior
Autor: Tibor
Vytvorený: 06. 02. 2008 14:16
Este posledna otazka :-) a to dost zasadna. Neviem v com robim chybu, ale nefunguje mi update s TranslateBehavior. Zaznamy, ktore sa maju aktualizovat, sa vzdy vlozia ako nove do tabulky i18n. Kod mam takyto
Skutocne neviem, v com robim chybu. Pozeral som aj test cases a tam mi to pride rovnake. Problem je v tom, ze sa zaznamy neaktualizuju v i18n ale ukladaju sa ako nove.
Titulok: Re: TranslateBehavior
Autor: Jitka aka poLK
Vytvorený: 07. 02. 2008 10:57
Opet off-topic, ze ano? :)
Vsechny test cases projdou? Pokud ano, pokuste se prosim napsat test case ktera v poradku neprojde. V TranslateTest::testMixedCreateUpdateWithArrayLocale() totiz dochazi v jednom kroku k:
A to i presto, ze $locale obsahuje array(‚cze‘, ‚deu‘) – eng/spa nejsou v $locale uvedeny.
A to byla ma posledni odpoved k off-topic tematu v komentarich pod timto clankem. Game is over.
Titulok: CSS
Autor: Dev1lko1
Vytvorený: 13. 04. 2008 15:10
Ahoj, mám problém, mám svoj blog z designom písaný v PHP a chcel by som ho prerobiť do CakePHP. Ale neviem ako pridať CSS . Videl som to hore v tej ukážke ale niejako mi to nejde. Môj súbor default.ctp
Titulok: RE: CSS
Autor: Tibor
Vytvorený: 13. 04. 2008 22:09
CSS subory sa do layoutu vkladaju nasledovnou direktivou
Kde mycss je subor ulozeny v adresari /app/webroot/css/mycss.css
Titulok: homepage
Autor: Fabyen
Vytvorený: 28. 08. 2008 10:39
ahoj ako tak pozerám tak sa ešte mám čo učiť ;-)) "smekám " ale mám otázočku ako nadefinujem model, controller pre hompage ? poprípade hneď otázka č. 2 Ako manipulovať zo stránkami ? teda ako na ne linkovať . cítim sa ako rosnička v klietke krokodílov ;-)
Titulok: RE: homepage
Autor: Tibor
Vytvorený: 01. 09. 2008 23:09
Pre url tvoje aplikacie vzdy definujes controller, ten spracovava tvoje poziadavky a az nasledne v controllery si urcis, aky pouzijes model. Takze pre homepage si urcis, ktory controller ju bude spracovavat nasledovne
Na odkazovanie sa v ramci vlastnej aplikacie sluzi html helper link
Najlepsie sa naucis, pokial budes studovat cuzdie zdrojove kody, stiahni si napr. fantom tu z blogu a urcite aj v nom najdes mozstvo odpovedi na tvoje otazky…