Oddělení validace formulářů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
frosty22
Člen | 373
+
+1
-

Zdravím Vás,

zajímalo by mě, zda-li již někdo neřešil oddělení validace formulářových prvků od jejich reprezentace. Konkrétně se mi jedná o to, kdy například přijímám data buď pomocí formuláře, nebo mocí importu či SOAP přístupu apod. V tomto případě mnohé property validuji jak na místě buď entity (jedná-li se o skalární záležitosti) nebo nějaké procesní třídy, která zařizuje ukládání a zároveň i tedy ve formuláři. Líbila by se mi možnost, kde by šlo toto skloubit a měl nějaký objekt reprezentující validaci dané property a to bych nastavil jak na formulářový controler, tak i například při importu.

Řešil již někdo něco podobného? Děkuji

Šaman
Člen | 2666
+
0
-

Řešilo se to v diskuzi o vývoji frameworku. Validátory tak, jak jsou teď jsou jen formulářové. Bylo by dobré vyčlenit je do samostatné třídy. Nevím ale jakou to má prioritu a jestli se tak v dohledné době stane.

Editoval Šaman (30. 3. 2013 22:50)

Šaman
Člen | 2666
+
0
-

Díky za info, Nette opět předběhlo očekávání. :)

frosty22
Člen | 373
+
0
-

O této třídě vím, bohužel to neřeší přímo můj problém – tímto mohu validovat data, avšak validační pravidla musím mít též na dvou místech – v definici formuláře a v nějakém servisním objektu, například pro import apod.

No chvilku jsem si víkend hrál a z části jsem si vyřešil svůj problém, ale jen takové ALPHA řešení. Pro ukázku mi to nyní funguje následovně, ale ještě to musím dost rozšířit, ale zatím to svůj účet plní dobře, ale jak píši je to ALPHA a musím ještě dost věcí vyřešit:

<?php
// Příklad validátoru
class UserValidator extends Validation\ValidatorCollection
{
    public function __construct()
    {
	$this->add("email", new EmailValidator());
	$this->add("password", new LengthValidator(5));

	$this->add("born", new DateValidator());
	$this->add("born", new DateRangeValidator(new Date("1.1.1920"), new Date()));

	$this->add("ic", new IcValidator());
    }
}

// Příklad služba, která ukládá záznam
class CreateUser {

    /** @var UserValidator $validator */
    private $validator;

    ....

    public function save(array $data)
    {
        // Zvalidujeme pole pomocí validátoru
	if ($this->validator->validate($data)) {
	    // validní
        } else {
	    // nevalidní
        }
    }

}


// Příklad formuláře
class UserForm extends BaseForm {

    public function __construct(UserValidator $validator)
    {
	$this->addText("name", "Jméno");
	$this->addText("email", "E-mail");
	$this->addText("password", "Heslo");
	$this->addText("ic", "IČ");
	$this->addText("born", "Datum narození");

	// Připojíme validator a nastavíme z něj validační pravidla
	$this->setValidatorCollection($validator);
    }

}
?>

Editoval frosty22 (31. 3. 2013 19:00)

David Ďurika
Člen | 328
+
0
-

mozes spravit nieco taketo:

<?php
// Příklad formuláře
class UserForm extends BaseForm {

    public function __construct(UserValidator $validator)
    {
	$this->validator = $validator;
        $this->addText("name", "Jméno");
        $this->addText("email", "E-mail");
        $this->addText("password", "Heslo");
        $this->addText("ic", "IČ");
        $this->addText("born", "Datum narození");

        // Připojíme validator a nastavíme z něj validační pravidla
        $this->onValidate[] = callback($this, 'validation');
    }

    public function validation(UserForm $form)
    {
	$values = $form->getValues();
	$errors = $this->validator->validate($values); // alebo si tam predas cely form
	// poseles errory uzivatelovy
    }
}
?>

problem je v tom ze o validacnych pravidlach nevie formular… tem padom ti JS validacia nepojde…

Editoval achtan (31. 3. 2013 19:37)

frosty22
Člen | 373
+
0
-

Ten příklad nahoře je funkční, jen ukazuji API jak se s tou knihovnou pracuje. Jinak i JS validace mi fungují v tomto, jelikož mapuju ty Validatory na addRule v části AppForm metodě setValidatorCollection

David Ďurika
Člen | 328
+
0
-

cav, akurat riesim podobny problem…

ako si na tom s tym validatorom? pokrocil si nejako? mohol by si to niekam uploadnut…

Editoval achtan (7. 5. 2013 8:18)