jak vytvořit jednotné menu pro celý web? pomocí více presenterů, ajaxu..?
- vmartin
- Člen | 18
Dobrý den, z databáze si načítám položky menu, které vypisuji v
@layout.phtml.
základní presenter mám DefaultPresenter. pokud se ale odkazuji jinam,
zobrazí se chybová hláška, že njsou k dispozici určitá data.
Pochopitelně se default presenter sám nezpouší, když se odkazuji jinam.
Zkoušel jsem vytvořit construcor, kterýmu ale nedokážu předat data.
Proto mě napadla myšlenka dědění presenteru, ale ten není abstraktní.
Možná proto to nejde.
class DefaultPresenter extends Presenter
{
public $oldLayoutMode = FALSE;
public function actionDefault($ID)
{
$seznam1 = new Model;
$seznam2 = new Model;
$this->template->Odvetvi = $seznam1->findOdvetvi();
$this->template->Sporty = $seznam2->findSport($ID);
$this->template->ID = $ID;
}
}
class SoutezPresenter extends Presenter
{
public $oldLayoutMode = FALSE;
public function actionSoutez($ID)
{
$pom = "fotbal";
$this->template->Soutez = $pom;
}
}
Nad proměnnou $ID neuvažujte, zatím zkouším jen zprovoznit tuto
akci.
Zkoušel jsem to dát do jednoho presenteru a ve funkci „actionSoutez($ID)“
zavolat defaultní fci, ale to také neprošlo.
Mohl by mi někdo poradit, jak na to? Nebo mám raději zkusit pochopit
ajax? Děkuji
- vmartin
- Člen | 18
předka jsem chtěl, ale kdesi jsem četl, že by měl být abstraktní, ale já v něm budu pracovat s daty.Ukázka kodu v předchozí zprávě by mohla pracovat jako předek a potomek? Když budu volat SoutezPresenter, předpokládám, že v layoutu budu staticky volat děděnou actionxxx. Pochopil jsem to dobře? děkuji
- bazo
- Člen | 620
predok moze byt abstraktny aj nemusi, to uz je tvoja vec, a to, ze je trieda abstraktna neznamena, ze v nej nemozes manipulovat s datami. takze ten tvoj DefaultPresenter moze kludne byt predok pre SoutezPresenter, ale lepsie je vytvorit este jedneho predka, ktory nebude odnikial volany.
a co si myslel tymto?
v layoutu budu staticky volat děděnou actionxxx
- vmartin
- Člen | 18
takhle mám menu:
<div id="menu">
{foreach $Odvetvi as $_Odvetvi}
<div><a href="{plink Default:Default, $_Odvetvi->ID}">{$_Odvetvi->Nazev}</a></div>
{if $iterator->GetCounter()==$ID}
<ul>
{foreach $Sporty as $_Sporty}
<li><a href="{plink Soutez:Soutez}" alt="">{$_Sporty->Nazev}</a></li>
{/foreach}
</ul>
{/if}
{/foreach}
</div>
data se čtou z default presenteru. když ho budu dědit do všech, tak
předpokládám, že tato data se vždy budou načítat ze všech
presenterů.
Pokud to tak je, tak to zkusím. Něco takového jsem vymýšlel, ale nahlásilo
to chybu, že $Odvetvi neni definovan, ale možná jsem tam někde udělal
blbost.
- Rampa
- Člen | 65
když voláš Soutez:soutez, tak se actionDefault vykonat nemůže.
Vykonává se vždy jen jedna action a to ta volaná (jestli se teda
nepletu).
Jestli podřebuješ nějaký kód, který se má v daném presenteru vykonávat
pokaždé a při všech akcích, vlož ho do startup()
metody.
viz. Životní cyklus presenteru.
//edit překlep
Editoval Rampa (23. 3. 2010 14:22)
- vmartin
- Člen | 18
děkuji za rady. Hlásí mi to chybu
„Declaration of BasePresenter::beforeRender() should be compatible with that
of Presenter::beforeRender()“ to znamená, že nemůžu dědit od
presenter?
Jde potom volat beforeRender pomocí
/--<a href=„{plink Default:beforeRender, $_Odvetvi->ID}“>\--
?
Jde mi o funkčnost tohohle:
\--
<div id="menu">
{foreach $Odvetvi as $_Odvetvi}
<div><a href="{plink Default:beforeRender, $_Odvetvi->ID}">{$_Odvetvi->Nazev}</a></div>
{if $iterator->GetCounter()==$ID}
<ul>
{foreach $Sporty as $_Sporty}
<li><a href="{plink Default:Soutez}" alt="">{$_Sporty->Nazev}</a></li>
{/foreach}
</ul>
{/if}
{/foreach}
</div>
<p>{include #text}</p>
</div>
- Etch
- Člen | 403
No nevím přijde mi ten dotaz trochu zmatený, ale furt nějak nechápu proč data která potřebuješ všude nevytahuješ třeba v BasePresenteru něco jako:
class BasePresenter extends Presenter{
public $oldLayoutMode = FALSE;
public function startup(){
parent::startup();
$seznam1 = new Model;
$seznam2 = new Model;
$this->template->Odvetvi = $seznam1->findOdvetvi();
$this->template->Sporty = $seznam2->findSport($this->getParam('id'));
$this->template->ID = $this->getParam('id');
}
}
class DefaultPresenter extends BasePresenter{
}
class SoutezPresenter extends BasePresenter{
public function actionSoutez(){
$pom = "fotbal";
$this->template->Soutez = $pom;
}
}
Editoval Etch (27. 3. 2010 19:51)
- vmartin
- Člen | 18
Děkuji, to vypadá, že mi vyřešilo problém. Jen mi to teď píše
u odkazu Error: Extra parameter for Default:Default.
Tak jsem zkusil vytvořit v DefaultPresenteru
public function actionDefault($ID){
}
Akci volám takto:
<a href="{plink Default:Default, $_Odvetvi->ID}">
Doufal jsem, že tento předávaný parametr se použije i ve startup() pro $this->getParam(‚id‘).
Editoval vmartin (28. 3. 2010 13:09)
- rokerkony
- Člen | 122
nedávno vyšel i novej addon od Honzy Marka :) hodně pomocná věcička :-)
viz Navigation