Odstranení parametru „do=“ z adresy po odeslání formuláře

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

Zdravím, vytvořil jsem si komponentu obsahující formulář a po jeho odeslání vypadá adresní řádek takto http://localhost/kontakty?do=kalkulace-form-submit.

Nicméně bych chtěl docílit toho, aby vše počínaje otazníkem bylo skryto a aby výsledná adresa vypadala takto http://localhost/kontakty.

Zatím co to tu píšu, jsem ještě zkusil upravit routu(původně jsem tam řádek s ‚do‘… neměl), nyní vypadá takto:

<?php
$router[] = new Route('<path>/<do>', array(
	'presenter' => 'Articles',
	'action' => 'default',
	'path' => NULL,
	'do' => NULL,
));
?>

Výsledná adresa pak je http://localhost/kontakty/kalkulace-form-submit, ale to pořád ještě není můj vysněný cíl, i když uznávám, že takhle už je to o moc lepší.

Je nějaký rozumný způsob jak se té poslední části adresy zbavit uplně? Tedy takovým způsobem, aby to mělo pořád stejnou funkčnost.

Jur4
Člen | 51
+
0
-

Nepomůže přesměrování, po zpracování toho formuláře?

Toto by mělo být na konci metody, ve které zpracováváš formulář.

$this->redirect('...'); //$this->redirect('this'); pokud to ma jit na stejny presenter
Honza Kuchař
Člen | 1662
+
0
-

Po zpracování formuláře

$this->redirect('this');

Přesměruje to uživatele na stejnou stránku, ale bez toho signálu (do=). Tohle by se mělo provádět po každém odeslání formuláře aby uživatel ten formulář neodeslal znova. Flash messages se ti zamozdřejmě zachovají.

Ondřej Mirtes
Člen | 1536
+
0
-

Pokud formulář mění stav serveru (odeslání komentáře, odeslání e-mailu…) a neslouží jen k zobrazení dat (např. vyhledávací formulář), pak musí po jeho odeslání následovat přesměrování. Viz Post/Redirect/Get.

hiny
Člen | 35
+
0
-

Děkuji všem za odpovědi, ale když použiji $this->redirect('this'); tak sice dosahnu kýženého efektu, ale formulář se nastaví do výchozích hodnot a neprovede zobrazení výsledků jeho zpracování.

Možná jsem měl formulář popsat lépe hned, aby bylo jasno co má dělat.
Jde o formulář na kalkulace, který obsahuje 6 selectboxu. Na zakladě jejich kombinací by se měl vyhodnotit výsledek a zobrazit ho na stránce.

A předpokládám, že uživatelé budou zkoušet různé možnosti, třeba jen se změnou počtu, ale se zachovaním všeho ostatního co si nastavili, takže by bylo vhodné zachovat volby, co si uživatel nastavil, i po odeslání formuláře.

<?php

class KalkulaceControl extends Control
{
	/** @var pagecontent */
	public $pagecontent = array();


	protected function createComponentForm($name)
	{
		// definice polí do selectboxů

		$form = new AppForm($this, $name);
		// ...
		$form->addSelect('pocet', NULL, $pocet);
		$form->addImage('spocitat', $this->template->baseUri . 'img/sipka.png', 'Spočítat')
					->onClick[] = array($this, 'kalkulaceSubmitted');
		return $form;
	}

	public function kalkulaceSubmitted(ImageButton $button)
	{
		$form = $button->form;

		$title = "Výsledek Vaší kalkulace";
		// zatim není hotovo, takže slouží jako demonstrace funkčnosti
		$fulltext = "text";

		$this->pagecontent = array( (object) array( 'title' => $title, 'fulltext' => $fulltext ) );
		// zde jsem zkousel vlozit
		// $this->redirect('this');
		// ale tim se vse vynuluje
	}

	public function render()
	{
		$template = $this->getTemplate();
		$template->setFile(dirname(__FILE__) . '/kalkulace_form.phtml');
		$template->kalkulace_form = $this->getComponent('form');

		// zde dojde k vlastnímu vykreslení výsledku kalkulace do stránky
		if (!empty($this->pagecontent)) {
			$this->getPresenter('Articles')->template->pagecontent = $this->pagecontent;
		}

		$template->render();
	}

}
?>
Ondřej Brejla
Člen | 746
+
0
-

Tak si nastavíš na formu setDefaults()? Při zobrazení před odesláním zobrazíš opravdu default a po odeslání si nastavíš odeslané hodnoty?

hiny
Člen | 35
+
0
-

Tak nevím, asi sem se do toho už moc zamotal.

Defaultní hodnoty jsem si nastavil. Nastavil jsem i hodnoty po odeslání formuláře, ale to fungovalo i před tím, samo od sebe.

Pokaždé, když odkomentuju řadek s $this->redirect('this'); tak se mi vše přepíše na defaultní hodnoty a nedaří se mi předat obsah formuláře, tak jak byl vyplněn.

Je to jakobych do prohlížeče vepsal znova adresu a zmáčknul enter. Nicméně já bych potřeboval tenhle efekt, ale aby se formulář správně zpracoval až do konce.

Už z toho mám hlavu nějak mimo, tak doufám, že tu nepíšu uplné nesmysly :-)

Ondřej Brejla
Člen | 746
+
0
-

Tak si ty „odeslané“ údaje, v tom mezikroku (při zpracování a před redirectem), ulož třeba do sešny (nebo je předej nějak jinak…). A tam, kde normálně nastavuješ defaultní hodnoty (nejspíš v továrničece?), se do té sešny podívej a pokud v ní něco bude, tak nastav default hodnoty z ní…pokud v ní nic nebude, nastav klasické default…

Snad ten problém chápu dobře.

Editoval Warden (11. 10. 2009 22:31)

David Grudl
Nette Core | 8228
+
0
-

Asi by se toho šlo zbavit přesunutím do POST, ale zeptám se spíš na důvod?

hiny
Člen | 35
+
0
-

Warden napsal(a):

Tak si ty „odeslané“ údaje, v tom mezikroku (při zpracování a před redirectem), ulož třeba do sešny (nebo je předej nějak jinak…).

Tak jsem to tak zkusil udělat a více-méně to funguje, i když to má jednu vadu. A to tu, že když uložím session, tak se mi ty udaje načtou až při dalším kliknutí(ne vždy – divné), do té doby se nastaví defaultní hodnoty.

David Grudl napsal(a):

Asi by se toho šlo zbavit přesunutím do POST, ale zeptám se spíš na důvod?

Přesunutím do POST? Malinko tuším, ale asi bych potřeboval ještě drobet víc „nakopnout“.

A důvod? No, docela začínám pochybovat nad tím, zda to za to stojí. Jde v podstatě o to, že když použiju formulář klasicky a taky ho tak zpracuju, tak vše funguje tak jak potřebuji(zachovaní předvyplněných hodnot), s tím rozdílem, že se mi pak nelíbí v adresním řádku ?do=kalkulace-form-submit a formulář se po obnovení stránky odešle znovu(to v tomto případě nevidím jako kritické). Vše za předpokladu, že nepoužiju přesměrování $this->redirect('this');.

Panda
Člen | 569
+
0
-

Pokud by šlo přesunout parametr do do POSTu bez změny funkčnosti, bylo by to moc fajn – bylo by jednoduše možné posílat formulář na jiný presenter bez ošklivostí jako

$form->setAction(
	$this->presenter->link(':Presenter:', array(
		Presenter::SIGNAL_KEY =>
			$form->lookupPath('Nette\Application\Presenter')
			. Presenter::NAME_SEPARATOR . 'submit'
	))
);

Viz https://forum.nette.org/…in-formulare