jak vytvořit jednotné menu pro celý web? pomocí více presenterů, ajaxu..?

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

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

bazo
Člen | 620
+
0
-

vytvor si predka pre vsetky presentery, nazvi ho napr BasePresenter a od neho budu dedit ostatne presentery

vmartin
Člen | 18
+
0
-

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
+
0
-

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
+
0
-

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.

vmartin
Člen | 18
+
0
-

tak bohužel mám stále stejný problém. Dokud využívám defaultPresenter, vše funguje, pokud kliknu na odkaz /--href=„{plink Soutez:Soutez}“\--, zavolám akci soutez, ale uz se neprovede actionDefault. Chtěl jsem ji v té akci zavolat, ale zahlásilo mi to chybu, že akci nezná.

Rampa
Člen | 65
+
0
-

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)

redhead
Člen | 1313
+
0
-

nebo do metody beforeRender()

vmartin
Člen | 18
+
0
-

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>
redhead
Člen | 1313
+
0
-

Na beforeRender se odkazovat nemůžeš. Metodu volá sám presenter těsně před každým vykreslením stránky (tj. před render<View> metodami).. Co se týče té chyby, metoda nemůže přijímat žádné parametry (pokud to tam máš)

vmartin
Člen | 18
+
0
-

To jsem si původně myslel taky, ale zkusil jsem předchozí rady. Potřebuji, aby to bylo spouštěné vždy, ale s parametrem. Jen nevím, jestli to je v nette vůbec možné. Nechtěl bych dávat do každého presenteru stejné části kódu.

Etch
Člen | 403
+
0
-

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
+
0
-

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
+
0
-

nedávno vyšel i novej addon od Honzy Marka :) hodně pomocná věcička :-)

viz Navigation

vmartin
Člen | 18
+
0
-

moc díky, to mi moc pomůže :-)