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 | 2666
+
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 | 2666
+
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 | 2666
+
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)