7 nap a Symfony1.1 rendszerrel – Űrlapok, Widget-ek és Validator-ok (3. nap)

Ez alábbi bejegyzés a Thatsquality.com oldalon található 7 Days of Symfony1.1 – Forms, Widgets and Validators (Day3) í­rás fordí­tása, Ryan Weaver jóváhagyásával.

Widget-ek és validator-ok testre szabása és végül az adatok mentése

íœdv a symfony 1.1, új űrlap keretrendszert bemutató sorozatának 3. napján. Korábban megnéztük az automatikusan generált Propel Form objektumokat. Most letisztázzuk az űrlapokat és használhatóvá tesszük őket.

Korábban, láttuk hogyan kell felépí­teni, elküldeni egy űrlapot (ellenőrzéssel együtt), ám még nem mentettük el az í­gy kapott adatokat. Most a következő viselkedéssel fogjuk ellátni űrlapunkat:

  • ha az űrlap el lett küldve, de elbukott az ellenőrzésen, az objektumot nem mentjük és visszaadjuk az űrlapot a felhasználónak további adatbevitelre, korrigálásra
  • ha az ellenőrzés sikeres, akkor mentjük az adatokat az adatbázisba és visszaadunk a felhasználónak egy üres űrlapot, ahol felvehet egy újabb szerzőt
public function executeEditAuthor() {
  $this->form = new AuthorForm();
  if ($this->getRequest()->isMethod('post')) {
    $this->form->bind($this->getRequestParameter('author'));
    if ($this->form->isValid()) {
      $this->form->updateObject();
      $this->form->save();
      $this->getUser()->setFlash('message', 'author saved successfully');
      $this->form = new AuthorForm();
    }
  }
}

Néhány dolgot adtunk csak hozzá. Emlékezzünk az előző részre, ahol a bind() metódust az elküldött adatok és a form objektum összekapcsolására használtuk. Most meghí­vjuk az isValid() metódust, ami igaz, ha az elküldött adatok átmennek az ellenőrzésen. Most már tudjuk, hogy az űrlapunk megfelelő, frissí­tjük és mentjük az objektumot.

// This transfers the validated data from our form object to the AuthorForm object that is associated with our form
$this->form->updateObject();
// This performs the save on the propel object, effectively saving the model to the database
$this->form->save();
// Let's setup a flash message to display. Notice that this is no longer accessible via $this->setFlash() - another Symfony 1.1 change
$this->getUser()->setFlash('message', 'author saved successfully');
// Create a new, blank author form so that we have a blank form with which we can make more authors
$this->form = new AuthorForm();

Megjegyezném, hogy ha az űrlap hibás adatokat kapott (nem valid), akkor egyszerűen csak újra megjelení­tjük azt – hibaüzenetekkel és a korábban felvitt adatokkal együtt. A template tetéjre vegyük fel a következőket a flash üzenet megjelení­téséhez:

hasFlash('message')) : ?>
getFlash('message'); ?>

Próbáljuk ki, feltételezve, hogy helyes adatokat vittünk fel – persze az ellenőrzésünk elég gyengécske most még. Az űrlap elmenti a szerző adatait az adatbázisba, kií­rja a mentés sikerességét, majd visszatér egy üres űrlappal.

Mi következzen most? Javí­tsunk egy kicsit az űrlapunkon. Azoknak, akik nem próbálták ki eddig az űrlapot: a születésnap mező jelenleg hibásan működik, a jelenlegi év 5 éves környezetét jelení­ti meg. Változtassuk meg ezt. Az űrlapon végzett változtatások nem lesznek action-függők (azt szeretnénk, ha a születésnap mindig az aktuális évet megelőző lehessen csak). Változtatásainkat az AuthorForm.class.php fileon végezzük (lib/form könyvtár). Emlékezzünk vissza, hogy a configure() metódus minden űrlap létrehozáskor lefut, tehát ez tökéletes hely a változtatások elhelyezésére.

public function configure() {
  $widget_schema = $this->getWidgetSchema();
  $birthday_widget = $widget_schema['birthday'];

  $years = range(date('Y') - 75, date('Y') - 10);
  $birthday_widget->setOption('years', array_combine($years, $years));
}

Nézzük végig mit is csináltunk. Először beszereztük a születésnap widget-et. Ehhez elsőként meg kell hí­vnunk a getWidgetSchema() metódust, amely egy tömbszerű objektummal tér vissza, ez tartalmazza az aktuális űrlap widget-eit. A widget schema a BaseAuthorForm osztályban készül el (lásd előző napi leí­rásban bemutatottak).

Miután beszerzetünk a widget schema-nkat, hozzáférhetünk a születésnap widget-hez egyszerűen annak ‘birthday’ indexével.

// visszatér a widget-eket tartalmazó, tömbszerű objektummal
$widget_schema = $this->getWidgetSchema();
// a születésnap widget beszerzéséhez egyszerűen használjuk a nevét
// (a 'birthday' a schema.yml fileból jön),
// mint a $widget_schema egy elemét
$birthday_widget = $widget_schema['birthday'];

Most hogy megvan a kí­ván objektum, változtassuk meg az év mező intervallumát. álljunk meg egy pillanatra és nézzük meg a widget opciókat. Egy adott widget beállí­tása az opcióin keresztül történik. Minden widget különböző opciókkal bí­r, és ha majd elkészül a widget dokumentáció, könnyedén be tudjuk majd állí­tani bármelyiket. Ebben az esetben (sfWidgetFormDate, amely a születésnap mezőt kezeli) lássunk néhányat:

format       - a három mező formátuma, '%month%/%day%/%year%' az alapértelmezett
days         - megjelení­téshez a napokat tartalmazó tömb
months       - megjelení­téshez a hónapokat tartalmazó tömb
years        - megjelení­téshez az éveket tartalmazó tömb
can_be_empty - megengedhető-e üres választási lehetőség - alapból igaz
empty_values - üres érték esetén megjelnő szöveg, ha a can_be_empty igaz

A születésnap év mezőjének megváltoztatásához meg kell változtatni a widget ‘years’ opcióját.

// beállí­tja az intervallum tömböt:
// a mai dátumnál 90 évvel korábban kezd
// és 10 évvel korább fejeződik be
$years = range(date('Y') - 90, date('Y') - 10);
// a setOption() metódussal változtatható meg a widget év opciója
$birthday_widget->setOption('years', array_combine($years, $years));

Próbájuk ki. Most már a megfelelő éveket látjuk.

Min kellene még változtatni? A years_experience mező túl hosszú. Ez csak olyan értékeket fog elfogadni, mint az “5” vagy “15”, tehát egyszerűsí­tsük le. Vissza a configure()-hoz és adjuk hozzá a következő kódot:

$widget_schema['years_experience']->setAttribute('size', 3);

A dolgunk most egyszerűbb. Először is a $widget_schema-ból most már könnyen kinyerjük a years_experience mezőt. Majd a setAttribute()metódussal beállí­tjuk a ‘size’ értékét 3-ra. Ha még nem világos, a widget “attribute” része í­rja le annak html attribútumait (pl. class, style, onclick, stb.). Bármely widget rendelkezik setAttribute() metódussal, és az í­gy beállí­tott értékeket a symfony automatikusan megjelení­ti az űrlapelemekben. Ebben az esetben a years_experience mezőben size=”3″ – pont a megfelelő hossz.

Még egy gyors módosí­tás a years_experience mezőn. Bár a mező csak számokat fogad el (miután ezt egésznek /integer/ definiáltuk), tegyük tisztává a felhasználó előtt, hogy valóban számokat várunk, nem pedig olyamit, hogy “tí­z”. Ehhez adjunk egy alapértelmezett értéket a mezőnek:

class AuthorForm extends BaseAuthorForm {
  public function configure() {
    ...
    $this->setDefault('years_experience', 0);
    ...

Ennyi. Mostantól, anélkül, hogy külön értéket rendelnénk a ‘years_experience’ mezőhöz, mindig 0-val fog kezdeni.

Egyre több mindent tudunk kezdeni most már az űrlapokkal. Sok widgetet még nem is láttunk, és nem adtunk igazi ellenőrzést még kedvenc űrlapunkhoz. Legközelebb az ellenőrzés tárgykörét járjuk körül, még hasznosabbá téve űrlapunk. A következő részekben több widget-tel találkozunk majd, láthatjuk a köztük lévő kapcsolatok kezelésének mikéntjét, megtanuljuk használni az űrlap dekorátorokat és még sok minden mást is.

Kategória: dokumentáció, php, symfony
Címke: , , ,
Közvetlen link a könyvjelzőhöz.

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

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s