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\Container
u na stejném místě, kde získáváš
informace z databáze.