Posledně jsme se něco málo naučili s funkcí findAll
, dnes se podíváme dále, na funkci find
a dokončíme náš ukázkový příklad, který jednoduše manipuluje s daty v tabulce.
Na závěr minulého dílu jste měli možnost přečíst si o funkci findAll
, která sestaví dotaz, jenž vybere z tabulky všechny záznamy odpovídající podmínce, pořadí a limitu. Cake má opravdu mocné funkce, toto byl ale pouze slabý začátek.
Nyní se podívejme, jak by asi mělo vypadat zavolání funkce findAll
pro náš příklad:
$pages = $this->Page->findAll( null, null, array("title", "id") );
Tímto vybereme všechny záznamy, všechny jejich sloupce a setřídíme je nejdříve podle jejich titulku a v případě shody podle jejich unikátního id.
Funkce modelu find
V minulém dílu jsme si navrhli všechny kostry funkcí, které je třeba. Naším požadavkem po funkci view je, aby zobrazila jeden příspěvek podle unikátního id, které pomocí URL předáme. Řešení je následující:
function view($id) {
$page = $this->Page->find( array("id" => $id) );
$this->set("page", $page);
}
Abychom si mohli udělat lepší představu o struktuře funkce find
, uveďme si její přesnou definici:
Model::find(
$conditions = null,
$fields = null,
$order = null,
$recursive = null
)
Funkce vrací jeden řádek z db. Jako výsledek je předáno pole. Parametry se zadávají ve stejném formátu jako u funkce findAll
, viz minulý díl o Caku.
Parametry:
- array – $conditions – pole s SQL podmínkou
- mixed – $fields – řetězec s názvem sloupce, nebo pole požadovaných sloupců
- string – $order – pole nebo řetězec se jménem sloupce pro řazení; pokud chcete řadit naopak, připojte ke sloupci sekvenci znaků "
DESC
"; tedy například: "title DESC
" - int – $recursive – číslo určující míru rekurzivity, ale o tom někdy jindy
Návratová hodnota:
- array – pole záznamů tabulky
Myslím, že View funkce view (soubor view.ctp
) (jen se do těch názvů nezamotejme) zvládnete určitě levou zadní. Pro jistotu uvádím možný obsah tohoto souboru.
<h1><?php echo $page["Page"]["title"] ?></h1>
<h3>Autor: <?php echo $page["Page"]["author"] ?></h3>
Obsah stránky:
<p><?php echo $page["Page"]["content"] ?></p>
Funkce modelu delete
Tato funkce patří mezi ty jednoduší, napíšeme zde pouze tři příkazy, a to následující:
function delete($id) {
$this->Page->delete($id);
$this->redirect('index');
exit;
}
Využili jsme další funkce Modelu, a to funkci delete
. Klasicky si ji představme:
Model::delete(
$id = null,
$cascade = true
)
Odstraní záznam příslušného id. Pokud není id předáno, využije se stávající id natavené Modelu.
Parametry:
- mixed – $id – id – primární klíč mazaného záznamu
Návratová hodnota:
- boolean – při úspěchu
true
Metoda redirect (přesměrování)
Další novinkou je metoda redirect
Controlleru. Je to velmi užitečná funkce, která za nás automaticky generuje hlavičky pro přesměrování. Jako parametr se předává řetězec podle následujících možností:
- Pokud chceme přesměrovat pouze na jinou funkci aktuálního controlleru, zadáme pouze její název.
- Pokud potřebujeme přesměrování i na jiný Controller, zadáme URL ve tvaru:
/controller/function
.
Důležité je to lomítko na začátku, které v předchozím případě záměrně chybělo!
Volání exit není povinné, ale silně ho (i vývojáři) doporučuji. Vzhledem k tomu, že provádíme za každé okolnosti redirect, není nutné mít vytvořený soubor *.ctp
.
Zastávka bokem: Router
Nyní to, co jsme již udělali, upravíme do trochu hezčí podoby. V tuto chvíli, když přejdete na URL /
, tedy bez /pages
, vidíte pouze hlášku o chybějícím controlleru. Je to proto, že jsme Caku vymazali informace o výchozím controlleru. Tyto informace jsou uloženy v souboru /config/routers.php
. Editujte tedy tento soubor, aby vypadal asi takhle:
<?php
Router::connect('/', array('controller' => 'pages'));
?>
Myslím, že není moc co vysvětlovat, pro tuto chvíli to stačí.
Layout
Dalším velmi „neefektním“ problémem je to, že stránky jsou obaleny „Cake vzhledem“, který zrovna taky není žádný zázrak.Vytvoříme tedy náš layout, obal, který bude používat každá stránka. Výchozí layout má tuto adresu: /views/layouts/default.ctp
. Tento soubor musíte vytvořit. Vložte do něj vámi požadovanou HTML kostru a pomocí PHP do něj vepište dvě nutné proměnné:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
<title><?php echo $title_for_layout ?></title>
<style type="text/css" media="screen">
table { width:100% }
th {
background-color:#F2F2F2;
border-color:#FFFFFF rgb(187, 187, 187) rgb(187, 187, 187) rgb(255, 255, 255);
border-style:solid;
border-width:1px;
text-align:center;
}
</style>
</head>
<body>
<?php echo $content_for_layout ?>
<hr />
</body>
</html>
Proměnné $title_for_layout a $content_for_layout vkládají nastavený titulek, respektive obsah výstupu šablony controlleru. Do ukázkového kódu jsem přidal trochu CSS, aby výstup nebyl tak strohý.
Opět se nám do šablony vložil výpis dotazů na SQL server. Považuji tento výpis při vývoji aplikace za užitečný, jeho vypnutí lze provést nastavením Cake debug módu na <2. Ti bystřejší si možná toto nastavení najdou, ale já ho zatím doporučuji ponechat zapnuté.
Vylepšujeme /views/pages/index.ctp
Zatím přiděláváme funkce, ale je nutno na ně vytvořit i jednotlivé odkazy. Proto nyní upravíme hlavní pohled controller pages
, což je soubor /views/pages/index.ctp
. Doporučuji asi následující úpravu:
<h1>Uložené stránky</h1>
<?php echo $html->link('Přidat stránku', 'add') ?>
<table>
<tr>
<th>Id</th>
<th>Titulek</th>
<th>Autor</th>
<th>Obsah</th>
<th>Akce</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>
<td>
<?php echo $html->link('Zobrazit', 'view/'.$page['Page']['id']) ?>
<?php echo $html->link('Editovat', 'edit/'.$page['Page']['id']) ?>
<?php echo $html->link('Smazat', 'delete/'.$page['Page']['id']) ?>
</td>
</tr>
<?php } ?>
</table>
V tomto opraveném kódu se ocitly nové odkazy, které jsme vygenerovali pomocí helperů. A helpery jsou naše nová kapitola.
Helpery
Jak již z názvu vyplývá, helpery jsou tu proto, aby nám pomohly. Onen generovaný odkaz není, pravda, moc velká úspora práce, ale to je jen semínko. Využili sme metody link
objektu html
. Cake obsahuje helpery také např. pro Ajax, JS, RSS, XML. Pomocí nich budeme generovat dokumenty jako na běžícím páse! Představme si metodu link:
$html->link()
HtmlHelper::link (
$title,
$url = null,
$htmlAttributes = array(),
$confirmMessage = false,
$escapeTitle = true
)
Funkce vytvoří HTML odkaz. Pokud URL začíná http://
, zachází se s ním jako s externím odkazem. Jinak zde platí stejná pravidla jako u funkce redirect
. Pokud chceme „zůstat v působnosti“ stejného controlleru, $url
nesmí začínat /
, pro jiný controller zvolte $url
ve formátu /controller/action
. Pokud je $url
prázdné, použije se namísto něj $title
.
Parametry:
- string – $title – obsah vložený do tagu
- mixed – $url – relativní URL Caku, nebo pole parametrů, případně externí URL začánající
http://
- array – $htmlAttributes – pole HTML atributů
- string – $confirmMessage – javascriptová zpráva pro potvrzení
- boolean – $escapeTitle – Má se escapovat
$title
?
Návratová hodnota:
- string – odkaz – tag <a>
Pro ukázku rychle využijeme parametr $confirmMessage
, který se nám hodí k našemu odkazu Smazat
.
<?php echo $html->link('Smazat', 'delete/'.$page['Page']['id'], null, "Jste si jisti, že chcete stránku smazat?") ?>
A to bude pro dnešek všechno. Máme vše připraveno, abychom přístě využili helper $form
a dokončili tak zbývající funkce controlleru pages
, na které jsme si už připravili i odkazy.