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

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

 
Hledat
Vybavení pro Laser Game
Laser Game Brno

CakePHP - vlastní CRUD nad tabulkou I.

Google       Google       21. 7. 2007       16 745×

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 Hybridní inteligentní systémy 2

Hybridní inteligentní systémy 2

V technické praxi využíváme často kombinaci různých disciplín umělé inteligence a klasických výpočtů. Takovým systémům říkáme hybridní systémy. V tomto článku se zmíním o určitém typu hybridního systému, který je užitečný ve velmi složitých výrobních procesech.

Reklama
Reklama
Obrázek ke článku Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Jak vést kvalitně tým v IT oboru: Naprogramujte si ty správné manažerské kvality

Vedení týmu v oboru informačních technologií se nijak zvlášť neliší od jiných oborů. Přesto však IT manažeři čelí výzvě v podobě velmi rychlého rozvoje a tím i rostoucími nároky na své lidi. Udržet pozornost, motivaci a efektivitu týmu vyžaduje opravdu pevné manažerské základy a zároveň otevřenost a flexibilitu pro stále nové výzvy.

Obrázek ke článku Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Síla týmů se na home office může vytrácet. Odborníci radí, jak z pracovních omezení vytěžit maximum

Za poslední rok se podoba práce zaměstnanců změnila k nepoznání. Především plošné zavedení home office, které mělo být zpočátku jen dočasným opatřením, je pro mnohé už více než rok každodenní realitou. Co ale dělat, když se při práci z domova ztrácí motivace, zaměstnanci přestávají komunikovat a dříve fungující tým se rozpadá na skupinu solitérů? Odborníci na personalistiku dali dohromady několik rad, jak udržet tým v chodu, i když pracovní podmínky nejsou ideální.

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032023 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý