addRule() – zobrazeni chybove hlasky
- edoras
- Člen | 21
Pouzivam ve formulari vlastni validacni funkci pres addRule.
$formular->addText('username','nick')->addRule('validace::isUsernameAvailable', "chyba");
Validace funguje spravne, ale kdyz validace neprojde, nezobrazi se chybova
hlaska. Pochopil jsem pri procitani diskusi, ze bych si tu chybovou hlasku mel
asi nejak osetrit sam vlastnim kodem, ale vubec netusim jak se k te chybove
hlasce dostat – kde zacit. Chtel bych bud vyskoceni popup okna, nebo aby se
na zacatku stranky pred formularem vypsala chybova hlaska.
Dekuji za rady.
- edoras
- Člen | 21
Takhle vypada kod:
<script src="client-side/netteForms.js"></script>
<?
require '../../Nette/loader.php';
use Nette\Forms\Form;
use Nette\Database\Connection;
use Nette\Database\Context;
use Nette\Database\Table;
use Nette\Security\AuthenticationException;
...
$formular=new Form;
...
$formular->addText('username','nick')->addRule(Form::FILLED,'Vyberte si sve uzivatelske jmeno. Jeho minimalni delka je 4 znaky a maximalni delka je 20 znaku.')->addRule(Form::MIN_LENGTH,"Minimalni delka uziv.jmena jsou %d znaky",4)->addRule(Form::MAX_LENGTH,"Maximalni delka uziv.jmena je %d znaku.",20)->addRule('validace::isUsernameAvailable',"Uživatelské jméno je již registrováno");
...
$formular->addSubmit('send', ' ODESLAT ');
$formular->render('begin');
$formular->render('errors');
?>
<table>
<tr><td><?echo $formular['username']->control?></td></tr>
<tr><td><?echo $formular['send']->control?> </td></tr>
</table>
<?
$formular->render('end');
if ($formular->isSuccess()) {
echo "Formular byl odeslan spravne";
$values=$formular->getValues();
$database->query('insert into users', $values);
}
class validace {
public function isUsernameAvailable($item) {
print $item->value;
$connection=new Connection("mysql:host=$DBHOST;dbname=$DBNAME","$DBUSER","$DBPASS");
$database=new Context($connection);
$selection=$database->table('users')->where("username=?",$item->value)->count("*");
if ($selection>0) {
return FALSE;
}
return TRUE;
}
}
?>
- edoras
- Člen | 21
Jeste jsem zkusil do rendru pri zobrazeni toho formulare vlozit
<tr><td colspan=2><?print_r($formular['username']->error);?></td></tr>
coz nezobrazi vubec nic.
Tak jsem zkusil
<tr><td colspan=2><?print_r($formular->allErrors);?></td></tr>
a to mi napise:
Deprecated: Nette\Forms\Form::getAllErrors() is deprecated; use getErrors()
instead.
Array ( )
Odkud mam vytahnout tu chybovou hlasku?
- edoras
- Člen | 21
Jo, díky. To mě zbavilo té hlášky „Deprecated:…“. Ale problém to
nevyřešilo … informaci o tom, že nebyla splněna validační podmínka
addRule jsem z toho nevytáhl = nezobrazí to nic.
Primárně řeším to, jak zjistit, že nebyla splněna ta validační
podmínka addRule(‚validace::isUsernameAvailable‘, „chyba“);
- edoras
- Člen | 21
Ne, take nic.
Zkusil jsem ted maximalne zjednodusit kod, abych postihl problem.
<script src="client-side/netteForms.js"></script>
<?
require '../../Nette/loader.php';
use Nette\Forms\Form;
use Nette\Database\Connection;
use Nette\Database\Context;
use Nette\Database\Table;
use Nette\Security\AuthenticationException;
$formular=new Form;
$formular->addText('username','nick')->addRule('validace::isUsernameAvailable','chyba');
$formular->addSubmit('send', ' ODESLAT ');
$formular->render('begin');
$formular->render('errors');
foreach ($formular->errors as $error) dump($error);
$formular->render('end');
echo $formular;
if ($formular->isSuccess()) {
echo "Formular byl odeslan spravne";
}
class validace {
public function isUsernameAvailable($item) {
print $item->value;
return FALSE;
}
}
?>
Tento kod mi zobrazi textinput, kam napisu neco a validace mi ma ohlasit vzdy
chybu. Zadna chybova hlaska se mi ale nevypise.
(provizorne je ten skript tady: http://skolka.edoras.cz/test.php)
- Šaman
- Člen | 2666
$formular->render('errors');
foreach ($formular->errors as $error) dump($error);
Tohle děláš dvakrát to samé. Vypisuješ chyby celého formuláře, ale
ty potřebuješ vypsat chyby jednotlivých inputů.
Inspiruj
se zde, ale je to pro UI/Form, ne pro čisté Formy bez Nette. Takže
nevím, jak se to volá, pokud ti nefunguje $input->error.