Signal – ovladani presenteru a AJAX a generovani URL

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

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

$this->$this->ADSEnabled ???

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

Persistentní proměná musí být public.

viz https://doc.nette.org/…n/presenters#…

Editoval Ani (25. 7. 2010 22:14)

suxik
Člen | 62
+
0
-

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

redhead
Člen | 1313
+
0
-

btw co je zač JS kód, co posílá ajax požadavek? Možná se ti ani neposílá nebo nezabraní ve vykonání normální akce při kliku na link.

suxik
Člen | 62
+
0
-

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

redhead
Člen | 1313
+
0
-

Možná bych ještě zkusil místo signálu, použít normální link, který bude měnit persistentní proměnnou přes URL:

{plink this ADSEnabled => !$ads}