Odstranení parametru „do=“ z adresy po odeslání formuláře
- hiny
- Člen | 35
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.
- Honza Kuchař
- Člen | 1662
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
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
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
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
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
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
Asi by se toho šlo zbavit přesunutím do POST, ale zeptám se spíš na důvod?
- hiny
- Člen | 35
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
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'
))
);