CakePHP project építés 2. rész

cakephpHa túl vagyunk az alap telepítésen, az alkalmazásunk tud az adatbázishoz kapcsolódni, akkor elkezdhetjük összerakni a moduljainkat. Mivel a CakePHP MVC felépítésű, így minden modulhoz fog tartozni egy model egy controller és pár view. Ezek felépítésénél nagy segítségünkre lesz kezdetben a scaffold és a bake. A következő leírás egy folyó fejlesztésem alapján íródik, ami elkészülte után a www.tulasi.hu címen lesz elérhető.

AB táblák

Első lépésként ki kell találnunk és létre kell hoznunk az adatbázis táblákat amivel dolgozni fogunk. Ha nem akarjuk (vagy nem mindenben) követni a Cake konvencióit, akkor itt-ott pici többlet munkánk lesz, és némi többlet szolgáltatást vagy kényelmes érhetünk el. Például én jobb szeretem a programjaimban a magyar változóneveket, az adattáblákban a magyar tábla és rekordneveket. Viszont ezeknek nem úgy képezünk többesszámot mint az angol szavaknak, így oda kell figyelni, hogy mit csinálunk. Akit nem zavar, hogy termeks és termekcsoports tipusú azonosítókkal kell dolgoznia az meg nyugodtan maradhat a cake alap működésénél. Én viszont nem fogok, de mindig leírom ha valamit azért kell megcsinálni mert eltérek a konvencióktól.

Termékek tábla

CREATE TABLE `termek` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `termekcsoport_id` tinyint(4) NOT NULL,
  `termeknev` varchar(255) NOT NULL,
  `kiskerar` varchar(10) NOT NULL,
  `leiras` text NOT NULL,
  `kep` varchar(255) NOT NULL,
  `suly` varchar(20) NOT NULL,
  `hatas` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
);

Termékcsoportok tábla

CREATE TABLE `termekcsoport` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `termekcsoport` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
);

Ha a táblákat létrehoztuk phpMyAdmin, parancssor vagy akármi segítségével akkor visszatérhetünk a Cakehez.

Minden modult / alkalmazás részt egy model-view-controller hármas ír le. Most létrehozzuk a termékeket és termékcsoportokat kezelő részeket. Ezek létrehozásánál segítségünkre lesz a bake script és a scaffolding tulajdonság – legalábbis a kezdetekben. Persze ha később finomítani akarunk akkor bizonyosan át fogjuk írni amit ezeken keresztül kapunk.

Termékcsoportok

A termékcsoportok elég fixek, ritkán van bennük változás, így nem igényelnek különösebben bonyolult admin felületet. Egy listázás, módosítás, törlés típusú kezelőfelület maximálisan elegendő, és pont ez az amit a bake, scaffold párossal 1 perc alatt elkészíthetünk.

A bake egy parancssori php scipt, amit a cake telepítése után a cake/scripts/bake.php helyen találhatunk meg. Segít nekünk létrehozni mind a model mind a controller mind a view fileokat. Létezik egy általam kreált magyar változat ami annyiban különbözik az eredetitől, hogy ahol lehet magyar függvény és view neveket gyárt az angol helyett. A példákban ezt fogom használni. Aki nem akarja annak a beke_hu.php helyett bake.php-t kell írnia.

Termékcsoportok – model

A bake használatához szükségünk lesz a parancsorra (win) vagy egy terminálra (Linux / Macintosh). Menjünk bele a /cake/scripts könyvtárba és adjuk ki a php bake_hu.php parancsot. Ennek eredményeképpen elindul a bake script ami szépen megkérdezi tőlünk mindig, hogy mit akarunk.

rrd:~/Sites/tulasi/cake/scripts rrd$ php bake_hu.php 

 ___  __  _  _  ___  __  _  _  __      __   __  _  _  ___ 
|    |__| |_/  |__  |__] |__| |__]    |__] |__| |_/  |__ 
|___ |  | | \_ |___ |    |  | |       |__] |  | | \_ |___ 
---------------------------------------------------------------


Bake -app in /Users/rrd/Sites/tulasi/app (y/n) 
[y] > n

What is the full path for this app including the app directory name?
Example: /Users/rrd/Sites/tulasi/myapp  
[/Users/rrd/Sites/tulasi/myapp] > /Users/rrd/Sites/tulasi/

Bake -app in /Users/rrd/Sites/tulasi/ (y/n) 
[y] > 


Baking...
---------------------------------------------------------------
Name: app
Path: /Users/rrd/Sites/tulasi/app
---------------------------------------------------------------
[M]odel
[C]ontroller
[V]iew

What would you like to Bake? (M/V/C) 
> m
---------------------------------------------------------------
Model Bake:
---------------------------------------------------------------
Possible Models based on your current database:
1. Termek
2. Termekcsoport
3. User

Enter a number from the list above, or type in the name of another model.  
> 2

Előszőr arról kérdez, hogy az akutális projectben kívánunk e dolgozni (Bake -app in /Users/rrd/Sites/tulasi/app (y/n)), aztán pedig ki kell választani, hogy modelt, view-t vagy controllert akarunk készíteni. előszőr mindig a modelt készítjük el, tehát M-et választunk. Ezután végrehajt egy keresést az AB-ban és felkínálja a táblákat a modell létrehozásához. Itt a 2-est választjuk ki, mivel a termékcsoport táblánk tartozik a termékcsoport modulhoz.

Given your model named 'Termekcsoport', Cake would expect a database table named 'termekcsoportok'.

do you want to use this table? (y/n) 
[y] > n

What is the name of the table (enter "null" to use NO table)?  
> termekcsoport

Would you like to supply validation criteria for the fields in your model? (y/n) 
[y] > n

Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n) 
[y] > 
One moment while I try to detect any associations...
Done.
---------------------------------------------------------------
Please confirm the following associations:
---------------------------------------------------------------

Ezután megkérdezi, hogy a Cake konvencióknak megfelelő termekcsoportok táblát akarjuk-e használni, amire nemet válaszolunk és megadjuk, hogy a termekcsoport táblát fogjuk használni.

Megkérdezi, hogy akarunk-e valamilyen vaidálást beépíteni amire most kivételesen és első ismerkedés gyanánt nemet válaszolunk.

A következő kérdésben arra kér választ, hogy a szóban forgó adattáblánk logikailag kapcsolódik-e más táblákhoz. Erre majdnem mindig igennel válaszolunk. (A Cake AB kapcsolatairól a Manual Model részének Section 4-es részén lehet olvasni). Rá fog kérdezni a lehetséges kapcsolatok típusára. Mivel a termékcsoport modellünk hasMany kapcsolatban áll a termékekkel erre válaszolunk igennel.

Termekcsoport hasOne Termek? (y/n) 
[y] > n

Termekcsoport hasMany Termek? (y/n) 
[y] > 

Would you like to define some additional model associations? (y/n) 
[y] > n

---------------------------------------------------------------
The following model will be created:
---------------------------------------------------------------
Model Name:    Termekcsoport
DB Connection: default
DB Table:   termekcsoportok
Associations:
            Termekcsoport hasMany   Termek
---------------------------------------------------------------

Look okay? (y/n) 
[y] > 

Ezután megkérdezi, hogy akarunk-e más AB kapcsolatot is definiálni, amire ezúttal nemmel válaszolunk. Ha minden stimmel egy y-nel elfogajuk és a bake script létrehozza a model filet a app/models/termekcsoport.php néven. Erről értesít is bennünket.

Creating file /Users/rrd/Sites/tulasi/app/models/termekcsoport.php
Wrote/Users/rrd/Sites/tulasi/app/models/termekcsoport.php

Cake test suite not installed.  Do you want to bake unit test files anyway? (y/n) 
[y] > n

Ha megnyitjuk a filet a következőt fogjuk látni:

<?php
class Termekcsoport extends AppModel {

  var $name = 'Termekcsoport';
  var $useTable = 'termekcsoport';

  //The Associations below have been created with all possible keys, those that are not needed can be removed
  var $hasMany = array(
      'Termek' =>
        array('className' => 'Termek',
            'foreignKey' => 'termekcsoport_id',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'dependent' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        ),

  );

}?>

Ezzel készen van az első modellünk, amit így végigolvasni kicsit hosszadalmas, de a bake scripttel kb 1 perc alatt a gyakorlatlan felhasználó is összehoz.

Termékcsoportok – controller

Mivel a termékcsoportunk adattáblája kapcsolva van a termékek adattáblához nem fogjuk tudni elkészíteni a controllert a bke scripttel addig amíg a termékek modelljét el nem készítjük. A termékek modelja ugyanúgy készül mint a termékcsoportoké, ha mindne rendben lefut, akkor a /app/models/termek.php fileunk a következőképpen fog kinézni:

<?php
class Termek extends AppModel {

  var $name = 'Termek';
  var $useTable = 'termek';

  //The Associations below have been created with all possible keys, those that are not needed can be removed
  var $belongsTo = array(
      'Termekcsoport' =>
        array('className' => 'Termekcsoport',
            'foreignKey' => 'termekcsoport_id',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'counterCache' => ''
        ),

  );

}
?>

Akkor mostmár jöhet a controller. Itt most nem fogjuk a bake scriptet használni, hanem helyette a CakePHP scaffold (gyorsváz) tulajdonságát. A /app/controllers/ könyvtárban hozzuk létre a termekcsoportok_controller.php filet a következő tartalommal:

<?php
class TermekcsoportokController extends AppController {

  var $name = 'Termekcsoportok';
  var $scaffold;
}
?>

Egyúttal létrehozhatjuk a termékek controllerjét is ugyanebba a könyvtárba termek_controller.php néven.

<?php
class TermekekController extends AppController {

  var $name = 'Termekek';
  var $scaffold;
}
?>

Termékcsoportok – view

A scaffold tulajdonság nem teszi nélkülözhetetlenné a view-ek készítését, így most ezt nem is tesszük meg.

Ha minden rendben lezajlott eddig akkor a http://localhost/~rrd/tulasi/termekcsoportok és a http://localhost/~rrd/tulasi/termekek linkek működni fognak és ezen lapok segítségével mind termékket mind termékcsoportokat tudunk listázni, hozzáadni, módosítani és törölni. Amint látni lehet a táblák rekordjai abban a sorrendben jelennek meg ahogyan azt az sql-ben megadtuk. A Cake arról is gondoskodik, hogy ah új terméket akarunk hozzáadni, akkor be tudjuk jelölni, hogy melyik termékcsoportba tartozik. Egyenlőre nem túl elegánsan a termékcsoport id-je van a listában, de ezt egyszerűan át tudjuk állítani. De erről már legközelebb.

Addig is az eddig elkészült dolgokkal mindenki vigyen be pár termékcsoportot, és terméket. Lehet próbálgatni mi van ha nincs kitöltve minden, mi van ha nem jelöljük be a terméknél a termékcsoportot, stb, hogyan tölrölhetünk, módosíthatunk. Érdemes egy tiszta adatbázist félrerakni a tesztelgetés előtt, mivel a rendszerünk egyenlőre nem ellenőriz semmiféle hibát, így könnyen összeszemetelhetjük az adatbázist félkész, vagy nem egymáshoz kapcsolt adatokkal, amelyek a rendszer további lépéseinél zavaróak lesznek.

Megjegyzés: A linkek nem magyarul jelennek majd meg ebben a verzióban mivel nem a bake-kel hanem a scaffold-dal készítettük el a controllert és ezzel a view-t).

14 thoughts on “CakePHP project építés 2. rész

  1. Hálás köszönet ezért a tutorialért!
    Ha belegondolok, hogy egy honlapon, egy admin felületnél, ahol hírek és kategóriák kezelését kellett megoldanom mennyit gépeltem…
    Ez a cake bejön nekem.

  2. Csatlakozom a köszönetet mondók seregéhez! Viszont lenne egy kérdésem: a ‘termek’ tábla létrehozásakor nem kellene szerepeltetni a
    FOREIGN KEY (termekcsoport_id) REFERENCES termekcsoport (id)
    sort?
    Elnézést, ha hülye a kérdés!

  3. Szia !

    Sikerült megcsinálnom amiket fent leírtál.
    Sajnos nem tudom futtatni a lapokat.
    Ha direktbe behívom a php-t akkor
    “Fatal error: Class ‘AppModel’ not found in C:\xampp\htdocs\laci\app\models\termekcsoport.php on line 2”
    üzenetet kapok.
    A localhost/laci/termekek pedig nem található.
    Kérlek segíts.
    Üdv: Laci

  4. Laci: Több helyen is lehet probléma. Első körben azt kellene megnézned, hogy a mod-rewrite működik-e vagy sem. A localhost a telepített webszervered gyökere. Ha az alá másoltál egy laci nevű könyvtárat és oda tetted a cake-et mit kapsz simán a localhost/laci-ra?

    Ha személyes könyvtárba raktad akkor ez ugye inkább localhost/~laci lesz.

  5. Üdv,

    Már többszöri nekifutásra próbálkozom az angol bake.php fájllal. Minden link tökéletesen müködik, még ha feltöltöm a két táblát, akkor a termékcsoportoknál megjelenik (view) az összes hozzátartozó termék is. Tehát ebből arra következtetek, hogy a két tábla közötti kapcsolat áll.

    De bármit csinálok, nekem a termék modosításánál a termékcsoport nem egy html selectben jelenik meg, hanem csak egy text html elemben. Gépeljem be az ID-t…

    feltettem ide
    http://fi76.extra.hu/cakephp/proba.zip
    az egész tákolmányom.

    Mi lehet a gond? Esetleg az itt készült alkotások nem tölthetők le valahogy? Hátha össze tudnám vetni.

  6. nova76: Belenéztem a kódodba, valószínűleg az okozza a gondot, hogy a termékek modellben nem definiáltad a kapcsolatot a termékcsoportokkal, csak a termékcsoportok modellben defináltad annak a kapcsolatát a termékekkel.

    Szóval a /app/models/termekek.php fájlban kellene lennie egy ilyennek:
    var $belongsTo = array(
    ‘Termekcsoport’ =>
    array(‘className’ => ‘Termekcsoport’,
    ‘foreignKey’ => ‘termekcsoport_id’,
    ‘conditions’ => ”,
    ‘fields’ => ”,
    ‘order’ => ”,
    ‘counterCache’ => ”
    ),

    );

  7. rrd, köszi szépen. Igazad volt.
    Most viszont azzal küzdök, hogy 1.2 alatt szeretném ugyanúgy elérni, hogy az abban lévő script fájl kérdezgessen ki. De sehogy sem jövök rá. A bake.php nem használható, mert a shell osztályt keresi, talán valami mással indul(?). Cake.php, vagy cake.bat? Nincs valami, a Tiétekhez hasonló tutorial, csak 1.2 alá?

  8. nova76: Az 1.2-ben továbbfejlesztették a bake-et, a cake/console/ könyvtárban a cake paranccsal indíthatod. Az 1.2-höz sokkal jobb a manual mint az 1.1-hez volt, érdemes ránézni. A magyar fordítással lassacskán de haladok, remélem találok valakit aki besegít.

  9. Szia!
    Nekem olyan problémám lenne, hogy amikor elindítom a commandot, utána beírom a scripts mappa elérését és amikor begépelem, hogy php bake.php, akkor a parancsot nem ismeri fel. Lehet, hogy én vagyok gyökér hozzá, mert soha nem használtam keretrendszert, inkább magam irogattam meg minden sor kódot, viszont a cikk láttán ki akarom próbálni.
    Válaszodat előre is köszönöm!

    Üdv.:
    Gabesz

  10. Gabesz: Melyik cake 1.1 vagy 1.2? Az 1.2-ben eléggé megváltozott a bake működtetése. Nézd meg a manualt, ugyan ez a részt még nem fordítottam le, de szerintem eligazodsz rajta.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.