addRule() – zobrazeni chybove hlasky

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

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.

Šaman
Člen | 2666
+
0
-

Jak vykresluješ formulář? Při {control fooForm} by se ti chyba měla vypsat. JS validace samozřejmě tvoje pravidlo nezná, takže popup nevyskočí.

Editoval Šaman (23. 7. 2014 23:16)

edoras
Člen | 21
+
0
-

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
+
0
-

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?

Mysteria
Člen | 797
+
0
-

Stačí si přečíst tu hlášku. Místo ->allErrors použij ->errors.

edoras
Člen | 21
+
0
-

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“);

Mysteria
Člen | 797
+
0
-

Tohle taky nic?

foreach ($formular->errors as $error) dump($error);
edoras
Člen | 21
+
0
-

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
+
0
-
$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.