× Aktuálně z oboru

Programátoři po celém světě dnes slaví Den programátorů [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]
Celá zprávička [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]

CakePHP - vlastní CRUD nad tabulkou I.

[ http://programujte.com/profil/2592-jan-skrasek/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       21. 7. 2007       14 529×

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

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.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2007071801-cakephp-vlastni-crud-nad-tabulkou-i/ ].