vlastní validační pravdilo, nefunguje

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

mám kod, ale bohužel mi to formulář pustí dál za každých okolností.

Nevíte kde by mohla být chyba?

$form->addText("zip", "Vaše psč:")
                ->addRule(callback($this, 'zipExist'), 'Psč neexituje');

public function zipExist($zip) {
        $zip=  $zip->getValue();
        $count = dotaz do DB

        if (count($count) == 0) {
            return TRUE;
        } else {
            return FALSE;
        }
    }
vvoody
Člen | 910
+
0
-

Ako to máme vedieť, keď nevieme čo máš v databázi, nevieme aké hodnoty vkladáš do formulára a nevieme čo máš vo svojom kóde namiesto toho speudokódu „dotaz do DB“?

batko
Člen | 219
+
0
-

vvoody napsal(a):

Ako to máme vedieť, keď nevieme čo máš v databázi, nevieme aké hodnoty vkladáš do formulára a nevieme čo máš vo svojom kóde namiesto toho speudokódu „dotaz do DB“?

tohle mám odzkoušeno a vše vydumpováno, z db to vrací buď 0 nebo 1+

petr.pavel
Člen | 535
+
0
-

Předpokládáš, že rozhoduje návratová hodnota validační funkce, což není pravda.
https://doc.nette.org/cs/forms#…

Neuvedl jsi verzi Nette. Pro 2.0.* musíš použít $this->valid = FALSE; Případně pokud chceš i vyhodit chybovou hlášku ve funkci, tak $this->addError("..."); (které nastavuje $this->valid samo).

vvoody
Člen | 910
+
0
-

@peter.pavel: callback v onValidate a callback v addRule je rozdiel. Ty hovoríš o prvej možnosti, batko o druhej kde imo je práve návratová hodnota podstatná.

@batko: typujem že v $count máš nejaký integer prípadne numeric string, takže ten count($count) nedáva zmysel, narozdiel od prípadu keby parameter funkcie count() bolo pole alebo nejaký iterátor. Ale to len typujem lebo nepoznám presný kód ktorý si (neviem prečo) neuviedol.

Editoval vvoody (2. 3. 2014 16:09)

batko
Člen | 219
+
0
-

Celá funkce vypadá takto

public function zipExist($zip) {
       $zip = trim(str_replace(" ", "", $zip->getValue()));
       $count = count($this->cityRepository->findByZip($zip));
       if ($count == 0) {
           return TRUE;
       } else {
           return FALSE;
       }
   }
batko
Člen | 219
+
0
-

petr.pavel napsal(a):

Předpokládáš, že rozhoduje návratová hodnota validační funkce, což není pravda.
https://doc.nette.org/cs/forms#…

Neuvedl jsi verzi Nette. Pro 2.0.* musíš použít $this->valid = FALSE; Případně pokud chceš i vyhodit chybovou hlášku ve funkci, tak $this->addError("..."); (které nastavuje $this->valid samo).

Opravdu potřebuji validovat jen jedno vstupní pole.

NETTE 2.1.1

vvoody
Člen | 910
+
0
-

Nemáš tu podmienku naopak? Prehodiť TRUE a FALSE. Aj keď to by nemalo byť TRUE za každých okolností.

batko
Člen | 219
+
0
-

vvoody napsal(a):

Nemáš tu podmienku naopak? Prehodiť TRUE a FALSE. Aj keď to by nemalo byť TRUE za každých okolností.

To jsem zkoušel, ale prostě to projde vždy.

vvoody
Člen | 910
+
0
-

Keď dáš na začiatok metódy zipExist return TRUE a potom return FALSE tak stále prechádza form bez chyby?

batko
Člen | 219
+
0
-

vvoody napsal(a):

Keď dáš na začiatok metódy zipExist return TRUE a potom return FALSE tak stále prechádza form bez chyby?

ano pustí to form dál v obou případech

 public function zipExist($zip) {
        return FALSE;
}
 public function zipExist($zip) {
        return TRUE;
}
vvoody
Člen | 910
+
0
-

Pri spracovaní formu tam tá hodnota zip je?

batko
Člen | 219
+
0
-

vvoody napsal(a):

Pri spracovaní formu tam tá hodnota zip je?

ano, ona se zavolá i ta funkce mám tam všude dumpy a vydupmuje se to. zkouším už to tři hodiny a nic, nechápu kde může být chyba

public function zipExist($zip) {

        dump($zip->getValue());
        $zip = trim(str_replace(" ", "", $zip->getValue()));

        $count = count($this->cityRepository->findByZip($zip));

        if ($count == 0) {
            return FALSE;
        } else {
            return TRUE;
        }
    }
vvoody
Člen | 910
+
0
-

Myslel som v onSuccess callbacku.

batko
Člen | 219
+
0
-

ano to odejde v pořádku, bohužel jsem v koncích už fakt nevim

batko
Člen | 219
+
0
-
$form = $this->form();
      $yes = $form->addContainer('yes');
              $yes->addText("zip", "Vaše psč:")
              ->addRule(callback($this, 'zipExist'), 'Psč neexituje')
              ->addRule(Form::MIN_LENGTH, "Psč zadejte ve formátu 12345 nebo 123 45", 5)
              ->addRule(Form::MAX_LENGTH, "Psč zadejte ve formátu 12345 nebo 123 45", 6);
              $form->addSubmit("submit", "odeslat");
      $form->onSubmit[] = $this->test;

      return $form;
public function zipExist($zip) {
        $zip = trim(str_replace(" ", "", $zip->getValue()));
        $count = count($this->cityRepository->findByZip($zip));
        if ($count == 0) {
            return FALSE;
        } else {
            return TRUE;
        }
    }
David Matějka
Moderator | 6445
+
0
-

onSubmit je spatny event, ten se vola vzdy bez ohledu na validaci. pouzij onSuccess

batko
Člen | 219
+
0
-

děkuji moc