Jak dostat proměnnou do komponenty

- darkwind
 - Člen | 32
 
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
 
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?

- Václav Mašín
 - Člen | 35
 
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
 
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 | 35
 
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
 
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
 
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
 
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).

- Václav Mašín
 - Člen | 35
 
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 | 35
 
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. :-)