[rev 351+] Bug v Presenter.php

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

Před časem jsem tu psal o bugu v souboru Presenter.php, ale jelikož jsem to špatně formuloval a splývalo to s další chybou, rád bych to teď napsal přesněji.

Dejme tomu, že mám soubor DefaultPresenter.php napsaný nějak takhle:

<?php
final class DefaultPresenter extends BasePresenter
{
	public function renderDefault($url)
	{
		$this->invalidateControl('content');
		$this->template->page = /** vkládám data z modelu **/;
	}
}
?>

a presenter EditPresenter.php:

<?php
final class EditPresenter extends BasePresenter
{
	public function renderDefault()
	{
		$this->invalidateControl('content');
		// formulář natahuju až v šabloně přes {widget}
	}

	public function createForm($name)
	{
		// tvorba formuláře s tlačítkem, které má nastavenou událost onClick[] na array($this, 'doSomeAction');
	}

	public function doSomeAction(SubmitButton $button)
	{
		// zde je vkládání dat do db
		$this->flashMessage('Page was successfully modified', 'success');
		$this->ajaxRedirect('Default:', $newurl); // v případě ajax požadavku použije forward, jinak redirect, newurl obsahuje novou adresu stránky
	}
}
?>

A @layout.phtml nějak takto (velmi zjednodušeně):

<html>
<head>
{*hlavičky*}
</head>
<body>
{snippet content}
	@{include $content}
{/snippet}
</body>
</html>

A teď mi vyvstávají dva problémy při ajax režimu:

  1. při forwardu se nezachovávají flash messages; řešení:

na tomto řádku modifikovat podmínku na ($mode === 'redirect' || $mode === 'forward') && $this->hasFlashSession() – když je se redirectuje nebo forwarduje tak se zachovaj flash zprávy (teď je tam jen redirect)

  1. při forwardu dojde k dvojímu odeslání obsahu payload z čehož potom plyne InvalidStateException; řešení:

na tomto řádku modifikovat podmínku na $this->isAjax() && !($e instanceof ForwardingException) – prostě že se neodešle obsah payloadu když se forwarduje

Editoval Ola (4. 7. 2009 13:22)

David Grudl
Nette Core | 8147
+
0
-

fixed

laada
Člen | 35
+
0
-

Ve stabilni verzi tenhle bugfix nezabral.

fce hasFlashSession() v te podmince uz vraci false.