formular  – odoslanie formulara – sprava o odoslani

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

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 | 279
+
0
-

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 | 279
+
0
-

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
+
0
-

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 | 249
+
0
-
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 | 249
+
0
-

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)

thunderb
Člen | 11
+
0
-

Takze mam presenter Kontakt, ktoreho sucastou je okrem kontaktnych informaciia aj tento formular..

kam teda to mam presmerovat?

BigCharlie
Člen | 279
+
0
-

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.

BigCharlie
Člen | 279
+
0
-

A doporučuji projít příklady z distribuce, z nich se to dá dobře vysledovat.

Ondřej Mirtes
Člen | 1536
+
0
-

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 | 249
+
0
-

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
+
0
-

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 | 249
+
0
-

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
+
0
-

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
+
0
-
<?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
+
0
-

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.. :)