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