[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
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:
- 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)
- 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)