Minule nám Cake vytvořil jednoduché rozhraní pro práci s tabulkou. Dnes si vytvoříme první část vlastního tzv. CRUD rozhraní.
Takzvané „lešení“, které jsme si ukázali minule, bylo opravdu jen řešení pro začátky, kdy nemáme zatím přesně ujasněnou strukturu tabulky, přidáváme a odebíráme slupce apod. Dnes vytvoříme vlastní CRUD funkce, které nám budou obstarávat základní manipulaci s daty tabulky.
Pro začátek smažte z databáze minulou tabulku a vytvořte tuto novou:
CREATE TABLE `pages` (
`id` tinyint(10) unsigned NOT NULL auto_increment,
`title` varchar(100) character set utf8 collate utf8_czech_ci NOT NULL,
`author` varchar(100) NOT NULL,
`content` longtext character set utf8 collate utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stránky';
Spusťte si prohlížeč a přes controller pages
, který jsme minule vytvořili, přidejte nějaké stránky do DB, abychom mohli potom s těmito daty pracovat.
Views
Pozorný čtenář si jistě všiml, že posledně jsme z modelu MVC nevyužili Views. Views – česky pohledy – za nás tehdy generoval Cake. Dnes si je už vytvoříme sami.
Controller – funkce
Budeme pokračovat na příkladu z minula s novou tabulkou z dneška. Otevřete soubor pages_controller.php
a vymažte z něj definici
proměnné $scaffold. Bez ní již Cake nebude nic automaticky generovat.
Nyní si nadefinujeme jednotlivé funkce, které budou odpovídat jednotlivým operacím s daty v tabulce. Asi nějak takhle:
<?php
class PagesController extends AppController
{
var $name = "Pages";
function index() { // bude zobrazovat seznam vsech stranek
}
function view($id) { // zobrazi jednotlive stranky
}
function add() { // prida stranku
}
function edit($id = null) { // upravi stranku
}
function delete($id) { // smaze stranku
}
?>
Pro každou operaci jsme vytvořili jednu funkci, kterou lze zavolat přes URL, pomocí svého jména. Např. funkce add:www.example.com/cake/pages/add
.
Pokud nezadáme jméno funkce, volá se defaultně funkce index
. Následující URL tedy vedou k volání stejné funkce (index
):www.example.com/cake/pages
www.example.com/cake/pages/index
Všimněte si, že jsme funkcím view
, edit
a delete
definovali parametr $id
. Pomocí něho funkci sdělíme jednoznačný identifikátor stránky, s kterou bude pracovat. Následující URL tedy zavolá funkci edit
nad článkem s ID 3:
www.example.com/cake/pages/edit/3
Proč jsme u edit
nastavili parametr id
jako volitelný, si řekneme až později u rozboru této funkce.
Zpět k Views
Pokud neurčíme jinak (a mnohdy není vůbec třeba), tak bude platit jednoduché pravidlo, že každá funkce z každého controlleru má vlastní příslušný soubor View. View soubory se ukládají do složky app/views/xxxx
a mají vždy přípony *.ctp
. Složku xxxx
nahradíme jménem příslušného controlleru, kterému je View soubor příslušný. Pravidla psaní velikosti písmen apod. nastudujte podle této tabulky:
URL | Controller | Model | Tabulka | View (jméno souboru) |
pages/index | Pages | Page | pages | /pages/index.cpt |
people/edit | People | Person | people | /people/edit.cpt |
my_new_blogs/add | MyNewBlogs | MyNewBlog | my_new_blogs | /my_new_blogs/add.cpt |
Cake obsahuje propracovaný převodník těchto jmen, a proto byste neměli mít u angličtiny problém. Jak vidíte v tabulce, uspějete i s nepravidelnými tvary množných čísel, apod. Velmi důležitá je správnost velikosti písmen, důkladně si principy z tabulky nastudujte.
Pro náš ukázkový příklad tedy vytvořte tyto soubory ve složce views/pages/
:
index.ctp
view.ctp
edit.ctp
add.ctp
Soubor delete.ctp
nevytvářejte, protože tato funkce nebude mít žádný výstup.
Funkce index
Jako první napíšeme funkci index. Potřebujeme jednoduše dostat z databáze všechny stránky a ty potom vypsat. O vypsání se nám postará View, o dotaz na DB Model a o propojení Controller. Funkce index bude vypadat následovně:
function index() {
$pages = $this->Page->findAll();
/*
Do promenne pages jsme nacetli vsechny stranky ulozene v DB.
Controller ma vzdy nacteny prislusny model tabulky podle jmena,
tedy PagesController ma prislusny Model v $this->Page.
Pokud by byl napr. NewsController, Model by mel nacten v $this->New.
funkce findAll() vraci uplne vsechny radky v tabulce pages.
*/
$this->set('pages', $pages);
/*
Pomoci funkce jsme zpristupnili promennou $pages pod stejnym jmenem
pages ve View. Tato jmena se mohou lisit, ale doporucuji promennou ve
View pojemnovat stejne jako v Controlleru.
Pokud bychom tuto funkci nepouzili, nas predchozi dotaz by se "ztratil"
a nemohli bychom jeho obsah ve View vypsat.
*/
}
Soubor views/pages/index.ctp
je normální mix (X)HTML a PHP. Cake všechny výsledky dotazu na DB převádí do asociativního pole. Výpis tedy bude velmi jednoduchý. Zde je celý obsah index.ctp
:
<h1>Uložené stránky</h1>
<table>
<tr>
<th>Id</th>
<th>Titulek</th>
<th>Autor</th>
<th>Obsah</th>
</tr>
<?php foreach( $pages as $page) { ?>
<tr>
<td><?php echo $page['Page']['id'] ?></td>
<td><?php echo $page['Page']['title'] ?></td>
<td><?php echo $page['Page']['author'] ?></td>
<td><?php echo $page['Page']['content'] ?></td>
</tr>
<?php } ?>
</table>
Procházíme proměnnou $pages po řádcích ($page). Proměnná $page obsahuje asoc. pole s indexem, který odpovídá jménu Modelu, proto tedy první index 'Page', index druhého pole odpovídá jménu sloupce v DB.
Výsledek by měl vypadat asi nějak takto:
Nelekejte se okolních informací. Námi vytvořený obsah je pouze v prvním bílém obdélníku. Ostatní layout můžeme také změnit, ale zatím se s ním spokojíme, protože nám může být užitečný, a to např. oním výpisem prováděných dotazů na DB. Samozřejmě tento výpis předpokládá, že jste si něco do tabulky uložili.
Dnes už nebudeme vytvářet další funkce, ale raději zaexperimentujeme s findAll(). Zde je dokumentace možných parametrů:
Model::findAll( $conditions = null,
$fields = null,
$order = null,
$limit = null,
$page = 1,
$recursive = null
)
Parametry:
- mixed – $conditions – Podmínka pro SQL dotaz. Můžete ji zapsat:
- jako normální SQL řetězec – např:
"author LIKE 'honza'"
- jako pole –
array('author' => 'honza')
$this->Page->findAll( array('author' => 'honza', 'id' => 2) ); // je stejne jako: $this->Page->findAll( "author LIKE 'honza' AND id = 2 ");
- jako normální SQL řetězec – např:
- mixed – $fields – Sloupce, které chceme vybrat. Platí zde stejný princip jako u podmínky, buď pomocí řetězce určete jeden sloupec, nebo pomocí pole zadejte více sloupců (
array('author', 'title')
– vybere pouze jméno autora a titulek). - string – $order – Řazení dotazu. Opět stejný princip (
array('author', 'title')
– seřadí nejdříve podle jména autora, potom podle titulku). - int – $limit – Limit vybíraných řádků
- int – $page – Stránka, od které chcete vybrat data
- int – $recursive – Číslo pro míru rekurzivity – využijeme až při vazbách v tabulkách n:1, m:n.
Zkuste si tyto příklady „naostro“ a nezapomeňte, že pokud vyberete jen určité sloupce, že můžete vypsat jenom je, ale ne už ty ostatní!
Přístě si dokončíme ostatní funkce a potom se můžete těšit na mini-video shrnující naše dosavadní poznatky. Potom budeme pokračovat samozřejmě dále.