Rozšíření základních validačních pravidel

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

Je možné rozšířit funkčnost základních validačních pravidel formulářů (Form::MAX_LENGTH)? Případně jak? Děkuji

Jan Endel
Člen | 1016
+
0
-

Ale jistě, že to jde. Odkážu tě na perfektní článek od Pandy který o tomto pojednává.

Pan Dobrman
Člen | 45
+
0
-

Mě jde spíše o to, abych mohl rozšířit funkčnost formulářového validátoru MAX_LENGTH. Podle článku jsem si vytvořil něco takového, ale nevím, jak například předat zprávu při chybě.

class Validator
{
    const MAX_LENGTH = 'Validator::validateMaxLength';

    public static function validateMaxLength(IControl $control)
    {
	//...
	return $control->addRule(Nette\Forms\Form::MAX_LENGTH, null, 16);
    }
}
Jan Endel
Člen | 1016
+
0
-

Pravděpodobně jsme se úplně nepochopili, tvoje metoda validateMaxLength by měla vracet jenom true/false na základě toho, jestli podmínkou tato hodnota prošla. To tvé addRule patří až přímo do formuláře.

Pan Dobrman
Člen | 45
+
0
-

Máte pravdu, špatně jsem to popsal. Potřebuji vytvořit alternativní validátor MAX_LENGTH, který bude automaticky zjišťovat maximální délku inputu (bude jí získávat podle sloupce z databáze). Jako nejjednodušší způsob mi přišlo rozšířit už existující validátor Form::MAX_LENGTH, takže bych nepřišel o validaci na straně klienta. Nejsem si jistý, jestli je to vůbec možné.

Jan Endel
Člen | 1016
+
0
-

Prosím, tykej mi :-). Vlastní validaci si můžeš naimplementovat jakkoliv chceš, tedy i šahat do databáze (žel staticky) a podobně. Validaci na straně klienta si bohužel budeš muset napsat sám po vzoru z Pandova článku.

Panda
Člen | 569
+
0
-

Je na to opravdu potřeba vlastní validační pravidlo? Pokud už máš políčko nějakým způsobem propojené s databází, nebylo by lepší používat klasické MAX_LENGTH, kterému akorát ve vhodný okamžik předáš délku sloupečku v databázi? Zkus nějak ve stručnosti popsat, jakým způsobem máš řešené propojení sloupečku s s políčkem ve formuláři a zkusíme najít optimální řešení.

Pan Dobrman
Člen | 45
+
0
-

Děkuji za odpovědi. Myslím, že ideální by bylo použít klasické MAX_LENGTH (hlavně kvůli html atributu maxlength). Dobré by bylo, pokud by stačilo zapsat jen $form->addRule(OPERACE, ZPRÁVA) (poslední argument by se automaticky zjistil ze sloupečku). Používám rozšířené třídy z: Nette\Forms\Container – zde získávám informace z databáze (název inputu == název sloupce) a Nette\Forms\Controls (TextInput, SelectBox, …).

Editoval Pan Dobrman (28. 8. 2012 20:48)

Panda
Člen | 569
+
0
-

No, pokud dědíš TextInput, tak Ti nic nebrání si v potomkovi přepsat metodu addRule:

public function addRule($operation, $message = NULL, $arg = NULL) {
	if ($arg === NULL && $operation === Form::MAX_LENGTH) {
		$arg = $this->control->maxlength;
	}
	return parent::addRule($operation, $message, $arg);
}

Bude to tak i lepší, protože samotné validační pravidlo nebude vázané na logiku kolem databáze. Další možností je rovnou pravidlo Form::MAX_LENGTH přidávat v Tvém poděděném Nette\Forms\Containeru na stejném místě, kde získáváš informace z databáze.