symfony űrlapok részleges ellenőrzése

Mostanában megnéztem magamnak a Zend Frameworköt. A zf is biztosít egy saját űrlap készítési módozatot. Ami megfogott benne az az, hogy az űrlapokat részlegesen is lehet ellenőrizni, tehát csak a mezők egy részét adjuk át neki (Zend_Form::isValidPartial()).

Erre jelenleg symfonyban nincs lehetőség, pedig nagyon kényelmes és rugalmas megoldás tudna lenni. Egészen pontosan az embeded form megoldást valószínűleg ennek kezelésére találták ki (nem tudok másra gondolni), viszont könnyen lehet rá példát mondani, ahol ez a megoldás már inkább nyűg mint feature.

Erre a részleges validálási problémára ad egyfajta megoldás az alábbi kód.

class MyForm extends sfForm
{
// ...
  /**
   * Bind a part of the form to perform a partial validation
   *
   * Pre and post validation is not available
   *
   * @param  array $taintedValues
   * @param  array $taintedFiles
   * @return void
   */
  public function bindPartial(array $taintedValues = null, array $taintedFiles = null)
  {
    $current_schema = $this->validatorSchema;

    $validators = array();

    if (null !== $taintedValues) {
      $validators = array_merge(
        $validators,
        $this->preparePartialValidatorSchema($taintedValues, $current_schema)
      );
    }

    if (null !== $taintedFiles) {
      $validators = array_merge(
        $validators,
        $this->preparePartialValidatorSchema(self::convertFileInformation($taintedFiles), $current_schema)
      );
    }

    $this->validatorSchema = new sfValidatorSchema($validators, $current_schema->getOptions(), $current_schema->getMessages());

    $this->bind($taintedValues, $taintedFiles);

    $this->validatorSchema = $current_schema;
  }

  /**
   * Convert validator schema to array
   *
   * @param  array             $values
   * @param  sfValidatorSchema $schema
   * @return array
   */
  protected function preparePartialValidatorSchema(array $values, sfValidatorSchema $schema)
  {
    $validators = array();

    foreach ($values as $field => $value) {
      if (is_array($value) && isset($schema[$field]) && $schema[$field] instanceof sfValidatorSchema) {
        $class = get_class($schema[$field]);
        $validators[$field] = new $class($this->preparePartialValidatorSchema($value, $schema[$field]));
      } elseif (isset($schema[$field])) {
        $validators[$field] = $schema[$field];
      }
    }

    return $validators;
  }
// ...
}

És használat közben:

//...
$form = new MyForm();
$form->bindPartial($request->getParamterer('partial_data'));
if ($form->isValid())
{
  // ...
}
//...

Mint mindig: mindenki csak saját felelősségére használja. Nem nagyon teszteltem, inkább koncepció kód, mintsem másold és használd fajta. Elvileg az embeded formokat is kezeli, gyakorlatilag tesztelés szükséges.

Kategória: fejlesztés, php, symfony
Címke: , , , ,
Közvetlen link a könyvjelzőhöz.

3 hozzászólás a(z) symfony űrlapok részleges ellenőrzése bejegyzéshez

  1. j. szerint:

    Ez nagyon zsír, csak nem igazán értem, hogy hol használható, mert ugye egy Symfony űrlap egyáltalán nem űrlap hanem csak widget konténer, amit tetszőlegesen kombinálhatok, embedelhetek stb. Ha viszont egy űrlap FORM tag közé teszem és elpostolom akkor onnantól kezdve nekem az jó ha mindent levalidálok ami a FORM tagon belül van. Ezek szerinte a Zend tudja azt, hogy postolás után csak az első 3 widgetet (mezőt) validálja?🙂 vagy nem értem és egészen máshol van a Nagy Szellemi Élmény a dologban?🙂

  2. Sulik Szabolcs szerint:

    Pontosan.

    Ha van egy rakat meződ egy userhez mondjuk, és az adatait több körben szeretnéd bekérni, akkor ha csak a mezők egy általad meghatározott részét adod át is működik (és jól működik) a dolog, nem kell a validator sémának az allow_extra_fields, filter_extra_fields opcióival játszani. Neked nem kell azzal sem foglalkoznod, hogy a mezők melyik részét határoztad meg, azt majd a bindPartial összeszedi.

    Az embed form is jó lehet a fenti példában, viszont ha az alkalmazás másik öt helyén is kell adatot bekérni a usertől, és valszeg nem lesznek ezek a részhalmazok diszjunktak, akkor lőheted az embed formjaidat. Ez viszont szépen működ.🙂

    Emellett ez a megoldás csak a validálás idejére cseréli le a validátor sémát, utána visszaállítja az eredetit. Hátránya, hogy a pre és post validátorok nem működnek.

    Hamarosan tovább is folytatódik a történet (van még néhány cikk a tarsolyomban :)).

  3. j. szerint:

    Oké! Meggyőztél a példáddal!🙂

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