Podivné: jak předávat parametry v komponentách s továrnou PO ajaxovém požadavku?

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

Zdravím,

potřeboval bych v Latte zavolat komponentu, předat ji určité parametry ({control test vartest}), s nimi pracovat uvnitř komponenty, vykreslit ji a získat stejné parametry i při dalším načtení přes ajax. Už jsem se do toho vážně zamotal.

Komponenta:

<?php
	use Nette\Application\UI\Control;


	class TestControl extends Control
	{

		private $database;
		private $test;

		public function __construct(Nette\Database\Context $database)
		{
			parent::__construct();
			$this->database = $database;
		}

		public function render($test = NULL)
		{
			if(is_null($test)) $test = $this->test; // při prvním volání $test je, pak už ne

			$template = $this->template;
			$template->setFile(__DIR__ . '/test.latte');

			$this->template->link = //odkaz na handleClick - neobsahuje žádné parametry
			$this->template->render();
		}

		public function handleClick()
		{

			if($this->presenter->isAjax())
			$this->redrawControl("test");
		}

	}

	/** rozhraní pro generovanou továrničku */
	interface ITestControl
	{
		/** @return \TestControl */
		function create();
	}

Jde mi tedy o to, jestli nějak můžu dostat proměnnou $test při dalších ajaxových volání. Nebo ji musím dát do odkazu a pak ji přijmout z handleClick? Ale co když tam jsou nějaké interní údaje? Posílat nějaký token? Nebo jak byste to řešili vy?

Praktický příklad: anketa, která má dva různé vzhledy, které se liší podle toho, kde se anketa vykresluje. Na úvodní stránce bude její pozadí barevné (předám při vykreslení true), jinde černobílé (předám při vykreslení false). False je všude v pořádku (jen díky tomu, že podmínka je if($test)), true jen při načtení ankety. Jakmile uživatel zahlasuje, objeví se null a problém je na světě.

Editoval nettolog (11. 7. 2015 22:28)

nettolog
Člen | 68
+
0
-

Když nad tím tak přemýšlím, tak se asi pokouším o technicky nemožnou věc. Musím ty parametry poslat a získat přes GET/POST, jinak to nepůjde.

Oli
Člen | 1215
+
+1
-

Je to jednoduché. Ty předáváš tu proměnnou $test z presenteru, ale překresluješ jen vnitřek komponenty. Buď obal celou komponentu snippetem

{snippet test}
{control test vartest}
{/snippet}

nebo si to předej pomocí set metody. Pokud teda víš co bude v té proměnné test. V konkrétním případě jestli jsi na homepage nebo někde jinde to už víš a můžeš to poslat s klidným svědomím setrem.

nettolog
Člen | 68
+
0
-

To mě nenapadlo, díky. Ale můžu z komponenty překreslovat snippet test, který je mimo komponentu? Nebude to hledat snippet test jen v továrně?

David Matějka
Moderator | 6445
+
0
-

A potrebujes ten parametr nastavovat ze sablony? Ve vetsine pripadu to vis jiz v presenteru – jako tvuj priklad s anketou, v homepage presenteru (treba v tovarne na komponentu..) proste pres setter nastavis komponente nejakou hodnotu. A je po problemech ;)

nettolog
Člen | 68
+
0
-

To je právě to, asi jsem použil špatný příklad pro mou situaci. Řeším komponentu, u které je nutné dodat vstupní parametry až jedině v latte. Nebo myslíš, že by to šlo i v tomto případě nějak přes presenter?

Řekněme, že mám hvězdičkové hodnocení článku, které se zobrazuje na Homepage, v detailu článku i v sidebaru. Komponentu tedy vytvářím v basepresenteru.

V presenterech pošlu do template query, v template pak foreach, kde předám id článku a vzhled hodnocení. V sidebaru bude třeba menší než v Homepage, apod. Nebo v sidebaru nepůjde hodnotit, jen se zobrazí aktuální stav hodnocení.

Nebo by šlo v komponentě zjistit, jaký view si ji vyžádal?

David Matějka
Moderator | 6445
+
0
-

@nettolog v tomto pripade bych nevytvarel komponentu v base presenteru, ale:

  1. v detailu vytvoris komponentu a hned znas ID, takze ho muzes predat
  2. na homepage bych pouzil multiplier