Nefunkční uložení session ve voláni signálu

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

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&amp;do=addToShoppingList&productID=68&amount=543
Foowie
Člen | 269
+
0
-

Nějak se mi nelíbí tato část url (pokud tedy není špatně napsaná)

…productID=69&amp;do=addToShoppingList…

Navíc v té URL máš dvakrát productID

house23
Člen | 17
+
0
-

Foowie napsal(a):

Nějak se mi nelíbí tato část url (pokud tedy není špatně napsaná)

…productID=69&amp;do=addToShoppingList…

Navíc v té URL máš dvakrát productID

No právě že těn &amp 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
+
0
-

&amp; 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
+
0
-

Filip Klimeš napsal(a):

&amp; 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');
}

vyzkoušel jsem a nefunguje. To generování linku jak jsi ho napsal generuje toto:

url: '/bp-potravinov-port-l/www/product/?productID=69&amp;amount=543&amp;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
+
0
-
url: '/bp-potravinov-port-l/www/product/?productID=69&amp;amount=543&amp;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ď &amp; za &) normálně v prohlížeči, provede se všechno?