Zavolání vlastní validační funkce z modelu

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

Ahoj,
mám takový rychlý dotaz.

forms/
RegisterFormFactory.php – formulář kde potřebuji zavolat isEmailAvailable

 $form->addText('username', 'E-mail: *', 35)
            ->setEmptyValue('@')
            ->addRule(Form::FILLED, 'Vyplňte Váš email')
            ->addCondition(Form::FILLED)
            ->addRule(Form::EMAIL, 'Neplatná emailová adresa')
            ->addRule(callback($this, 'isEmailAvailable'), 'E-mailová adresa je již použita.');

model/
UserManager.php – zde je funkce umístěna

  /**
     * Check if the email is used.
     * @param  string
     * @return bool
     */
    public function isEmailAvailable($username)
    {
        return ! $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->fetch();
    }

presenters/
RegisterPresenter.php – zde zobrazuji formulář

 /**
     * Register form factory.
     * @return Nette\Application\UI\Form
     */

    protected function createComponentRegisterForm() {

        $form = $this->factory->create();
        $form->onSuccess[] = function ($form) {
            $form->getPresenter()->redirect('Homepage:');
        };
        return $form;

    }

V Nette jsem začátečník a nevím jak funkci isEmailAvailable zavolat z modelu. Díky moc

Editoval Croc (16. 4. 2015 19:27)

Šaman
Člen | 2668
+
0
-

Doufám, že stále funguje tenhle návod

Kori
Člen | 73
+
0
-

Do factory si predej UserManager a pak v rule zavolej

$form->addText('username', 'E-mail: *', 35)
			....
			->addRule($this->userManager->isEmailAvailable, 'E-mailová adresa je již použita.')

Do funkce isEmailAvailable se predava formularovy prvek, takze si uprav podminku na where(self::COLUMN_NAME, $username->value), resp. bych to nazval nejak jinak ;-)

David Matějka
Moderator | 6445
+
+3
-

@Šaman je tam statika, takze radsi ne
@Kori tim bude zbytecne ta fce vyzadovat control

injectni si UserManager, jak radi Kori, ale kontrolu proved takto:


->addRule(function ($control) {
	return $this->userManager->isEmailAvailable($control->value);
}, ...)
Croc
Člen | 270
+
0
-

Jaký je rozdíl mezi oběma příklady?

Editoval Croc (16. 4. 2015 20:14)

Kori
Člen | 73
+
0
-

@DavidMatějka Mas pravdu, psal jsem to dle zvyku, jak mam ja postavene validatory.

Editoval Kori (16. 4. 2015 21:04)

David Matějka
Moderator | 6445
+
+1
-

@Croc v tom od Kori musi ta metoda v modelu pocitat s tim, ze prijme control – tudiz tam musis napsat $username->value, v tom mem rovnou predavam tu hodnotu jako retezec

Šaman
Člen | 2668
+
0
-

@DavidMatějka: Co máš v tomto případě proti statice?

David Matějka
Moderator | 6445
+
+2
-

@Šaman ze si tam asi nepredas databazove spojeni :)

Šaman
Člen | 2668
+
0
-

Jdu se zahrabat a zasypat vápnem…
Jasně, už jsem zapomněl, že to chtěl validovat proti databázi. Takže statika tady opravdu ne. Ale dá se použít podle stejného návodu i cokoliv callable – čímž se spolu s anonymní fcí dostáváme k tomu, co jsi psal ty jako asi nejlepší řešení.

Editoval Šaman (16. 4. 2015 21:34)