Validační pravidlo ve formuláři se nezobrazuje

Allconius
Člen | 313
+
0
-

Ahoj, tohle nechápu, mám 2 validační pravidla na dvou textových polích a to validateOC a validateDomainEmail

<?php

        $form->addText('oscislo', ' Osobní číslo:', 10, 6)
            ->setDefaultValue($oscislo)
            ->setRequired('Osobní číslo musí být vyplněno')
            ->addCondition(Form::FILLED)
            ->addRule([$this, 'validateOC'], 'Toto OC neexistuje.');

        $form->addText('email', 'Email:')
            ->setEmptyValue('@')
            ->addCondition(Form::FILLED)
            ->addRule(Form::EMAIL, 'Email nemá správný formát.')
            ->addRule([$this, 'validateDomainEmail'], 'Tento e-mail není platný.');

?>

validateDomainEmail je v pohodě, ale to validateOC se mi vůbec nezobrazuje v šabloně:

<?php
<div class="form-group required">
	<div class="col-sm-3 control-label"><label for="frm-editForm-oscislo" class="required"> Osobní číslo:</label></div>

	<div class="col-sm-9"><input type="text" name="oscislo" maxlength="6" size="10" id="frm-editForm-oscislo" required data-nette-rules='[{"op":":filled","msg":"Osobní číslo musí být vyplněno"}]' class="text"></div>
</div>

<div class="form-group">
	<div class="col-sm-3 control-label"><label for="frm-editForm-email">Email:</label></div>

	<div class="col-sm-9"><input type="text" name="email" id="frm-editForm-email" data-nette-rules='[{"op":":filled","rules":[{"op":":email","msg":"Email nemá správný formát."}],"control":"email"}]' data-nette-empty-value="&#64;" value="&#64;" class="text"></div>
</div>

?>

zobrazuje se jen to „Osobní číslo musí být vyplněno“ ale ten control úplně chybí, zkoušel jsem vymazat temp ale nic, tak to nějak nechápu

David Matějka
Moderator | 6445
+
0
-

já tam teda nevidim ani validateDomainEmail – tyhle custom validační pravidla se totiž neexportují do JS. fungujou pouze pokud jsou jako statická funkce: https://doc.nette.org/…s/validation#…

to, co nejde validovat pouze v JS, musíš řešit nějak custom ajax voláním třeba

Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

já tam teda nevidim ani validateDomainEmail – tyhle custom validační pravidla se totiž neexportují do JS. fungujou pouze pokud jsou jako statická funkce: https://doc.nette.org/…s/validation#…

to, co nejde validovat pouze v JS, musíš řešit nějak custom ajax voláním třeba

Ahoj, máš pravdu opravdu to v tom zdrojáku není, myslel jsem, že je to to „control“ ale to patří k tomu „addRule(Form::EMAIL“, asi mám jen nastavené špatně to validační pravidlo, že to pokaždé projde …

<?php
    /** @return bool */
    public function validateOC($ocControl)
    {
        $value = $ocControl->getValue();

        return $this->dbManager->ocExists($value);
    }
?>

a v dbManager:

<?php
    public function ocExists($oc)
    {


        if ((count($this->najdiOC($oc))) > 0) {

            return false;
        } else {

            return true;
        }

    }
?>

tedy pokud najde shodu tak by to mělo být false a formulář by se měl odeslat, ale nějak to odesílá vždycky ať tam dám cokoliv …

David Matějka
Moderator | 6445
+
0
-

odesílat se bude, jelikož k té validaci dochází až na serveru.

nebo chceš říct, že se volá onSuccess?

budeš to muset oddebugovat – třeba vrátit vždy false, případně si dumpnout, že se ta funkce zavolá.

Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

odesílat se bude, jelikož k té validaci dochází až na serveru.

nebo chceš říct, že se volá onSuccess?

budeš to muset oddebugovat – třeba vrátit vždy false, případně si dumpnout, že se ta funkce zavolá.

ano volá se onSuccess, ten e-mail tak funguje, že to píše „Tento e-mail není platný.“ dokud se nevyplní platná doména. Tzn. třeba cbfvdss@afasf.xx při pokusu o uložení neprojde

David Matějka
Moderator | 6445
+
0
-

no a další kroky si zkoušel? když vrátíš z ocExists false, tak validace taky projde? pokud ne, máš asi chybu v najdiOC

Allconius
Člen | 313
+
0
-

David Matějka napsal(a):

no a další kroky si zkoušel? když vrátíš z ocExists false, tak validace taky projde? pokud ne, máš asi chybu v najdiOC

ano když to změním na :

<?php

    public function ocExists($oc)
    {


        if ((count($this->najdiOC($oc))) > 0) {

            return false;
        } else {

            return false;
        }

    }

?>

tak to pokaždé vypíše „Toto OC neexistuje.“ tak tam mám jen nějak obráceně logiku

Allconius
Člen | 313
+
0
-

mělo to být jen opačně

<?php
    public function ocExists($oc)
    {


        if ((count($this->najdiOC($oc))) > 0) {

            return true;
        } else {

            return false;
        }

    }
?>

a už to funguje jak má, díky za pomoc