Ajax nepředá parametr do handle komponenty

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

Ahoj, řeším takový záhadný problém..

v layoutu mám select, který po změně zavolá handle, který se v basePresenteru a ajax dávám GET a do data dávám např.: data: { 'account_id': aid } a v handle potom normálně v parametru handleNeco($account_id);

Když ale nyní udělám podobný select v sablone komponenty a udelam to uplne stejne a handle v komponente, tak mi prostě chodí null, pres firebug vidim ze v url je normalne parametr id nicmene v handleNeco($id = null) je vzdy null.. Nevěděl by někdo ?

David Matějka
Moderator | 6445
+
+2
-

Bude to asi kvuli route, ktera predpokladam vypada nejak takto: <presenter>/<action>[/<id>]. Parametr id z masky se tedy matchne jako NULL a query parametr to jiz neprepisuje.

kleinpetr
Člen | 480
+
0
-

zkousel jsem i jiný název proměnné a stále nic, jaké by bylo ve tvém případě řešení ? a divné je, že u signálu, který je v basePresenteru vše funguje…

Editoval kleinpetr (23. 7. 2015 0:30)

David Matějka
Moderator | 6445
+
0
-

Ahaa komponenta, jsem si to spatne precet. Tam ty parametry nemuzou byt v url identifikovany jen nazvem, ale celym „fqn“, tedy vcetne nazvu komponenty – myComponent-subComponent-id

na gitteru jsme to nekdy vcera/predevcirem resili, najdu a poslu link

kleinpetr
Člen | 480
+
0
-

a jak ho mám tedy předat z js ajaxu do toho signálu v tomhle formátu ? to musím ručně napsat tu url a doplnit id ? Nyní to dělám v latte normálně přes link neco!

David Matějka
Moderator | 6445
+
0
-

viz https://gitter.im/nette/nette/cs?…

tl;dr; z tech moznosti

  • vygeneruj url s placeholderem, tedy treba {link signal! __REPLACEME__} a pak to pri pozadavku nahradis
  • ulozis si do nejakyho data-atributu nazev parametru pres $control->getParameterId('id') a request provedes s timto parametrem
F.Vesely
Člen | 369
+
0
-

Tam jde o to, ze je to komponenta a nazev parametru je zavisly od nazvu komponenty a jejich rodicovskych komponent.

Napriklad: componentA-componentB-parameter=value

Kvuli znovupouzitelnosti komponenty se nemuzes spolehat na to, ze komponenta bude mit nejakeho rodice. Takze si tu url musis nechat vygenerovat i s tim parametrem a pak ho pripadne pomoci JS replace zmenit.

kleinpetr
Člen | 480
+
0
-

No jen nechápu proč signál, který mám va basePresenteru takto:

handleChangeAccount($account_id);

a v @layout.latte pak

$.nette.ajax({
       type: 'GET',
       url: {link changeAccount!},
       data: {
            'account_id': id
       }
});

a tohle prostě normálně funguje…

Nemůžu předávat parametr link do nějakého atributu, protož je to select, takže hodnota se mění podle change() takže se mi asi nejvíc líbilo tohle url: {link handleSome! id => "ID"}.replace("ID", id), což teda vytvoří taky zvláštní url: path?ComponentA-id=1&do=ComponentA-ComponentB

prostě zvláštní, ale funguje…

Editoval kleinpetr (23. 7. 2015 11:27)

F.Vesely
Člen | 369
+
0
-

Predstav si, ze mas v presenteru parametr id, v componente A taky parametr id a v componente B taky parametr id. Jak by pak Nette vedelo, ktery parametr id patri kam? Proto kdyz je to komponenta, tak se do nazvu toho parametru pridava jeji nazev. Jelikoz ale tu komponentu muzes mit na strance vicekrat a ruzne zanorenou, tak se tam pridava i nazev rodicovskych komponent. Ta varianta s replace je funkcni, ale ta druha, co zminuje David se mi libi vice.