Přesměrování po submitu formuláře

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

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

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

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

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.