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

- Pan Dobrman
- Člen | 45
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
Ale jistě, že to jde. Odkážu tě na perfektní článek od Pandy který o tomto pojednává.

- Pan Dobrman
- Člen | 45
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);
}
}

- Pan Dobrman
- Člen | 45
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é.

- Panda
- Člen | 569
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
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
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.