Ajax nepředá parametr do handle komponenty
- kleinpetr
- Člen | 480
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
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.
- David Matějka
- Moderator | 6445
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
- David Matějka
- Moderator | 6445
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
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
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
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.