Přesměrování po submitu formuláře
- sandal
- Člen | 8
Ahoj,
mám problém s přesměrováním po submitu formuláře. Když přejdu na adresu localhost/edit/?contract=123798&part=1 zobrazí se mi správně formulář s dvěma hidden fieldy. Nicméně po jeho submitu bych očekával, že aplikace umře (ten kód pak bude samozřejmě jiný, jde o demonstraci :-) ), protože první volání v editFormSubmitted je die().
Nicméně skončím s chybou:
Undefined index: contract
na řádce:
$form->addHidden(‚contractId‘, $params[‚contract‘]);
Co se tedy děje po submitu formuláře, proč se znovu vykresluje default.latte, když ještě není zpracovaný formulář?
Když docílím (doufám s vašimi radami) zpracování formuláře, jak provedu přesměrování na defaultní stránku Detail presenteru včetně přenosu parametrů contract a part?
Díky
Verze nette 2.0.12, PHP 5.3.6
<?php
use Nette\Application\UI;
/**
* Edit presenter.
*/
class EditPresenter extends UI\Presenter
{
public function renderDefault() {
}
function createComponentEditForm() {
$form = new UI\Form;
$params = Nette\Environment::getApplication()->presenter->request->getParameters();
$form->addTextArea('contractName', 'Název zakázky');
$form->addTextArea('partName', 'Název části zakázky');
$form->addHidden('contractId', $params['contract']);
$form->addHidden('partNo', $params['part']);
$form->addSubmit('send', 'Upravit');
$form->onSuccess[] = callback($this, 'editFormSubmitted');
return $form;
}
public function editFormSubmitted(UI\Form $form) {
die();
}
}
- duke
- Člen | 650
Problém je v tom, že po odeslání formuláře již nemáš parametr contract v $_GET, ale přesto k němu v továrničce přistupuješ. Továrnička se volá, jakmile aplikace potřebuje pracovat s objektem formuláře, což je také při jeho zpracování. Můžeš to vyřešit např. tak, že nastavení hodnot hidden inputů uděláš podmíněné takto:
function createComponentEditForm()
{
$form = new UI\Form($this, 'editForm'); // je třeba připojit komponentu již zde, aby šlo použít isSubmitted níže
$form->addTextArea('contractName', 'Název zakázky');
$form->addTextArea('partName', 'Název části zakázky');
$form->addHidden('contractId');
$form->addHidden('partNo');
$form->addSubmit('send', 'Upravit');
$form->onSuccess[] = callback($this, 'editFormSubmitted');
if (!$form->isSubmitted()) {
$params = $this->parameters; // není třeba používat Nette\Environment
$form->setValues(array(
'contractId' => $params['contract'],
'partNo' => $params['part']
));
}
return $form;
}
Editoval duke (5. 11. 2013 18:18)
- sandal
- Člen | 8
Díky, to vysvětlení s továrničkou pomohlo. Pak jsem přišel na to, že nejspíš dělám chybu v přednastavování hodnot do formuláře rovnou v továrničce, což jsem si potvrdil na https://pla.nette.org/…to-edit-form. Tak jsem to vykutal a všechno už funguje jak má.
- duke
- Člen | 650
To potvrzení, na které odkazuješ, bych nebral příliš vážně. Nastavovat výchozí hodnoty v továrničce rozhodně není špatně (je to více lazy). Jen je pak vhodné to podmínit i tím isSubmitted (aby to bylo zcela lazy). Viz tato diskuse.