Nefunkční validace pomocí addRule

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

Ahoj,

nedaří se mi rozchodit validaci pomocí addRule(NForm::FILLED, ‚Message‘);. Pokud všechny prvky formuláře vyplním, všechno je OK a formulář se v pořádku odešle. Pokud však nějaký prvek s podmínkou addRule(NForm::FILLED, ‚Message‘); nevyplním, stránka se přesměruje na adresu ?do=addForm-submit a k odeslání formuláře nedojde.

Používám verzi Nette Framework 0.9.7 pro PHP 5.2, v hlavičce @layout.latte mám vložen soubor netteForms.js.

Tady je zdrojový kód:

	protected function createComponentAddForm()
	{
		$form = new NAppForm;

		$form->addText('name', 'Name:')
		     ->addRule(NForm::FILLED, 'Please provide a name.');

		$places = new Places;
		$list = $places->getTypesSelect();
		$form->addSelect('type', 'Type:', $list);

		$list = array(0=>'No', 1=>'Yes');
		$form->addSelect('indoor', 'Indoor:', $list);

		$form->addTextarea('description', 'Description:')
		     ->addRule(NForm::FILLED, 'Please provide a description.');

		$list = $places->getEquipmentSelect();
		$checkboxlist = $form->addContainer('checkboxlist');
		foreach($list as $key=>$equipment){
			$checkboxlist->addCheckbox($key, $equipment);
		}

		$list = $places->getCountriesSelect();
		$form->addSelect('country', 'Country:', $list)
		     ->skipFirst('-- Select country --')
		     ->addRule(NForm::FILLED, 'Please select country.');


		$form->addText('new_city', 'City:')
		     ->addRule(NForm::FILLED, 'Please fill in a city.')
		     ->getControlPrototype()->onKeyUp("initialize();")
		     ->onBlur("initialize();");

		$form->addText('search_address', 'Address:')
		     ->getControlPrototype()->onKeyUp("initialize();")
		     ->onBlur("initialize();");

		$form->addHidden('longtitude');
		$form->addHidden('latitude');
		$form->addText('address');

		$mimeTypes = array('image/*');

		$form->addFile('photo1', 'Photo 1:')
		     ->addCondition(NForm::FILLED)
		     ->addRule(NForm::MAX_FILE_SIZE, 'Max. file size is 2Mb.', 2000000)
		     ->addRule(NForm::MIME_TYPE, 'Invalid file extension!', $mimeTypes);

		$form->addFile('photo2', 'Photo 2:')
		     ->addCondition(NForm::FILLED)
		     ->addRule(NForm::MAX_FILE_SIZE, 'Max. file size is 2Mb.', 2000000)
		     ->addRule(NForm::MIME_TYPE, 'Invalid file extension!', $mimeTypes);

		$form->addFile('photo3', 'Photo 3:')
		     ->addCondition(NForm::FILLED)
		     ->addRule(NForm::MAX_FILE_SIZE, 'Max. file size is 2Mb.', 2000000)
		     ->addRule(NForm::MIME_TYPE, 'Invalid file extension!', $mimeTypes);

		$form->addSubmit('add', 'Add');

		$form->onSubmit[] = callback($this, 'addFormSubmitted');
		return $form;
	}

EDIT: Ještě doplním, že Firefox chybová konzole nevrací žádnou chybu.

Díky za každou pomoc.

Editoval Jakub (9. 3. 2011 18:31)

Jakub
Člen | 30
+
0
-

Nechal jsem ve formuláři pouze první položku:

$form->addText('name', 'Name:')
     ->addRule(NForm::FILLED, 'Please provide a name.');

A stále stejná chyba. To mě jen utvrdilo v tom, že chyba bude opravdu v tom addRule… jenže jaká :(

Jakub
Člen | 30
+
0
-

A ještě jedna informace – přidal jsem do formuláře vykreslení errorů na straně serveru a normálně se po odeslání prázdného formuláře vykreslí (do URL se přidá ?do=addForm-submit – nevím, jestli je to správně?), takže jde asi čistě o nějaký problém s JS…

studna
Člen | 181
+
0
-

Místo NForm::FILLED používej spíš $form::FILLED. A nefunguje ti validace na straně klienta nebo serveru?

btw. nevykresluješ formulář ručně?

U této starší verze je (tuším) pořád generování javascriptu pro obsluhu formuláře, chyba je tu. netteForms.js tady nehraje roli.

Editoval studna (9. 3. 2011 21:02)

Jakub
Člen | 30
+
0
-

Nefunguje na straně klienta… a ano, vykresluji jej ručně :) Jinak upravil jsem na $form::FILLED, ale problém stejný.

studna
Člen | 181
+
0
-

Podívej se do zdrojáku, jestli pod formulářem uvidíš vygenerovaný javascript.

Jakub
Člen | 30
+
0
-

Koukal jsem a není tam… v jednom starším projektu jej mám (pod <!-- Nette Form validator -->). Takže už víme, kde je chyba, ale jak to vyřešit…? :)

studna
Člen | 181
+
0
-

$form->render('end') v šabloně?

Jakub
Člen | 30
+
0
-

Ten tam mám a také se správně vykreslí. Jinak počáteční značka form je trochu jinak (chybí volání validační fce), než u druhého projektu, kde JavaScript je. Pro porovnání:

Problémový projekt:

<form action="url" method="post" id="frm-addForm" enctype="multipart/form-data">

Fungující validace:

<form action="url" method="post" id="frm-addForm" enctype="multipart/form-data" onsubmit="return nette.validateForm(this)">
studna
Člen | 181
+
0
-

Tak za to nejspíš může ten callback. :)

Jakub
Člen | 30
+
0
-

Jakože obsah fce public function addFormSubmitted(NAppForm $form) nebo přímo řádek $form->onSubmit[] = callback($this, ‚addFormSubmitted‘);? :) Díky!

studna
Člen | 181
+
0
-

Ten řádek. Ono, moc o těch starších formulářích nevím, ale když tam je ten callback, tak to může znamenat také vlastní serverovou validaci, proto se javascript nevygeneruje. (Teď si ale fakt nejsem jistý tím co říkám :D)

Editoval studna (9. 3. 2011 22:04)

Jakub
Člen | 30
+
0
-

Zkusil jsem to upravit dle dokumentace na $form->onSubmit[] = ‚addFormSubmitted‘;, ale stále nic… :( Třeba příjde ještě někdo, kdo bude vědět, jak to opravit. Každopádně díky moc za pomoc, alespoň vím, kde přesně chyba je :)

Patrik Votoček
Člen | 2221
+
0
-

Jakub napsal(a):

Používám verzi Nette Framework 0.9.7 pro PHP 5.2, v hlavičce @layout.latte mám vložen soubor netteForms.js.

Nette 0.9.x a starších se nic jako netteForms.js nepoužívá! To je až od Nette 2.0!

$form->onSubmit[] = callback(...); na to nemá vliv. Tohle je čistě backendová část.

Kouknu jak to je v 0.9.x řešené a dám vědět (už ho víc jak rok nepoužívám).

EDIT: zkus si dumpnout $form->getRenderer()->getClientScript();

Jakub
Člen | 30
+
0
-

Jak mohu zjistit, jakou verzi Nette mám? Trochu jsi mě teď znejistil, protože jsem tu aplikaci stavěl z nějakého ukázkového kódu, který byl k Nette přiložen, a ten soubor netteForms.js už tam byl v headeru nalinkován… jestli nakonec nemám verzi vyšší.

Patrik Votoček
Člen | 2221
+
+1
-

Nette\Framework::VERSION / Nette\Framework::REVISION

Jakub
Člen | 30
+
0
-

Nevím, jestli to dělám správně, ale když přidán do createComponentAddForm() tohle:

NDebug::dump($form->getRenderer()->getClientScript());

Vrátí aplikace laděnku s chybou Call to undefined method NDefaultFormRenderer::getClientScript().

Patrik Votoček
Člen | 2221
+
0
-

protože nemáš Nette 0.9.x ale 2.0 :-D

Jakub
Člen | 30
+
0
-

Tak mám opravdu vyšší verzi (2.0-dev), revize bb2b723 released on 2011–02–06. To znamená, že netteForms.js by připojen být měl (mám) a JS kód by se generovat neměl (negeneruje se)… kde je tedy chyba?

Patrik Votoček
Člen | 2221
+
0
-

to ti přesně nepovím ale zkusil bych nejdříve aktualizovat

Jakub
Člen | 30
+
0
-

Aktualizováno, ale stále bez výsledku :( Jsou nějaké další postupy, které by mohly vést k nalezení chyby? Díky moc.

Patrik Votoček
Člen | 2221
+
0
-

pokud ti ani chybová konzole ve FF nehodí chybu hledal bych jestli se netteForms.js vůbec načte

studna
Člen | 181
+
0
-

Jestli se ti netteForms.js načítá, zkus dát na konec stránky něco jako:

<script type="text/javascript">
$('form').submit(function(){ return Nette.validateForm(this);});$(':input').blur(function(){ Nette.validateControl(this);});
</script>

(Musíš načíst ještě jQuery) Stane se něco?

Popřípadně stáhnout nejnovější netteForms.js.

toka
Člen | 253
+
0
-

A ten problém se děje i při vykreslení formuláře jako {control ...}? Nebo pouze při ručním renderingu?

Jakub
Člen | 30
+
0
-

Tak jsem zkusil přidat ten JS kód pod formulář a nyní to sice funguje, ale zase více, něž bych chtěl :D Alert s upozorněním vyskočí při nevyplněném inputu 2× (zároveň) a když chci ze stránky odejít přes odkaz v menu, vyskočí ještě potřetí…

studna
Člen | 181
+
0
-

No, je to spíš jen pro ověření. :) Zkus si stáhnout novější netteForms.js, mně formuláře na Nette dev(!) fungujou, takže nemám páru, čím jiným by to mělo být.

Jakub
Člen | 30
+
0
-

Na Nette dev už to nejede, aktualizoval jsem :) A netteForms.js jsem stáhl včera z gitHubu, jde o aktuální verzi, nebo mohu někde sehnat novější? Díky!

PS: Ještě vyzkouším vykreslení pomocí {control …}, tedy NEmanuálně a dám vědět, jestli to jede.