Mi várható a Symfony 1.1-ben – 3. rész

A symfony 1.1 gyakorlatilag készen áll, lássuk milyen változások/újdonságok várható az új kiadásban.
A leí­rás Fabien Potencier, International PHP 2007 Conference előadásának fóliái alapján készült.

Az új Form és Validation keretrendszer.

áttekintés – mi is az űrlap

Űrlapot mindenki látott, sőt használt is már. De miből is áll? átalában különböző tí­pusú beviteli mezők (text, textarea, select, checkbox, radio) és az ehhez kapcsolódó cimkék (sőt időnként még magyarázó szövegek) valamilyen struktúrája.
Természetesen sokszor szükség van megszorí­tásokra az egyes mezőkbe felvihető adatokkal kapcsolatban, ezért ellenőrzéseket végzünk (validálunk). Ennél persze többről van szó: soha ne bí­zz a felhasználótól érkező adatban – akkor is ellenőrizni kell az adatokat, ha az elvileg olyan formában jelenik meg, melyet mi határozunk meg (választók: select, checkbox, …).
Miután az ellenőrző részek szorosan kapcsolódnak az űrlap egyes mezőihez, ezért ha azt ábrázolni szeretnénk, akkor az űrlap struktúrájával többé-kevésbé megegyező szerkezet lenne a kézenfekvő.

Akkor miről is van szó?

Tehát az új Form és Validation keretrendszer. A fenti bevezetőből sejthető, hogy nem egyszerűen átalakí­tották (hiszen eddig FormHelper és Validator formájában voltak jelen), hanem egy teljesen új megközelí­tést alkalmaztak. Itt a hangsúlyt a struktúrára helyezném. Tetszőleges bonyolultságú struktúrák í­rhatók le mindkét részről, az egészen egyszerű 1-2 mezős dolgoktól a több, különböző struktúrát magában foglaló űrlapokig:

  • űrlap mezők: Widget (sfWidget alaposztály)
  • űrlap ellenőrzés: Validator (sfValidator alaposztály – a korábbi sfValidatorBase néven érhető el)

A fenti két osztályt (hierarchiát) pedig az sfForm köti össze.

Igazság szerint ezek a rendszerek teljesen függetlenek egymástól, akár a symfony-n kí­vül is simán használhatók. A Validator-ok egészen pontosan tömböket (adott szerkezettel) ellenőriznek, maga az adat nem csak űrlapból jöhet (pl. XML).

A puding próbája…

Elég az elmék összezavarásából, nézzünk néhány példakódot.😉

// Egyszerű mezők létrehozása:
// input
$w = new sfWidgetFormInput();

// select
$w = new sfWidgetFormSelect(array('choices'=>array(...)));

// radiobutton
$w = new sfWidgetFormSelectRadio(array('choices'=>array(...)));

// textarea
$w = new sfWidgetFormTextarea();

// megjelení­tés
echo $w->render('ez_itt_a_name_mezo', 'ezzel az értékkel');

Minden űrlap elemnek megvan a maga widget megfelelője. Minden widget egy objektum, amely képes az általa ábrázolt html elemet lerenderelni (nem csak form elemet; pl az sfWidgetFormIdentity egy egyszerű szöveget reprezentál). Minden elem az sfWidget-ből származik, amely néhány hasznos funkciót biztosí­t: renderTag(), renderContentTag(), karakter kódolás támogatása, xhtml és html lezárók támogatása.
Minden űrlap elem az sfWidgetForm osztály leszármazotja, amely néhány alapvető funkciót valósí­t meg (pl. id generálás).

A fenti példából látszik, hogy ha meg szeretnénk jelení­teni az elemet, egyszerűen kií­ratjuk a render() metódus eredményét. A render() hí­váshoz 1 paramétert mindenképpen meg kell adnunk (de kettő sem árthat):
1. paraméter: az elem neve
2. paraméter: az elem értéke.
Tehát ha létre szeretnénk hozni 2 beviteli mezőt, ahol az egyik a vezeték, a másik a keresztnév, valamint ezek aktuális értéke a $data tömb megfelelő kulcsa alatt van:

$w = new sfWidgetFormInput();
echo $w->render('first_name', $data['first_name']);
echo $w->render('last_name',  $data['last_name']);

Mindehhez elég egyetlen widget-et létrehozni és azt különböző paraméterekkel megetetni.

Ami izgalmasabb téma, az az sfWidgetFormSchema osztály. Ezzel tudunk leí­rni űrlap struktúrákat. Ehhez pusztán egy asszociatí­v tömböt kell átadni az objektum létrehozásakor, ahol a kulcsok a mezők nevei, az értékek pedig a mezők (sfWidget leszármazottak).

$input = new sfWidgetFormInput();
$fieldSet = array(
  'first_name' => $input,
  'last_name'  => $input,
);
$author = new sfWidgetFormSchema($fieldSet);

Miután az sfWidgetFormSchema őse az sfWidgetForm, ezért mezőnek megadhatunk egy másik sémát is. Az előző példát felhasználva:

$fieldSet = array(
  'title'     => $input,
  'sub_title' => $input,
  'author'    => $author
);
$book = new sfWidgetFormSchema($fieldSet);

A végső cél persze saját formok összeállí­tása, hogy azt a későbbiekben bárhol használhassuk. Ehhez új osztályt kell származtatni az sfWidgetFormSchema osztályból.

class BookWidgetFormSchema extends sfWidgetFormSchema {

  public function configure($options = array(), $attributes = array()) {
    parent::configure($options, $attributes);

    // widgetek letrehozasa
    $input = new sfWidgetFormInput();
    $text  = new sfWidgetFormTextarea();
    $date  = new sfWidgetFormDate();
    $category = new sfWidgetFormSelect(array('choices' => $this->getCategories()));
    $sub_category = new sfWidgetFormSelectRadio(array('choices' => $this->getSubCategories()));

    // mezok osszeallitasa
    $fieldSet = array(
      'title'        => $input,
      'sub_title'    => $input,
      'description'  => $text,
      'published_at' => $date,
      'category'     => $category,
      'sub_category' => $sub_category
    );

    // mezok felvetele a semaba
    foreach ($fieldSet as $name => $value) {
      $this[$name] = $value;
    }
  }

  private function getCategories() {
    return array(
      'drama' => 'Drama',
      'scifi' => 'Sci-fi',
      'adv'   => 'Adventure',
      'krimi' => 'Krimi'
    );
  }

  private function getSubCategories() {
  	return $this->getCategories();
  }

}

Ebben az esetben a configure() metódust í­rtuk felül (ami alapesetben nem csinál semmit). Ez két paramétert vár, mindkettő tömb. Az első az $options, a második az $attributes. Remélem ezek pontos funkciójáról születik majd egy leí­rás, játszadozásaim alatt csak az engem érdeklőket kerestem meg.
Külön felhí­vnám a figyelmet, hogy bár az sfWidgetForm tartalmaz egy $fields tulajdonságot, ne azt használjuk, mert az “csak” a mezőket tárolja, rendereléskor azonban a sorrend alapján jelennek majd meg, amit viszont a $positions tulajdonság tartalmaz. Ezért érdemes az osztály publikus felületét használni ($this[‘mezo_neve’]), amely mindkét tulajdonságot beállí­tja.

Természetesen bármely elemből hozhatunk létre testreszabott sajátot is, ami sok esetben hasznos lehet.

Végszó

Röviden átnéztük a űrlapkészí­tés módszerét, az sfWidget és leszármazottai használatát. Ez persze még nem a teljes kép, a következő részben az sfValidator és kompániája kerül képbe, illetve az sfForm osztály.

Kategória: 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