Nette2.0 Validace formulare – hidden pole

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

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

22
Člen | 1478
+
0
-

proč validuješ skrýté pole, to přece není uživatelský vstup? :-)

Ftipalek
Člen | 3
+
0
-

22 napsal(a):

proč validuješ skrýté pole, to přece není uživatelský vstup? :-)

Ano, neni to uzivatelsky vstup. Ale napr. skrze FireBug je mozne jej zmenit.

22
Člen | 1478
+
0
-

no a? Nette to to stejně nevezme přes getValue()…

Filip Procházka
Moderator | 4668
+
0
-

@**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 hiddenu 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 hiddenu 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)

Ftipalek
Člen | 3
+
0
-

@**Hosiplan** Diky za odpoved. Byl jsem ted skoro dva tydny na dovolene a k poci jsem se dostal az dnes.

Editoval Ftipalek (14. 7. 2011 20:54)

Tomáš Votruba
Moderator | 1114
+
0
-

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 hiddenu 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
+
0
-

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
+
0
-

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
+
0
-

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)

22
Člen | 1478
+
0
-

@schmutzka: hoď sem nejlépe celý presenter, někde máš nějakou chybu. Hidden pole je v submitu vždycky minimálně s hodnotou NULL.

Editoval 22 (10. 8. 2011 7:11)