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

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

 

CakePHP - vlastní CRUD nad tabulkou I.

Google       Google       21. 7. 2007       12 702×

Minule nám Cake vytvořil jednoduché rozhraní pro práci s tabulkou. Dnes si vytvoříme první část vlastního tzv. CRUD rozhraní.

Reklama
Reklama

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 ");
  • 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.

×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.

3 názory  —  3 nové  
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 Dovozci baterií mění logistiku, letadlo nahrazuje námořní doprava

Dovozci baterií mění logistiku, letadlo nahrazuje námořní doprava

Dovozci baterií do mobilů či notebooků upouštějí od letecké přepravy zboží. V letošním roce plánují dovézt až 80 % produktů lodí. Přitom před 5 lety byla většina baterií do mobilních přístrojů dovezených do České republiky přepravována letadlem. Za proměnou způsobu transportu akumulátorů stojí zpřísnění pravidel pro leteckou přepravu, která přinášejí vyšší náklady i náročnou agendu.

Reklama
Reklama
Obrázek ke článku JIC otevírá největší digitální dílnu pro veřejnost v České republice

JIC otevírá největší digitální dílnu pro veřejnost v České republice

JIC otevírá první nonstop veřejně dostupnou digitální dílnu světového formátu s vybavením za 3 miliony korun. Dílnu může využívat po registraci kdokoliv. V  prostorách vzniknou prototypy produktů místních startupů, projekty kutilů a studentů i umělecká díla. Cílem dílny je zpřístupnit veřejnosti drahé přístroje a přitáhnout více podnikavých lidí k technickým oborům.

Obrázek ke článku Nový IT hráč na českém trhu

Nový IT hráč na českém trhu

V roce 2015 otevřela v Praze na Pankráci v budově City Tower své kanceláře společnost EPAM Systems (NYSE:EPAM), jejíž centrála se nachází v USA. Společnost byla založená v roce 1993 a od té doby prošla velkým vývojem a stále roste.

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 © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý