nefunkční javascript validace formuláře

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
masterr
Začátečník | 141
+
0
-

Formulář se mi nechce validovat přes js, teda vyhodí mi to chyby, ale ne přes alert jako dřív (přešel jsem na veri 2.0 php 5.3). Proč, jak to vrátit?

Jen tohle mi to vyhodí:

<ul class="error">
	<li>Vyplňte text.</li>

	<li>Vyplňte cenu.</li>

	<li>Vyplňte sklad.</li>

</ul>
Tharos
Člen | 1030
+
0
-

Máš připojený skript netteForms.js? Viz [2010–08–09] Unobtrusive JavaScript namísto InstantClientScript, ten soubor najdeš v distribuci v adresáři examples/Forms.

Editoval Tharos (7. 12. 2010 21:59)

masterr
Začátečník | 141
+
0
-

Připojený ho nemám, ale hlavně ho nemám ani ve složce examples/Forms v distribuci.

Mám ho jen tady:

NetteFramework-2.0alpha-PHP5.3\NetteFramework-2.0dev-PHP5.3\sandbox\www\js
NetteFramework-2.0alpha-PHP5.3\NetteFramework-2.0dev-PHP5.3\client-side\forms

A ani jeden mi tam nefunguje, když ho připojím. Jaktože ho nemám v tom examples/Forms? Kde ho mám vzít?

Editoval masterr (8. 12. 2010 18:00)

netman92
Člen | 22
+
0
-

http://nette.github.com/…etteForms.js

Editoval netman92 (8. 12. 2010 22:25)

masterr
Začátečník | 141
+
0
-

Dík, ale stejně mi to nejede. Připojený si myslel takto, j?

<script type="text/javascript" src="./files/js/netteForms.js"></script>
masterr
Začátečník | 141
+
0
-

Pls, čím by to mohlo eště být? Už jsem docela zoufalej…

umrlec
Člen | 56
+
0
-
<script type="text/javascript" src="{$basePath}/files/js/netteForms.js"></script>

? Nevím ale jakou máš adresářovou strukturu, tak hádám.

Editoval umrlec (10. 12. 2010 20:57)

masterr
Začátečník | 141
+
0
-

No, já bych řekl že tímto to nebude, protože ten js script se normálně načte.
Když dám ve FF zobrazit zdrojový kod tak ho tam muzu rozkliknout, takže by to mělo být z tohohle pohledu v pohodě, ne?

westrem
Člen | 398
+
0
-

A co konkretne ti teda teraz nefunguje, ked vravis, ze skript uz mas v poriadku nalinkovany?

masterr
Začátečník | 141
+
0
-

Nalinkovaný je v pohodě, ale nic nedělá, nevyhodí mi to ten alert. Funguje to jako, když tam nebyl.

masterr
Začátečník | 141
+
0
-
namespace AdminModule;
use Nette\Forms,Nette\Application\AppForm;
use FrontModule\Goods;
use dibi;
	protected function createComponentAddgoodsForm()
	{

		$form = new AppForm;

		$form->addText('nazev', 'Název:')
		->addRule(\Nette\Forms\Form::FILLED, 'Vyplňte název.');


		$form->addTextarea('text', 'Text:')
			->addRule(\Nette\Forms\Form::FILLED, 'Vyplňte text.');

		$form->addText('cena', 'Cena:')
			->addRule(\Nette\Forms\Form::FILLED, 'Vyplňte cenu.')
			->addRule(\Nette\Forms\Form::NUMERIC, 'Cena musí být číslo.');
  $form->addSubmit('ok', 'Uložit');
		$form->onSubmit[] = callback($this, 'addgoodsFormSubmitted');
		return $form;
	}
  • mám připojený ten

<script type=„text/javascript“ src=„http://localhost/ms/files/js/netteForms.js“></script>
cos mi poslal, je dobře nalinkovanej, ale prostě to nefakčí a nefakčí, a netuším kde je chyba.

Nenapadá vás něco? Kdyžbyste byl někdo moc laskavý tak to můžu někam upnout, že byste se na to někdo podíval. Dík všem za rady a tipy.

dubak
Člen | 41
+
0
-

Inak podobný problém mám aj ja, skúsil som si len tak pripojiť k jednému PHP skriptu minimalizovanú verziu Nette a vyskúšať či to funguje. No, formulár vygeneruje, aj validáciu na strane serveru, ale JS proste nefunguje. Išiel som podľa návodu Davida Grudla z serveru zdrojka:

http://zdrojak.root.cz/…roduktivitu/

môj kód:

<?php
require './Nette/nette.min.php';

$form = new Form;

$form->setAction('./index.php');
$form->setMethod('get');
// name je název prvku, Jméno: je popisek
$form->addText('name', 'Meno:')
	->addRule(Form::FILLED, 'Zadajte meno');

$form->addText('surname', 'Priezvisko:')
	->addRule(Form::FILLED, 'Zadajte priezvisko');

$form->addText('email', 'E-mail:')
	->addRule(Form::EMAIL, 'Zadajte platnú e-mailovú adresu');

$form->addCheckbox('suhlas', 'súhlasím so spracovaním osobných dát');

$form->addTextArea('text', 'Poznámky:')
	->addRule(Form::FILLED, 'Napište nám prosím vzkaz');

$form->addSubmit('send', 'Odoslať');

// jestliže byl formulář odeslán
if ($form->isSubmitted()) {
        // a jestliže jsou všechny položky vyplněny správně
        if ($form->isValid()) {
                echo '<h1>Formulář byl odeslán</h1>';

                $values = $form->getValues();
                Debug::dump($values);
                exit;
        }else {
  		//error
        	echo 'Nevalidny';
	}
}

echo $form;

?>
dubak
Člen | 41
+
0
-

ixod napsal(a):

Inak podobný problém mám aj ja, skúsil som si len tak pripojiť k jednému PHP skriptu minimalizovanú verziu Nette a vyskúšať či to funguje. No, formulár vygeneruje, aj validáciu na strane serveru, ale JS proste nefunguje. Išiel som podľa návodu Davida Grudla z serveru zdrojka:

http://zdrojak.root.cz/…roduktivitu/

môj kód:

<?php
require './Nette/nette.min.php';

$form = new Form;

$form->setAction('./index.php');
$form->setMethod('get');
// name je název prvku, Jméno: je popisek
$form->addText('name', 'Meno:')
	->addRule(Form::FILLED, 'Zadajte meno');

$form->addText('surname', 'Priezvisko:')
	->addRule(Form::FILLED, 'Zadajte priezvisko');

$form->addText('email', 'E-mail:')
	->addRule(Form::EMAIL, 'Zadajte platnú e-mailovú adresu');

$form->addCheckbox('suhlas', 'súhlasím so spracovaním osobných dát');

$form->addTextArea('text', 'Poznámky:')
	->addRule(Form::FILLED, 'Napište nám prosím vzkaz');

$form->addSubmit('send', 'Odoslať');

// jestliže byl formulář odeslán
if ($form->isSubmitted()) {
        // a jestliže jsou všechny položky vyplněny správně
        if ($form->isValid()) {
                echo '<h1>Formulář byl odeslán</h1>';

                $values = $form->getValues();
                Debug::dump($values);
                exit;
        }else {
  		//error
        	echo 'Nevalidny';
	}
}

echo $form;

?>

No, tak si budem sám odpovedať. V článku David Grudla to bolo trošku nejasne vysvetlené. Doteraz som nepochopil, čo presne myslel týmto:

<?php
require 'Nette/loader.php';
?>

že či prilinkuje jeden súbor a do aplikácie vloží celú adresárovú štruktúru Nette. To som skúšal, ale stále vypisovalo že nepozná rôzne typy Nette tried, napriek tomu že som nastavil dobre konštanty. Potom ma napadlo, že veď načo vkladať do aplikácie celý framework aj so štruktúrou. Dal som tam len tu minimalizovanú formu a išlo to, ale bez formulárov a potom mi teda došlo, že to bude chcieť prilinkovať JS súbor: netteForms.js

Tak to len tak na okraj

studna
Člen | 181
+
0
-

Formuláře se začli validovat pomocí tzv. unobtrusive js – asi mám novější NetteForms, protože mi funguje. Nicméně, kdysi jsem si hrál s live validací formulářů a problém byl v tom, že chybělo samotné volání javascriptové validace. Stačí to připsat do NetteForms a nebo na konci stránky mít:

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

(Aby tento konkrétní kód fungoval, musíš načítat ještě jQuery)

dubak
Člen | 41
+
0
-

studna napsal(a):

Formuláře se začli validovat pomocí tzv. unobtrusive js – asi mám novější NetteForms, protože mi funguje. Nicméně, kdysi jsem si hrál s live validací formulářů a problém byl v tom, že chybělo samotné volání javascriptové validace. Stačí to připsat do NetteForms a nebo na konci stránky mít:

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

(Aby tento konkrétní kód fungoval, musíš načítat ještě jQuery)

Ano, ako som písal hore, prilinkoval som JS externy súbor a bolo.

tonda13
Člen | 3
+
0
-

Ahoj nevíte někdo jak se zbavit nebo pozměnit vzhled JS validace? Myslím konkrétně to „Vyplňte prosím toto pole“ viz obrázek

Vypnutí přes $form->getRenderer()->setClientScript(NULL); mi nefunguje.

bojovyletoun
Člen | 667
+
0
-

to je validace, kterou dělá prohlížeč (zde chRÓMe). Když si přilinkuješ netteforms.js (a inicializuješ formy), tak by to mělo zmizet.

tonda13
Člen | 3
+
0
-

bojovyletoun napsal(a):

Když si přilinkuješ netteforms.js (a inicializuješ formy), tak by to mělo zmizet.

netteforms.js jsme si přilinkoval, ale to na mě potom zase hází alert okna, a to nechci. Jinak nevím cos myslel tím inicializováním formů :-/

bojovyletoun
Člen | 667
+
0
-

inicializace formu znamená, právě že Nette.js změní chování toho formu -tedy vypne html5 validaci a přidá vlastní. Házení alertů je jedna z možných implementací Funkce (tuším) Nette.AddError.
Podívej se sem – jquery.nella.js hned na začátku je ta funkce

\--

tonda13
Člen | 3
+
0
-

Koukal jsem se na ten jquery.nella.js a v diskuzi se píše, že to nefunguje s nejnovější verzí Nette2.
Nevíš o něčem jiném? Případně by mi prozatím stačilo vypnout tu HTML5 validaci nebo v případě použití netteForms.js vypnout/změnit ty alert okna na něco jiného?

bojovyletoun
Člen | 667
+
0
-

Nevím, v čem je problém, mě to jde. Zkoušel jsi to? Jinak máš možnosti:

  1. můžeš dát formuláři atribut novalidate
    1. přimo v nette $form->elementPrototype->novalidate(true)
    2. lépe v scriptu `$(‚form‘).attr(„noValidate“,true); `
  2. upravit netteforms.js funkci Nette.addError — je to jednoduché v odkazu,č který jsem posílal je na začátku jquery.nella.js a tam hned na začátku máš funkci Nella.addError, která se liší tím že přidá za prvek nějaký span místo toho aby dělala alert(message)
Tomáš Votruba
Moderator | 1114
+
0
-

Mám stejný problém, soubor na svém místě je (Firebug).

Udělal jsem si úplně základní příklad, ale nic. Verze dev2.0, php 5.3.0.
Aktuální js jsem dnes stáhnul z Gitu, předtím ze stáhnuté verze dev2.0. Nic.

<meta charset="utf-8">
<?php
include "libs/nette.php";
use Nette\Forms\Form;
?>
<script src="js/netteForms.js"></script>
<?php
/* přihlášovací formulář */
$loginForm = new Form;
$loginForm->setAction("login.php");
$loginForm->addText("login","",20,60)
	->getControlPrototype()->placeholder("emailová adresa")
	->addRule(Form::FILLED,"Vyplňte login");
$loginForm->addPassword("email","",20,60)
	->getControlPrototype()->placeholder("*****")
	->addRule(Form::FILLED,"Vyplňte email")
	->addRule(Form::EMAIL,"Nesprávný formát emailu");
$loginForm->addSubmit("prihlasit","Přihlásit");

echo $loginForm;
?>

Editoval Schmutzka (9. 5. 2011 11:00)

dubak
Člen | 41
+
0
-

Kedže používaš triedu Form, t.z. tá sa používa keď iba chceš využiť niečo z Nette a nemusíš ísť cez MVP dizajn. Prilinkuj si preto minializovanú verziu Nette a nie celú (používanú na vývoj).

Aspoň mne to potom tak fungovalo.

Tomáš Votruba
Moderator | 1114
+
0
-

Jáj, 3hodinové debugování zvítěžilo. Tak chyba byla nakonec v jedné aktivaci funkce (třeba to někoho inspiruje k otevřenějšímu uvažování o možné chybě v kódu a jejímu rychlejšímu odstranění).

<script>
window.onload = function() { // aktivace placeholderu v IE
	activatePlaceholders();
}
</scrip>

Stačilo změnit window.onload na body.onload a už to šlape. Díky.