Ako vypisat chybovu hlasku do flashMessage()?

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

Ahojte,

tento kod je z triedy UserManager, ako sucast funkcie add() … registracia

<?php
	));
		} catch (Nette\Database\UniqueConstraintViolationException $e) {
			throw new \Exception("Zadaný email je již použit");
		}
?>

ak sa snazim vlozit uzivatela s udajmi, ktore uz su v tabulke users, vyhodi mi chybovu hlasku … ja to ale chcem vypisat do flashMessage() ale ked to pouzijem v UserManager .. chyba

<?php
Call to undefined method App\Model\UserManager::flashMessage()
?>
Václav Kraus
Člen | 77
+
+1
-

Metodu flashMessage nemáš dostupnou v modelu. Tohle se řeší na úrovni presenteru nebo komponenty.

Takeshi
Člen | 596
+
0
-

Václav Kraus napsal(a):

Metodu flashMessage nemáš dostupnou v modelu. Tohle se řeší na úrovni presenteru nebo komponenty.

A ako to potom nejako elegantne vypisat, nie v tej klasickej cerveno-bielej sablone

<?php
catch (Nette\Database\UniqueConstraintViolationException $e) {
			throw new \Exception("Zadaný email je již použit");
		}
?>

Editoval Takeshi (1. 3. 2016 19:48)

Mysteria
Člen | 797
+
+2
-

V presenteru, kde voláš tu metodu na registraci:

try {
	// Metoda na registraci
} catch (Exception $e) {
	$this->flashMessage($e->getMessage(), 'error');
}

Nicméně vyhazovat Exception a chytat ji není nejlepší nápad, takže bych si vytvořil nějakou vlastní vyjímku, třeba EmailInUse, vyhazoval ji v tom tvém kódu v prvním příspěvku a pak ji chytal v tom mém.

Editoval Mysteria (1. 3. 2016 19:53)

Takeshi
Člen | 596
+
0
-

No ono by to bolo dobre, lenze neviem ako to dat, aby to fungovalo … teda nieco som skusal, ale nic …
ja to mam takto

v App/Forms mam RegisterFormFactory

<?php
	...

    public function formSucceeded(Form $form)
    {
        $data = $form->getValues();

        $this->userManager->add($data['username'],$data['password']);
    }
?>

A ten nacitavam v presenteru pomocou tovarnicky

<?php

    /** @var \App\Forms\RegisterFormFactory @inject */
    public $registerForm;

    protected function createComponentRegisterForm()
    {
        $form = $this->registerForm->create();
        $form->onSuccess[] = function(){
            $this->redirect('Homepage:');
        };
        return $form;
    }
?>

… no a ten zvysok, co tu uz pisal … je v UserManager …

tak kde to dat?
Dakujem

Takeshi
Člen | 596
+
0
-

Mohol by som to cele natlacit do Presenteru … aj z formulara aj z Modelu … ale potom by to bolo neprehladne a cele to rozdelenie Do Form/RegisterFormFactory a Model/UserManager straca zmysel

Editoval Takeshi (1. 3. 2016 20:32)

Mysteria
Člen | 797
+
+1
-

Továrny nejsou problém:

public function formSucceeded(Form $form) {
	$data = $form->getValues();
	try {
       	$this->userManager->add($data['username'],$data['password']);
	} catch (\Exception $e) {
		$this->presenter->flashMessage($e->getMessage(), 'error');
	}
}

Případně by to šlo ještě přes události.

public function formSucceeded(Form $form) {
	$data = $form->getValues();
	try {
       	$this->userManager->add($data['username'],$data['password']);
	} catch (\Exception $e) {
		$this->onRegisterFailed($e);
	}
}


protected function createComponentRegisterForm() {
	$form = $this->registerForm->create();
	$form->onSuccess[] = function(){
		$this->redirect('Homepage:');
	};
	$form->onRegisterFailed[] = function($exception) {
		$this->flashMessage($exception->getMessage(), 'error');
	};
	return $form;
}
Takeshi
Člen | 596
+
0
-

Mysteria napsal(a):

Tato cesta sa mi paci … akurat este detail … vypisuje mi chybu

<?php
- Cannot read an undeclared property Nette\Application\UI\Form::$onRegisterFailed
- Cannot read an undeclared property App\Forms\RegisterFormFactory::$presenter.
?>

Myslel som si, ze staci pridat

use App\Forms\RegisterFormFactory;

ale zjavne nie

CZechBoY
Člen | 3608
+
+2
-

Kterou cestou chces jit?
To prvni davas ve Factory a pokud tam nemas presenter v $this tak ho zkus vzit z $form: $form->getPresenter().

Udalost musis mit definovanou promennou a pak tu udalost zavolat
Factory:

Class RegisterFormFactory extends \Nette\Object
{
  private $onRegisterFailed = array();

    public function create ()
    {
        ...
        $form->onSuccess[] = function (...)
        {
            ....
            catch (FailException $e) {
              $this->onRegisterFailed($e);
            }
        }
    }
}

Editoval CZechBoY (1. 3. 2016 22:41)