Použít handle nebo action

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

Ahoj,

jen bych se chtěl zeptat, jak byste řešili následující.

Máte nějakou stránku s detailem (například nějaký produkt s ID), kde budou JavaScriptové taby. Defaultně bude aktivní ten první tab. Po kliknutí na jiný tab, by se měl aktivovat a zobrazit pod ním příslušný obsah.

Použít signál (handleTest) a nebo ne? Pokud ano, jak v signálu zjistím zobrazenou stránku (především to ID)?

Adresa s produkty: ../product/ renderDefault()

Adresa s produktem: ../product/4 renderDetail($id)

Za obě adresy pak můžu přidat ?do=test

Nějak si nejsem jistý, jestli by byl můj postup správný…

Editoval joe (19. 6. 2011 0:01)

newPOPE
Člen | 648
+
0
-

Aky postup si vyberies taky budes mat ;-)…

Najjednoduchsia cesta je asi vysypat obsahy tabov na jednu stranku a JS ich skryt a prepinat sa medzi nimi.

Pokial to chces riesit signalmi tak sa k parametrom dostanes tak isto ako v action, render…

<?php
	public function handleTest($id) {
		$id = $this->getParam('id'); //alternativa
	}
?>

hlavne tam ?do=test nepridavaj rucne ale pouzi makro resp, n:atribut

	<a n:href="test! $id">...
joe
Člen | 313
+
0
-

newPOPE napsal(a):

Najjednoduchsia cesta je asi vysypat obsahy tabov na jednu stranku a JS ich skryt a prepinat sa medzi nimi.

Nejjednodušší ano :-) Samozřejmě to tak udělat můžu a popravdě to teď i tak mám, ale přijde mi zbytečný načítat asi 5 skrytých tabů, na které se pak uživatel třeba ani nekoukne. Právě proto bych to chtěl řešit jinak.

S tím přidáváním ?do=test jsem to myslel trochu jinak.

V Presenteru mám dejme tomu tyto metody (jsou smyšlené):

class PagePresenter extends Presenter {

renderDefault() {}
renderDetail($id) {}
renderAbout() {}
renderUser($id) {}
...

}

Tzn. ve výsledku funkční adresy:

/page/default

/page/order/4

/page/about/

/page/user/6

a pak tam bude definovaný nějaký signál

handleTest()

Pokud bych nedával $id jako parametr tomu signálu, pak vím, že se k němu dostanu přes $this->getParam('id'), ale byl by tu problém s tím, že nevím s jakou render metodou to je „spojené“.

Do každé z těch 4 napsaných adres by kdokoli mohl přidat ?do=test a v případě adres:

/page/order/4?do=test

/page/user/6?do=test

by to dělalo hned, co nemá, protože v obou je ID něčeho jiného. Takže v signálech ještě třeba ověřovat action, ze které přišly? Zajímalo by mě právě nějaké správné řešení.

Takže by to nejspíš mělo být

handleTest($id) {}

Je to tak? Asi se jedná o špatný příklad …

newPOPE
Člen | 648
+
0
-

Aha jasne.

Tak potom tak ze kazda „adresa“ ma svoju sablonu cize v sablone povies aky chces ten signal pouzit tym padom to mas rozlisene

pokial vsak budu vsetky dedit od nejake predchadzajucej (x% obsahu sablon by bolo rovnakych) tak potom by som si to obalil do block a v tej konkretnej sablone pretazil…

joe
Člen | 313
+
0
-

Jasně, v šabloně si vytvořím odkaz na signál {link test! $id}, to ale neznamená, že zvědaví uživatelé nemůžou do jiné adresy – třeba ve stejném presenteru – zkusit dopsat ?do=test a vyzkoušet co to udělá.

Takže třeba adresu

/page/default

pozměnit na

/page/default?do=test

volání $this->getParam('id') v signálu test pak vrátí NULL. Takže pouhé volání getParam('id') bez jakéhokoli ověření je nedostatečné. Možná bych se vsadil, že většina začátečníků na tohle nemyslí a nevědomě tak tvoří chyby v aplikacích.

--

A k původnímu problému, vlastně asi zde řeším úplně to samé, jako ve vlákně vedle. Ale díky za odpovědi.

newPOPE
Člen | 648
+
0
-

No to uz je na Tebe (prog…) aby si si ten stav osetril ;-)