Persistentní parametr se nepřepíše po uložení ajax modal dialogu

Phalanx
Člen | 310
+
0
-

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)