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

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 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ý