Jak předat parametr z render metody do POSTu

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

Dobrý den,

vytváříme něco jako souborový systém, kde figurují složky, soubory, a celé je to uložené v db.
Pokud chceme do složky přidat další složku, tak si předáme v URL ID té složky, ve které se zrovna nacházíme. Např. example.php/open/2 … render metoda pak vypadá renderDefault($root_id). Existuje nějaký způsob, jak předat hodnotu $root_id do ZPRACOVÁNÍ formuláře, aniž bychom museli použít:

  1. ActionDefault (action se volá těsně před POST, tudíž se tam ten parametr dostane, to mi ale příjde jako nešťastné řešení, protože Action je vytvořen asi pro jiné účely).
  2. $form->addHidden(„root_id“)->setValue($root_id) a pak s tím pracovat jako s $values->root_id. Jenže tohle mi příjde taky jako nešťastné řešení. Musí se neustále hlídat, zda si uživatel v prohlížeči neupravil tu hodnotu ve skrytém inputu. Za normalních podmínek by to bylo asi v pořádku, jenže tady v tomto specifickém případě by se muselo neustále kontrolovat, zda má uživatel na to root_id dostatečná práva, atd. a to se mi nechce, když už jsem to jednou udělal v render metodě.

Existuje nějaká jiná alternativa?
Díky!

ali
Člen | 342
+
+1
-

Ja osobne resim takove veci nejak takto:

final class FolderPresenter extends BasePresenter
{
	/** @var int */
	private $rootId;

	protected function startup()
	{
		parent::startup()

		$this->rootId = (isset($this->params["root_id"]) ? $this->params["root_id"] : NULL);

		if ($this->rootId === NULL) {
			$this->error(NULL, 404);
			// or something else
		}
	}

	...
}

Takto si jednoduse ohlidas existenci promenne a budes ji mit dostupnout ve vsech metodach presenteru.

CZechBoY
Člen | 3608
+
0
-

A nešlo by to úplně jinak?

Udělal bych si komponentu speciálně na ten upload, která by měla persistentní parametr složku, ve které jsi. Při signálu newFolder! by se ID složky (persistentní) předalo a nemusíš řešit nějaký předávání mezi formulářem a presenterem – prostě to ID předáš vždy (třeba konstruktorem).

BuGeR
Člen | 45
+
0
-

CZechBoY napsal(a):

A nešlo by to úplně jinak?

Udělal bych si komponentu speciálně na ten upload, která by měla persistentní parametr složku, ve které jsi. Při signálu newFolder! by se ID složky (persistentní) předalo a nemusíš řešit nějaký předávání mezi formulářem a presenterem – prostě to ID předáš vždy (třeba konstruktorem).

Aha, to je taky zajimavá myšlenka. Mohl bych poprosit o nějakou ukázku kódu, jak by to mohlo vypadat?

CZechBoY
Člen | 3608
+
0
-

Něco takovýho by mělo snad stačit/fungovat.

class FileManagerControl extends Control
{
	/**
	 * @var int
	 * @persistent
	 */
	public $rootDirectoryID;

	/**
	 * @var string $directoryName
	 */
	public function handleCreateNewDirectory ($directoryName)
	{
		try {
			$newDirectoryID = $this->ioModel->createDir($this->rootDirectoryID, $directoryName);
		} catch (IOException $e) {
			$this->flashMessage('Nejde to vytvořit :(', 'error');
			return;
		}

		$this->changeDirectory($newDirectoryID);
	}

	/**
	 * @var int
	 */
	public function handleNavigateTo ($directoryID)
	{
		$this->changeCurrentRootDirectory($directoryID);
	}

	/**
	 * @var int $newRootDirectoryID
	 */
	private function changeCurrentRootDirectory ($newRootDirectoryID)
	{
		$this->rootDirectoryID = $newRootDirectoryID;

		$this->redrawControl('tree'); // strom adresářů
		$this->redrawControl('files'); // soubory ve složce
	}
}

Editoval CZechBoY (4. 4. 2016 23:18)