Jak do formulare vlozit validaci?

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

Mam jednoduchy formular a potrebuji v nem vyvolat chybu na zaklade nejake validace a nevim jak na to.
Kdyz udelam tohle:

<script src="client-side/netteForms.js"></script>
<?
require '../../Nette/loader.php';
use Nette\Forms\Form;
$formular=new Form;
$formular->addText('username','nick');
$formular->addSubmit('send', ' ODESLAT ');
$formular->render('begin');
$formular->render('errors');
foreach ($formular->getErrors as $input) dump($input);
#dump($input);
$formular->render('end');
$formular->onValidate[]=$this->isUsernameAvailable($formular);
echo $formular;


if ($formular->isSuccess()) {
    echo "Formular byl odeslan spravne";
}

class validace {
 public function isUsernameAvailable($formular) {
        $formular->addError('chyba');
        return FALSE;
        }
}
?>

dostanu „Fatal error: Using $this when not in object context“

Jak do tohoto formulare vlozit validaci?

Šaman
Člen | 2632
+
0
-

Ta hláška je snad jasná. Když nejsi ve třídě, tedy vůbec nejsi v OOP, tak $this nemá smysl. Zkus

<?php
$formular->onValidate[] = array('validace', 'isUsernameAvailable');
?>

Kdyby to nefungovalo, tak si zjisti, jak se v PHP vytváři callbacky na funkci když nejsi ve třídě.

Editoval Šaman (28. 7. 2014 8:08)

edoras
Člen | 21
+
0
-

Aha. Jo, to funguje, díky ;-) .
Nicméně i v tomto případě narážím na problém, že mi to nevrací nikde tu chybovou hlášku ‚chyba‘ – už se v tom totálně utápim.

Poraďte prosím, jak udělám jednoduchý formulář, který mi vrátí na základě vlastní validace nějakou chybovou zprávu. Je mi jedno, zda ta validace bude na prvku formuláře (addRule), nebo na celém formuláři (onValidate). V obou případech mi funguje samotná validace, ale ani v jednom případě mi to nezobrazuje chybovou hlášku.
Poraďte prosím, jak by jste formulář řešili vy?
(Jsem totální začátečník v Nette, možná něco dělám celou dobu špatně, ale netuším co. Dokumentaci k formulářům už mám pročtenou alespoň 10×.)

Šaman
Člen | 2632
+
0
-

Když v obsluze navěšené na onValidate budeš přidávat chyby přímo do formu, nikoliv pod jednotlivé inputy, tak ty chyby bys měl mít při vykreslení ve $form->getOwnErrors(), jak už se tu řešilo někdy před týdnem u jiného tvého dotazu. Chyby jednotlivých inputů bys měl mít ve $form['inputName']->getError().

Editoval Šaman (28. 7. 2014 16:32)

edoras
Člen | 21
+
0
-

Znovu jsem to zkoušel a zjistil jsem následující věc. Když addError použiju přímo ve formuláři

$formular->addText('username','nick');
$formular->addSubmit('send', ' ODESLAT ');
$formular->addError('chyba');

tak výpis chyby přes $formular->getOwnErrors() opravdu zobrazí text „chyba“.

Pokud ale addError použiju ve funkci

$formular->addText('username','nick');
$formular->addSubmit('send', ' ODESLAT ');
$formular->onValidate[]=array('validace','isUsernameAvailable');
echo $formular;
class validace {
 public function isUsernameAvailable($formular) {
        $formular->addError('chyba');
        return FALSE;
        }
}

tak se mi chyba nezobrazi, sice $formular->isSuccess() neprojde, takze addError evidentne zafunguje, ale zadny text chyby se pomoci $formular->getOwnErrors() nevypise.

David Matějka
Moderator | 6445
+
0
-

ve standalone formularich budes muset asi rucne zavolat fireEvents, takze za ten radek ->onValidate[]... (resp. pred vykresleni) pridej:

$formular->fireEvents();
edoras
Člen | 21
+
0
-

BINGO! To je ono! :-)
Super, obema vam moc dekuju za pomoc.

Šaman
Člen | 2632
+
0
-

Tak to by mě nenapadlo. Včera jsem se tím trochu prokousával a mělo by ti stačit i jen $form->getErrors(), to by mělo vrátit zmergované všechny vlastní chyby i chyby všech inputů v jednom poli.

Jinak na začátky s Nette rozhodně doporučím celý framework, jak vidíš, spousta důležitých drobností pro samostatné použití jednotlivých částí v dokumentaci není a tak ti může poradit jen ten, kdo se hodně dobře vyzná přímo ve zdrojákách.