Signal – ovladani presenteru a AJAX a generovani URL
- suxik
- Člen | 62
Ahoj, mam dva problemy:
Prvni je, ze mam odkaz, ktery ma zapinat a vypinat cast webu, posle signal presenteru, aby zmenil hodnotu private promenne z false na true nebo naopak, sablona presenteru pak podle hodnoty teto promenne ma zobrazit nebo nezobrazit urcitou cast webu. Problem je v tom, ze to nejede, i kdyz mam ten parametr jako persistentni, proste pokazde tam je vychozi hodnota. Kod:
<?php
class DefaultPresenter extends BasePresenter {
/** @persistent */
private $ADSEnabled = true;
public function beforeRender() {
parent::beforeRender();
$this->invalidateControl();
$this->template->ads = $this->ADSEnabled;
}
public function handleADSSwitch() {
$this->$this->ADSEnabled = !$this->ADSEnabled;
}
}
?>
Volam to AJAXove, ale nefunguje to ani neajaxove.
Druhy problem je, ze i zbytek webu mam ajaxovy, coz sice funguje (1 presenter a vice pohledu) ale nevim jak pri zmene pohledu ajaxem zmenit spravne URL na odpovidajici a resit pripadny refresh stranky, ktery me hodi vzdy na vychozi view
Diky za jakekoli rady
- redhead
- Člen | 1313
- Toto normálně není možné. Ajax jednoduše nemění URL, protože by došlo k běžnému neajaxovému požadavku. Dá se to simulovat tak, že se ajaxová url vloží do url jako hash (za znak #) a přidáním do historie prohlížeče. Při refreshi nebo tlačítku zpět/dopředu se sice zobrazí výchozí stránka, ale zavolá se opět ajax a automaticky zobrazí invalidované komponenty. Já jsem to dokázal rozchodit přes super JavaScriptovou knihovnu jQuery BBQ: Back Button & Query Library (není nutný ani žádný iFrame jak v jiných případech)
EDIT: při zpět/dopředu se pouze změní hash část v URL, takže se nezobrazí výchozí stránka, ale rovnou se volá ajax. Při refreshi se vých. stránka zobrazí a pak volá ajax.
Editoval redhead (25. 7. 2010 22:15)
- Ani
- Člen | 226
Persistentní proměná musí být public.
viz https://doc.nette.org/…n/presenters#…
Editoval Ani (25. 7. 2010 22:14)
- suxik
- Člen | 62
redhead napsal(a):
$this->$this->ADSEnabled ???
tam je samozrejme preklep, ma tam byt jen jednou $this. I kdyz dam tu persistent promennou jako public a handler upravim tak, aby invalidoval pouze snippet s reklamou, stejne me ajaxovy pozadavek presmeruje zpet na vychozi pohled – coz je nezadouci a tlacitko funguje pouze napoprve – vypne. Jak to udelat, aby mi to neprekreslovalo celou stranku (vsechny snippety) a spravne otocilo promennou v presenteru a zustalo na aktualnim view?
Kod handleru:
<?php
public function handleADSSwitch() {
$this->ADSEnabled = !$this->ADSEnabled;
$this->template->flash = $this->ADSEnabled;
$this->invalidateControl('flash');
}
?>
2AJAX a URL: Diky, podivam se na to
- suxik
- Člen | 62
tak uz jsem to vyresil tak, ze musim vkladat parametr true/false do sablony,
protoze jsem proste nedokazal prijit na to, proc to nefunguje persistentne
v presenteru. Ted tedy musim navic invalidovat i dany prepinac, aby se mi
v nem aktualizovala hodnota te ridici promenne… A funguje to, i kdyz jsem
doufal, ze Nette to zvladne i bez toho.
AJAX pouzivam standardni skript jquery.nette