Jak do formulare vlozit validaci?
- edoras
- Člen | 21
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 | 2658
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
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 | 2658
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
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
ve standalone formularich budes muset asi rucne zavolat fireEvents, takze za
ten radek ->onValidate[]...
(resp. pred vykresleni) pridej:
$formular->fireEvents();
- Šaman
- Člen | 2658
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.