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

cakephpKezdjük el módosítani, személyre szabni, fejleszteni és elrontani a bake script által generált kódot, építsünk be némi kis biztonságot a beérkezett adatok ellenőrzésével és használjuk ki a helpereket amiket kihasználhatunk. Megjegyzés azok számára akik a 2. és 3. részt jún. 18. előtt olvasták: némileg módosítottam az AB szerkezetet és emiatt sok minden változott ezekben a részekben, így érdemes átfutni őket még egyszer. Bocsi.

Hiányosságaink

A termékek szerkesztésénél és új termékek hozzáadásánál a selectben most nem a termékcsoportok nevei, hanem azok id-jei szerepelnek. Ez így kissé fapados, módosítanunk kellene.

ID-k cseréje nevekre

Szóval az a bajunk, hogy a selectben id-k jelennek meg nem pedig a termékcsoportok nevei. Kicsit programozóbban meghatározva nem jó adatokat szedünk ki az adatbázisbóll. Maradva az MVC mintánál nagy valószínűséggel a controllerben kell valamit átalakítanunk. De hogy mit azt a view fileból tudhatjuk meg. Ha megnyitjuk a /app/views/termekek/hozzaad.thml vagy a szerkeszt.thml fileokat, akkor látni fogjuk benne, hogy a select így néz ki:


echo $html->selectTag('Termek/termekcsoport_id', $termekcsoportok, $html->tagValue('Termek/termekcsoport_id'), array(), array(), false);

A selectTag helper paraméterei a következők:
$html->selectTag(mezőnév,értékek tömbje, selected elem, select attribútomok, option attribútomok, mutassa-e a selectet ha üres az option tömb?, adjon-e vissza értéket?)

Nyissuk meg a termekek_controller.php filet. Ha ránézünk a fenti selectTag-ra akkor láthatjuk, hogy a $termekcsoportok változó alapján tölti fel a selectet. Ha keresgélünk a controllerben fogunk találni egy-két ilyen sort:
$this->set('termekcsoportok', $this->Termek->Termekcsoport->generateList());
Ez a sor az, ami a set metódus segítségével beállítja a változónkat.

A generateList() függvénynek a következő paramétereket adhatjuk át:
generateList(feltételek – stringént vagy tömbként pl “id<100", sorrend - az sql lekérdezés ORDER BY része, pl "ar DESC", limit - az sql LIMIT része, a kulcsként szolgáló érték pl "{n}.Termekcsoport.id", az értékként szolgáló érték - pl "{n}.Termekcsoport.termekcsoport") A két utolsó paraméterben a "{n}" előttem is homályos, mindenesetre nélüle nem fog működni a dolog. Akkor cseréljük a fentihez hasonló sorokat valami ilyesmire: $this->set(‘termekcsoportok’, $this->Termek->Termekcsoport->generateList(null, ‘Termekcsoport.termekcsoport’, null, ‘{n}.Termekcsoport.id’, ‘{n}.Termekcsoport.termekcsoport’));

Úgy számoltam, hogy 4 helyen kellett a kódot cserélni. Ha most megnézzük működés közben a hozzad és a szerkeszt metódusainkat akkor azt kell tapasztalnunk, hogy az id-k helyére bekerültek a termékcsoportok nevei, és rögzítés után a termek táblába a megfelelő id-k kerülnek rögzítésre.

Adatbázis konzisztencia

Ez a csúnya szó azt jelenti, hogy arról még nem gondoskodtunk, hogy ne kerüljenek hiányosan kitöltött adatok az adatbázisba. Most elég egy terméknél csak egyetlen egy adatot kitölteni – mondjuk az árat és rögzíteni tudjuk. Ez nem igazán felel meg az elvárásainkank, mert azt szeretnénk, hogy csak akkor legyenek az adatbázisba elmentve ha minden adat hiánytalanul ki van töltve. Megint csak MVC-ben gondolkodva a modellünket akarjuk finomítani, így most a /app/models/termek.php file fog terítékre kerülni.

Mielőtt elővennénk a bake scriptet aki még nem tette meg az módosítsa a /app/config/inflections.php filet. $irregularPlural = array('termek' => 'termekek'); Ezzel a Cake tudtára adtuk, hogy azt szeretnénk, hogy a termek szóból úgy képezne többesszámot, hogy termekek legyen belőle. Egyébként ez a javasolt módja az angol nyelvtől eltérő többesszám képzés definiálásának.

Ha ez megvan akkor jöhet megint a bake!

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

Az eleje a szoksásos könyvtár átállítási mizéria, amit díjaznék ha valaki elmondaná, hogy hogyan lehet elkerülni. 🙂 Kiválasztjuk, hogy meodellt akarunk létrehozni.

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

Méghozzá a termék modellt.

Given your model named 'Termek', Cake would expect a database table named 'termekek'.

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

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

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

Igen, pont ez a célunk. Most rá fog kérdezni az adattábla minden egyes oszlopára, hogy melyikhez milyen kritériumot akarunk meghatározni.

Name: id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[5] > 

5 féle ellenőrzési metódust választhatunk:

  1. VALID_NOT_EMPTY: nem lehet üres a mező, vagyis kitöltése kötelező,
  2. VALID_EMAIL: valami e-mail címre hasonlító dolognak kell lennie,
  3. VALID_NUMBER: szám
  4. VALID_YEAR: év
  5. nincs ellenőrzés

Mivel az id egy auto increment mező nem szükséges ellenőrizni, mert úgy is az adatbzis fogja legenerálni az értékét. Sőt ha jobban szemügyre vesszük a termékek felvitelére szolgáló formot a bake amikor azt elkészítette olyan intelligens volt, hogy nem is rakott ki olyan inputot amivel ennek értéket tudnánk adni.

Name: termekcsoport_id
Type: integer
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[1] > 3

Itt számot várunk, amit úgy is a program fog generálni, de azért biztos ami biztos.

Name: termeknev
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[1] > 

Mivel string típusú a termeknev mező ezért a bake magától a VALID_NOT_EMPTY kritériumot kínálja fel. Ez jó lesz nekünk.

Name: kiskerar
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[1] > 3

Ide számokat várunk, habár az adatbázisban nem számként definiáltuk a mezőt.

Name: leiras
Type: text
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[1] > 

Ez jó lesz így ahogy van.

Name: kep
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[1] > 

Ez is.

Name: suly
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[1] > 3

Ez is jó lenne éppen, de inkább állítsuk számra.

Name: hatas
Type: string
---------------------------------------------------------------
Please select one of the following validation options:
---------------------------------------------------------------
1- VALID_NOT_EMPTY
2- VALID_EMAIL
3- VALID_NUMBER
4- VALID_YEAR
5- Do not do any validation on this field.

... or enter in a valid regex validation string.

  
[1] > 

Meg ez is.

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

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

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

Hát igen, ezeket most újra be kell állítanunk, mivel a bake mindig a nulláról kezdi el az építkezést.

---------------------------------------------------------------
The following model will be created:
---------------------------------------------------------------
Model Name:    Termek
DB Connection: default
DB Table:   termekek
Validation:    Array
(
    [termekcsoport_id] => VALID_NUMBER
    [termeknev] => VALID_NOT_EMPTY
    [kiskerar] => VALID_NUMBER
    [leiras] => VALID_NOT_EMPTY
    [kep] => VALID_NOT_EMPTY
    [suly] => VALID_NUMBER
    [hatas] => VALID_NOT_EMPTY
)

Associations:
            Termek belongsTo Termekcsoport
---------------------------------------------------------------

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

Igen, ezt szeretnénk.

Creating file /Users/rrd/Sites/tulasi/app/models/termek.php
File exists, overwrite? /Users/rrd/Sites/tulasi/app/models/termek.php (y/n/q):y

Hoppá! Már létezik a file. Biztos azért mert az előző részben már egyszer létrehoztuk. Nem baj, írjuk felül, hogy belekerüljenek a validálási kritériumok.

Wrote/Users/rrd/Sites/tulasi/app/models/termek.php

Cake test suite not installed.  Do you want to bake unit test files anyway? (y/n) 
[y] > n
rrd:~/Sites/tulasi/cake/scripts rrd$ 

És kész.

Ha most megpróbálunk úgy berögzíteni egy új terméket, hogy nem megfelelően töltjük ki a mezőket, akkor kellemes meglepetésben lesz részünk. A Cake szépen teleaggatja mindenféle hibaüzenttel az oldalt, és nem menti el a hiányos adatokat. Ha a hibaüzeneteket szeretnénk átírni akkor a view fileokban a tagErrorMsg részeket kell módosítanunk.

A következő részben a bejövő adatok ellenőrzéséről lesz szó.

One thought on “CakePHP project építés 4. rész

  1. Szia!

    Tetszik ez a sorozat, gratulaok hozza!
    Egy tipp a “könyvtár átállítási mizéria”-ra:

    Project letrehozasa:
    php bake.php -project /home/en/stb/project_neve

    Majd az M/V/C -nel:
    php bake.php -app project_neve

    Sok sikert!

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.