Jak dostat proměnnou do komponenty

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

Ahoj,
nejdřív se chci omluvit, protože to je asi banalita, jen na to nemůžu přijít… :-)

mám vytvořenou komponentu na formulář a ten volám ze dvou šablon – edit a create. To mi funguje správně. Je to formulář na přidávání stránek, které mohou být zařazeny do nekonečného stromu. (už jsem tu měl topic ohledně šablony, se kterým jste mi pomohli)
A jedna ta stránka je ROOT stránky, u které nechci dát možnost zařadit ji kamkoliv jinam ve stromu.

Tady mám volání formuláře v akci edit, kde i nastavuju default hodnoty:

public function actionEdit($id)
{
	$data = $this->model->getPages()->get($id);

        $this['pageForm']->setDefaults(array(
        	'id' => $data['id'],
		'title' => $data['title'],
        	'parent_id'  => $data['parent_id']
        ));

	$this->page = $this->model->getPages()->get($id);
}

…a tady mám tu komponentu s formulářem:

protected function createComponentPageForm()
	{
		$form = new Form();
		$form->addHidden('id');

		$form->addText('title', 'Název stránky:', 40, 100)
			->addRule(Form::FILLED, 'Je nutné zadat název stránky.');

		$tree = $this->comboPageTree($this->generatePagesTree(0));
		$form->addSelect('parent_id', 'Zařazení ve stromu:', $tree)
			->setPrompt('- vyberte rodičovskou kategorii -')
			->addRule(Form::FILLED, 'Je nutné vybrat, kam chcete zařadit stránku ve stromu.');
		$form->addSubmit('create', 'Uložit stránku');
		$form->onSuccess[] = callback($this, 'savePage');

		return $form;
	}

A já bych potřeboval do té komponenty dostat, jestli je ten formulář volán pro tu ROOT stránku a pokud ano, tak nezobrazovat addSelect pro výběr stromu…
Asi je to úplná blbost, ale nějak se v tom motám už nějakou dobu.
Díky moc za nakopnutí :)
darkwind

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Hm, kde máš informaci o tom, jestli jde o ROOT stránku? V tom poli $data? Pokud ano, uložil bych si ho do privátní proměnné presenteru ($this->data), a v továrničce na ten formulář bych podle potřebné hodnoty buď ->addSelect(... zavolal nebo nezavolal. Hm?

darkwind
Člen | 32
+
0
-

No, když si v actionEdit uložím něco do proměnné pomocí $this->data = $data->rootCat;, a v té komponentě createComponentPageForm() si dám echo $this->data, tak mi to nevypíše nic. Při dump($this->data) mi to vypíše NULL.
Nahoře mám definováno private $data;

Václav Mašín
Člen | 26
+
0
-

darkwind napsal(a):

No, když si v actionEdit uložím něco do proměnné pomocí $this->data = $data->rootCat;, a v té komponentě createComponentPageForm() si dám echo $this->data, tak mi to nevypíše nic. Při dump($this->data) mi to vypíše NULL.
Nahoře mám definováno private $data;

Z komponenty na prezenter se nechá dostat přes $this->presenter. Takže bych zkusil ne $this->data, ale $this->presenter->data.

Editoval Václav Mašín (2. 5. 2012 8:03)

darkwind
Člen | 32
+
0
-

Taky ne. Vypadá to, že se mi vůbec nepřepíše ta hodnota proměnné $data

pokud do definice dám private $data = "test";, a potom si tu $this->presenter->data (nebo klidně i $this->data) vypíšu, tak to př dump vypíše „test“ (4).

takže můj odhad je, že se $this->data = $data['rootCat']; vůbec neprovede…

Václav Mašín
Člen | 26
+
0
-

darkwind napsal(a):

Taky ne. Vypadá to, že se mi vůbec nepřepíše ta hodnota proměnné $data

pokud do definice dám private $data = "test";, a potom si tu $this->presenter->data (nebo klidně i $this->data) vypíšu, tak to př dump vypíše „test“ (4).

takže můj odhad je, že se $this->data = $data['rootCat']; vůbec neprovede…

Aha, no ono jak teď ještě koukám, tak ta proměnná $data je definovaná jako lokálni v actionEdit(). Tím pádem je přístupná čistě jen tady. Takže by ji to patrně chtělo dát jako vlastnost/property daného presenteru a v actionEdit() k ní přistupovat přes $this->data.

darkwind
Člen | 32
+
0
-

hmm, to tady došlo k zaměnění názvů proměnných, to se omlouvám, že jsem si toho nevšiml dřív :-/

název proměnné tedy používám $rootCat, který je už unikátní ($data nebylo).
$rootCat mám definovaný přímo pod class PagesPresenter extends DashboardPresenter { jako private $rootCat = "test";

v actionEdit() se potom snažím přenastavit ten $rootCat takto: $this->rootCat = $data['rootCat'];, což by myslím mělo fungovat (a když si dám dump($this->rootCat); řádek pod tím nastavením nové hodnoty, tak mi to vypíše tu novou, přenastavenou hodnotu.

Ale pokud si dám dump($this->rootCat) nebo dump($this->presenter->rootCat) až v createComponentPageForm(), tak mi to vypíše tu původní hodnotu („test“) místo té nově nastavené…

Asi se vyjadřuju moc složitě :-/

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Václav Mašín To jsem přece navrhoval hned v první odpovědi :)

darkwind Pokud v actionEdit přiřadíš do $this->data nějakou hodnotu, tak v createComponent... určitě bude přiřazená (pokud k té komponentě nepřistupuješ v metodě startup()). Zkontroluj si obsah toho $data['rootCat'] v actionEdit třeba pomocí Debugger::barDump(). Možná už tam je prázdné.

Je třeba to přiřazení provést před komunikací s tou komponentou (tedy v tvém případě před řádkem se ...]->setDefaults(...).

Editoval vojtech.dobes (2. 5. 2012 9:12)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Kde máš tu továrničku? V presenteru? Pak určitě používej $this->rootCat (prostě privátní proměnnou té třídy). $this->presenter->rootCat by dávalo smysl používat v nějaké komponentě (jiné třídě, potomkovi PresenterComponent nebo obvykle Control).

darkwind
Člen | 32
+
0
-

Václav Mašín napsal(a):
Je třeba to přiřazení provést před komunikací s tou komponentou (tedy v tvém případě před řádkem se ...]->setDefaults(...).

Ha, ano, to funguje! :-))
Děkuju moc, vůbec mě nenapadlo to dát před ty setDefaults :-))

Václav Mašín
Člen | 26
+
0
-

Hmm, tak tady mě momentálně už nic nenapadá. I jsem si tady u sebe něco podobného teď zkusil a přišlo mi, že to takto chodí. Možná lepší, když byste sem přece jen ještě jednou raději zkopíroval celý ten aktuální kód…

Václav Mašín
Člen | 26
+
0
-

darkwind napsal(a):

Václav Mašín napsal(a):
Je třeba to přiřazení provést před komunikací s tou komponentou (tedy v tvém případě před řádkem se ...]->setDefaults(...).

Ha, ano, to funguje! :-))
Děkuju moc, vůbec mě nenapadlo to dát před ty setDefaults :-))

Jen opravím – nenapsal Václav Mašín, ale kolega vojtech.dobes, který Vám dobře radil už od začátku, čehož já si „jaksi“ nevšiml. Mea culpa. :-)

darkwind
Člen | 32
+
0
-

nějak se tam pomotaly jména při citaci :-))

každopádně děkuju oběma :)