Použít handle nebo action
- joe
- Člen | 313
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
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
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
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
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.