Nette2.0 Validace formulare – hidden pole
- Ftipalek
- Člen | 3
Ahoj,
nasel jsem podivne chovani u validace formularu v Nette.
Konkretne validace skrytych prvku Hidden.
Mam nasledujici formular.
<?php
$form = new Form();
$form->addHidden( 'id' )
->addRule( Form::NUMERIC, 'Neco je spatne!!!' );
$form->addText( 'name', 'Tag' )
->addRule( Form::MIN_LENGTH, 'Minimalni delka tagu jsou 3 znaky', 3 )
->addRule( Form::MAX_LENGTH, 'Maximalni delka tagu je 20 znaku', 20 );
$form->addSubmit( 'save', 'Ulozit' );
$form->onSubmit[] = callback( $this, 'tagFormSubmitted' );
?>
Pokud jej odeslu dostanu:
Nette\MemberAccessException
Call to undefined static method Nette\Forms\Controls\HiddenField::validateinteger().
Je toto chovani spravne? Cekal bych, ze mi to pole ackoliv je skryte take zvaliduje.
Pouzivam: version 2.0-dev released on 2011–07–02
Dekuji za info
- Filip Procházka
- Moderator | 4668
@**22**: ověřoval jsem si to ve zdrojáku a není tam žádný důkaz, že by formuláře zahazovaly hodnoty hiddenů vytvořených takto:
$form->addHidden('id', 10); // používá ->setDefaultValue()
pokud by jsi chtěl vnutit hidden
u hodnotu
$form['id'] = new HiddenField(10); // $form['id']->value bude vždy 10
@**Ftipalek**: Hidden
nejde validovat klasickým
způsobem, protože by to nemělo smysl. Zkus validovat něco, co bez
javascriptu nezměníš a normální uživatel ti to nebude upravovat přes
inspektora, aby si tam doplnil hodnotu…
Pokud chceš něco takového validovat, pak by mohlo fungovat doplnit
hidden
u metody validate<Neco>
, podle TextBase
pomocí ExtensionMethod
Ale rozumnější mi přijde si to zkontrolovat po odeslání
$form->onSubmit[] = callback($this, 'FormSubmitted');
public function FormSubmitted(Form $form)
{
if (!is_numeric($form['id']->value)) {
$form['id']->addError('Záznam se nepovedlo vložit, zkuste to prosím znovu.');
return ;
}
// .. normální zpracování
}
Editoval HosipLan (6. 7. 2011 14:19)
- Tomáš Votruba
- Moderator | 1114
HosipLan napsal(a):
@**22**: ověřoval jsem si to ve zdrojáku a není tam žádný důkaz, že by formuláře zahazovaly hodnoty hiddenů vytvořených takto:
$form->addHidden('id', 10); // používá ->setDefaultValue()
pokud by jsi chtěl vnutit
hidden
u hodnotu$form['id'] = new HiddenField(10); // $form['id']->value bude vždy 10
Mám problém s odesláním skrytého pole.
Zkoušel jsem těmito způsoby do formuláře přidat skryté pole, ale po odeslání se mi v dumpu nezobrazuje.
<?php
// presenter
$form->addHidden("recordID",$this->getParam("recordID")); // zkoušel jsem získat param po odeslání formuláře (ideální), ale bohužel nejde
// šablona
{input recordID}
?>
Nějaké nápady (než sem budu muset hodit celý form a jeho render)?
- Patrik Votoček
- Člen | 2221
Neobsahuje náhodou $this->getParam("recordID")
po odeslání
NULL?
Spíš to hidden pole plň třeba v action takhle se ti přepíše poslané value.
- Tomáš Votruba
- Moderator | 1114
Jde o to, že se mi pole hidden neodesílá, ať ho naplním čímkoliv.
Nerozumím „Spíš to hidden pole plň třeba v action“.
-
EDIT: Tak z toho jsem jelen.
<?php
$values = $form->getValues(); // získá všechny hodnoty z formuláře, kromě hidden
$values["recordID"]; // neexistuje
$recordID = $form->httpData["recordID"]; // získám potřebnou hodnotu
/* to se všechny skryté hodnoty hidden polí musí přistupovat takto? */
// EDIT: Vhodnější řešení
$values = $form->getHttpData(); // získá všechny hodnoty z formuláře, včetně hidden
$values["recordID"]; // eexistuje
?>
Editoval Schmutzka (4. 9. 2011 2:51)
- joe
- Člen | 313
Myslel tím až ve fázi action<…>
Mně teda nenapadá, kde by mohl být problém. Čeho jsem si ale všimnul
je, že rendruješ i hidden pole (#7), ty se rendrují
automaticky. Ale i pokud bys tam měl dva stejné elementy, funguje to
jako kdyby tam byl jen ten poslední, což ale nevysvětluje proč ti
nefunguje $values["recordID"]
to se všechny skryté hodnoty hidden polí musí přistupovat takto?
Ne, mně to funguje celkem normálně.
Editoval joe (10. 8. 2011 6:37)