Persistentní parametr se nepřepíše po uložení ajax modal dialogu
- Phalanx
- Člen | 310
Ahoj,
mám tabulkový výpis produktů + filtr a u toho modální dialog na rychlou změnu názvu produktu + odkaz na /edit produktu, kde je formulář pro celkovou editaci produktu.
Pro zachování filtru mám persistentní parametr backlink v presenteru. Takže standart:
<?php
// v presenteru
$this->storeRequest();
// komponenta
$this->presenter->restoreRequest($backlink);
?>
Vše funguje až na to, že když otevřu komponentu pro modální dialog, uložím, překreslím a pak jdu na standartní editaci, tak se mi backlink snaží vecpat url na otevření modálního dialogu:
/products?product_id=2787&do=productFormDialog-showModal
Přitom v modálním dialogu proběhne uložení dobře, ale nepřepíše se backlink už jakoby nazpět (&do=productFormDialog-showModal zůstává dál v adrese).
Tady je uložení modálního dialogu
<?php
if ($this->presenter->isAjax()) {
$this->template->renderModal = FALSE;
$this->presenter->payload->isModal = TRUE;
$this->redrawControl();
$this->presenter->redrawControl();
} else {
$this->redirect('this', array('sent' => true));
}
?>
Není to bug v Nette?
Lze tento problém nějak řešit? Napadlo mě jen tohle:
Přepsat url ručně v dialogu, ale můj IPresenter nemá metodu requestToUrl.
A žádnou jinou metodu pro získání URL tam nevidím. Takže bych si ji
nespíš vytvořil z vlastního Presenteru a odstranil parametr do ručně a
uložil zpět přes storeRequest.
Nette 2.3.10
edit: opravdu mi pomohlo odstranit do parametr a funguje to jak má. Nejspíš se v Nette neukládá url, když jen přepisujete snippety (bez url), takže když si otevřete modal a uložíte ho, musíte si backlink dostat do stavu před modalem nějak ručně.
<?php
// BasePresenter
public function removeDoFromBacklink($key)
{
$session = $this->getSession('Nette.Application/requests');
if (!isset($session[$key]) || ($session[$key][0] !== NULL && $session[$key][0] !== $this->getUser()->getId())) {
return;
}
$request = clone $session[$key][1];
unset($session[$key]);
$request->setFlag(\Nette\Application\Request::RESTORED, TRUE);
$params = $request->getParameters();
$params[self::FLASH_KEY] = $this->getParameter(self::FLASH_KEY);
if (!empty($params['do'])) {
unset($params['do']);
}
$request->setParameters($params);
$this->storeRequest(BACKLINK_EXPIRATION);
}
// v komponente
$backlink = $this->getBacklink();
if (!empty($backlink)) {
$this->presenter->removeDoFromBacklink($backlink);
$this->presenter->restoreRequest($backlink);
}
?>
Editoval Phalanx (28. 11. 2017 10:55)