Nefunkční uložení session ve voláni signálu
- house23
- Člen | 17
Ahoj všichni, řeším problém s nákupním košíkem. Po kliknutí na tlačítko volám JS pro vyvolání modalního okna, kde se provede ajaxové zavolání handleru, který by měl uložit do session aktuální produkt a jeho množství.
Momentálně mám ovšem problém že se mi nechce vykonat nic co je v té handle metodě.
JS kde volam ten handler:
<script>
{include #jsCallback, link => addToShoppingList}
</script>
{define #jsCallback}
$('#addToList').on('show.bs.modal', function (event) {
var amount = 10;
$.nette.ajax({
type: 'GET',
url: '{link {$link}!}',
data: {
'productID': 68,
'amount' : "543"
}
});
});
$('#btnAdd').click(function () {
$('#addToList').modal({
show: true
});
});
{/define}
Kod handleru:
public function handleAddToShoppingList($productID,$amount)
{
$parameters = $this->getParameters();
$shoppingList = $this->getSession('list'); // returns SessionSection with given name
$shoppingList->productID = $parameters['productID'];
$shoppingList->amount = $amount;
$this->invalidateControl('itemsInList');
}
Když se podívám na odeslané requesty tak je vše v pořádku, po kliknutí se odešle:
Request URL:http://localhost:8888/projekt/www/product/?productID=69&do=addToShoppingList&productID=68&amount=543
- house23
- Člen | 17
Foowie napsal(a):
Nějak se mi nelíbí tato část url (pokud tedy není špatně napsaná)
…productID=69&do=addToShoppingList…
Navíc v té URL máš dvakrát productID
No právě že těn & tam být nemá a nechápu kde se tam bere. Ten productID tam je dvakrát protože jednou je to url produktu jako stránky a za tím do= je to parametr funkce.
- Filip Klimeš
- Nette Blogger | 156
&
je tam proto, protože v Nette funguje tzv. context
aware escaping, tudíž když vypisuješ proměnnou $link
do JS,
celý odkaz se escapne. Proměnná productId
se přidá dvakrát,
protože ji přidáváš v JS podruhé v data:
.
Zkusil bych něco takového
$.nette.ajax({
type: 'GET',
url: {link addToShopingList!, 'productID' => 69, 'amount' => '543'}
});
a v presenteru pak přistupovat přímo k předaným proměnným
public function handleAddToShoppingList($productID,$amount)
{
$shoppingList = $this->getSession('list'); // returns SessionSection with given name
$shoppingList->productID = $productID;
$shoppingList->amount = $amount;
$this->invalidateControl('itemsInList');
}
Editoval Filip Klimeš (27. 3. 2015 9:01)
- house23
- Člen | 17
Filip Klimeš napsal(a):
&
je tam proto, protože v Nette funguje tzv. context aware escaping, tudíž když vypisuješ proměnnou$link
do JS, celý odkaz se escapne. ProměnnáproductId
se přidá dvakrát, protože ji přidáváš v JS podruhé vdata:
.Zkusil bych něco takového
$.nette.ajax({ type: 'GET', url: {link addToShopingList!, 'productID' => 69, 'amount' => '543'} });
a v presenteru pak přistupovat přímo k předaným proměnným
public function handleAddToShoppingList($productID,$amount) { $shoppingList = $this->getSession('list'); // returns SessionSection with given name $shoppingList->productID = $productID; $shoppingList->amount = $amount; $this->invalidateControl('itemsInList'); }
vyzkoušel jsem a nefunguje. To generování linku jak jsi ho napsal generuje toto:
url: '/bp-potravinov-port-l/www/product/?productID=69&amount=543&do=addToShoppingList'
Nechápu to kde je problém, v debugeru mám 200 OK že se všechno poslalo ok, když změním název toho signálu na nějaký který neexistuje tak mi to hlásí chybu že signál nebyl zachycen, že daná metoda neexistuje což považuju za správné chování. Proč tedy se mi nevykoná nic co je v té handle metodě?
Editoval house23 (27. 3. 2015 9:22)
- Filip Klimeš
- Nette Blogger | 156
url: '/bp-potravinov-port-l/www/product/?productID=69&amount=543&do=addToShoppingList'
Nechápu to kde je problém, v debugeru mám 200 OK že se všechno poslalo ok, když změním název toho signálu na nějaký který neexistuje tak mi to hlásí chybu že signál nebyl zachycen, že daná metoda neexistuje což považuju za správné chování. Proč tedy se mi nevykoná nic co je v té handle metodě?
To, že se ti to vyrenderuje escapované je divné. Nenechal si okolo makra {link} uvozovky?
K provedení obsahu v handle metodě – ještě mě napadá, zkus si
otevřít tu URL (nahraď &
za &
)
normálně v prohlížeči, provede se všechno?