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 | 34
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 | 34
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 | 34
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 | 34
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. :-)