Ako vypisat chybovu hlasku do flashMessage()?
- Takeshi
- Člen | 596
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
Metodu flashMessage nemáš dostupnou v modelu. Tohle se řeší na úrovni presenteru nebo komponenty.
- Takeshi
- Člen | 596
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
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
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
- Mysteria
- Člen | 797
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
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
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)