CakePHP - vlastní CRUD nad tabulkou II.
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

CakePHP - vlastní CRUD nad tabulkou II.CakePHP - vlastní CRUD nad tabulkou II.

 

CakePHP - vlastní CRUD nad tabulkou II.

Google       Google       30. 7. 2007       12 966×

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.

Reklama
Reklama

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.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Jan ŠkrášekHonza pracuje jako webdeveloper, věnuje se vývoji Nette\Database a Nextras komponentám. Mnoho času věnuje komunitnímu portálu signály.cz. Honza je taky fanouškem XML technologií.
Web     Twitter    

Nové články

Obrázek ke článku Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

Reklama
Reklama
Obrázek ke článku ICT PRO školení zaměřené nejenom na ICT

ICT PRO školení zaměřené nejenom na ICT

Dovolte, abychom se představili. Jsme zaměstnanci společnosti ICT Pro, profesionálové v oblasti poskytování komplexních ICT služeb. Neboli služeb spojených s informačními a komunikačními technologiemi, které dnes - ve 21. století - tvoří  nedílnou součást běžného provozu všech moderních firem.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý