formular – odoslanie formulara – sprava o odoslani
- thunderb
- Člen | 11
Dobry den,
mam fakt uuplne zaciatocnicku otazku, prestudoval som si clanky na
zdrojaku(nieco mi je jasne, nieco menej..), presiel tu co sa dalo..a pustil som
sa do svojho prveho webu v nette. Bohuzial zatial v tom plavem, takze tu je
moja otazka.
Mam formular na stranke, ktory je rieseny pomocou komponenty Formular:
<?php
class KontaktPresenter extends BasePresenter
{
public function createComponentFormular()
{
$form = new AppForm();
$form -> addText('name','Meno:');
...
$form -> onSubmit[] = callback($this, 'kontaktFormSubmitted');
$form -> addSubmit('ok','Odošli otázku');
return $form;
}
public function kontaktFormSubmitted(AppForm $form)
{
if ($form['ok']->isSubmittedBy()) {
$values_array = $form->getValues();
....
}
}
public function renderDefault()
{
$this->template->metadescription = 'Kontaktujte nás ';
$this->template->metakeywords = 'kontakt, email, telefón, napíšte nám, kontaktujte';
}
?>
Moja otazka je uplne trivialna (ale nedari sa mi s tym pohnut), potrebujem aby po odoslani formulara sa objavila hlaska typu: „Vas formular bol uspesne odoslany“. Samozrejme chcem aby sa o tuto hlasku postaral presenter Kontakt, len neviem ako. Ci riesit formular nie cez komponetu a tovarnicku ale cez klasicke vykreslenie formulara v render ..
dakujem a sorry ak je toto hlupa otazka, len zacinam.
- BigCharlie
- Člen | 283
V metodě kontaktFormSubmitted
budeš určitě někam
přesměrovávat (třeba na tu samou stránku). A před přesměrováním
využíješ metody flashMessage
:
public function kontaktFormSubmitted(AppForm $form)
{
if ($form['ok']->isSubmittedBy()) {
$values_array = $form->getValues();
...
if ($veschno-jsem-zpracoval-bez-chyby) {
$this->flashMessage('Vas formular bol uspesne odoslany');
$this->redirect('cil-presmerovani');
}
else {
$this->flashMessage('se nam to nejak pokazilo');
$this->redirect('cil-presmerovani');
}
}
}
Stačí tak?
- BigCharlie
- Člen | 283
Ještě mě tak napadá, že ta část o pokažení nemusí vypadat zrovna
takhle, to záleží na tom, co potřebuješ – lze použít i metodu
addError
bez přesměrování, to zobrazí formulář a
vypíše chybu:
...
else {
$form->addError('se nám to pokazilo');
}
Editoval BigCharlie (11. 3. 2010 11:45)
- thunderb
- Člen | 11
dakujem,
ale akosi mi to nechce chodit. Ak dam iba:
<?php
public function kontaktFormSubmitted(AppForm $form)
{
$this->flashMessage('Vas formular bol uspesne odoslany');
}
?>
to znamena,ze po kliknuti by sa mi mala zobrazit tato hlaska, tak nic.. a este by som potreboval, aby povodny formular sa uz nezobrazi..
dakujem
- toka
- Člen | 253
public function actionFormSubmit(AppForm $form) {
if($form->isSubmitted()) {
if($form->isValid()) {
$formValues = $form->getValues();
if(/* zpracovani napr. metodou v modelu */) {
// Zprava o uspesnem vykonani - success je css styl .success, kterym si nadefinujes vzhled zpravy
$this->flashMessage('OK', 'success');
// Presmerovani
$this->redirect('...');
} else {
// Zprava o neuspesnem vykonani - error je css styl .error, kterym si nadefinujes vzhled zpravy
$this->flashMessage('Chyba', 'error');
// Presmerovani
$this->redirect('...');
}
} else {
// Pokud data neprojdou validaci na serveru - vypnuty JS apod.
$form->addError('Zadejte správné údaje!', 'error');
}
}
}
- toka
- Člen | 253
thunderb napsal(a):
dakujem,
ale akosi mi to nechce chodit. Ak dam iba:<?php public function kontaktFormSubmitted(AppForm $form) { $this->flashMessage('Vas formular bol uspesne odoslany'); } ?>
to znamena,ze po kliknuti by sa mi mala zobrazit tato hlaska, tak nic.. a este by som potreboval, aby povodny formular sa uz nezobrazi..
dakujem
Do šablony přidat:
{snippet flashMessage}
{foreach $flashes as $flash}
<div class="flash {$flash->type}">{$flash->message}</div>
{/foreach}
{/snippet}
EDIT:
A pokud nechceš, aby se již formulář nezobrazil, tak si to přepošli
jinam: $this->redirect('...')
.
Editoval toka (11. 3. 2010 12:29)
- BigCharlie
- Člen | 283
ale akosi mi to nechce chodit.
Předpokládal jsem (zřejmě špatně), že vycházíš z nějakého původně funkčního příkladu – pro začátek je třeba dobré si zkopírovat skeleton (v adresáři Tools) z distribuce. To je takový dobrý základ.
Pokud to tak nebylo, je potřeba doplnit do šablony zobrazování flash messages, jak píše toka.
Přesměrovat můžeš kamkoliv – tedy pokud na stránku, na které si
začínal, potom $this->redirect('this')
. Pokud chceš zobrazit
po přesměrování jinou stránku, např.
$this->redirect('Kontakt:ulozeno')
– to ale předpokládá,
že v presenteru Kontakt něco takového existuje.
- Ondřej Mirtes
- Člen | 1536
toka: ta tvoje actionFormSubmitted není správně. Předně, ta metoda se volá jen v případě, že formulář je odeslaný a validní, tzn. tyto řádky (a else části těch podmínek) tam jsou úplně zbytečně:
if($form->isSubmitted()) {
if($form->isValid()) {
Pokud je vypnutý Javascript, Nette samo přidá ty správné errory a tvojí metodu z onSubmit pole nezavolá.
- toka
- Člen | 253
Ondřej Mirtes napsal(a):
toka: ta tvoje actionFormSubmitted není správně. Předně, ta metoda se volá jen v případě, že formulář je odeslaný a validní, tzn. tyto řádky (a else části těch podmínek) tam jsou úplně zbytečně:
if($form->isSubmitted()) { if($form->isValid()) {
Pokud je vypnutý Javascript, Nette samo přidá ty správné errory a tvojí metodu z onSubmit pole nezavolá.
Tak to mi řekni, kde jsem to vyhrabal? Protože jsem to takhle viděl, a
bohužel tedy, to tak používám. Tudíž jsou obě konstrukce
if
zbytečné? Rád se poučím. Jsou funkční, ale navíc?
- Ondřej Mirtes
- Člen | 1536
No pokud tu metodu máš jen v poli $form->onSubmit[]
, tak
ty else části opravdu nemůžou nikdy nastat.
Nejlepší způsob pro psaní těch odesílacích metod je tento (neprefixuj je jako action*, ty mají v Nette jiný význam v životním cyklu Presenteru):
public function formSubmitted(AppForm $form) {
try {
$values = $form->getValues();
$model = new Model;
$model->doSomething($values); //uvnitř může vyhodit IOException
$this->flashMessage('Úspěch'); //pokud v modelu nastane chyba v modelu, tak se sem už nedojde a uživatel tuto hlášku neuvidí
$this->redirect('this'); //nebo jinam, kam chceš
} catch (IOException $e) {
$form->addError($e->getMessage()); //parametr předaný do konstruktoru IOException pak uvidí uživatel jako chybovou hlášku
}
}
Nic složitějšího není potřeba.
- toka
- Člen | 253
Ondřej Mirtes napsal(a):
No pokud tu metodu máš jen v poli
$form->onSubmit[]
, tak ty else části opravdu nemůžou nikdy nastat.Nejlepší způsob pro psaní těch odesílacích metod je tento (neprefixuj je jako action*, ty mají v Nette jiný význam v životním cyklu Presenteru):
public function formSubmitted(AppForm $form) { try { $values = $form->getValues(); $model = new Model; $model->doSomething($values); //uvnitř může vyhodit IOException $this->flashMessage('Úspěch'); //pokud v modelu nastane chyba v modelu, tak se sem už nedojde a uživatel tuto hlášku neuvidí $this->redirect('this'); //nebo jinam, kam chceš } catch (IOException $e) { $form->addError($e->getMessage()); //parametr předaný do konstruktoru IOException pak uvidí uživatel jako chybovou hlášku } }
Nic složitějšího není potřeba.
Děkuji, slibuji že se polepším.
- thunderb
- Člen | 11
BigCharlie napsal(a):
ale akosi mi to nechce chodit.
Předpokládal jsem (zřejmě špatně), že vycházíš z nějakého původně funkčního příkladu – pro začátek je třeba dobré si zkopírovat skeleton (v adresáři Tools) z distribuce. To je takový dobrý základ.
Pokud to tak nebylo, je potřeba doplnit do šablony zobrazování flash messages, jak píše toka.
Přesměrovat můžeš kamkoliv – tedy pokud na stránku, na které si začínal, potom
$this->redirect('this')
. Pokud chceš zobrazit po přesměrování jinou stránku, např.$this->redirect('Kontakt:ulozeno')
– to ale předpokládá, že v presenteru Kontakt něco takového existuje.
Skusil som to teda spravit takto:
<?php
$this->redirect('Kontakt:ulozit')`
?>
ale dostanem:
No route for Kontakt:ulozit(_fid=03eb)
v bootstrap mam routovanie takto:
<?php
$router = $application->getRouter();
$router[] = new Route('<presenter>', array(
'presenter' => 'HomePage',
'action' => 'default',
'id' => NULL
));
?>
- redhead
- Člen | 1313
<?php
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'HomePage',
'action' => 'default',
'id' => NULL
));
?>
Chybí tam action, neví jak má routu vytvořit, když neví kam má přijít action v té URL (a ID by tam mělo být asi taky..)
Editoval redhead (11. 3. 2010 16:41)
- thunderb
- Člen | 11
redhead napsal(a):
<?php $router[] = new Route('<presenter>/<action>/<id>', array( 'presenter' => 'HomePage', 'action' => 'default', 'id' => NULL )); ?>
Chybí tam action, neví jak má routu vytvořit, když neví kam má přijít action v té URL (a ID by tam mělo být asi taky..)
DAKUJEEEM..
jo..nevidel som pre oci.. :)