Nakupny kosik cez ajax neupdatuje obsah pouzitim invalidatecontrol

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

Ahojte

Viete mi prosim poradit co v kode robim zle.

Payload mi vrati len payload.message, pricom v niektorom vlakne som cital zeby to malo vratit obsah celeho noveho snippetu.

public function renderBuy($pizzaid)
{
    $pizza = $this->pizzaRepository->findById($pizzaid);

    $session = $this->presenter->context->session;
    $cartSession = $session->getSection('cart');
    $cartItems = $cartSession->cart;

    $cart = new Cart();
    $cart->name = $pizza->name;
    $cart->price = $pizza->price;
    $cart->id = $pizza->id;
    $cartItems[] = $cart;
    $cartSession->cart = $cartItems;
    $this->template->cart = $cartItems;

    if ($this->isAjax()) {
        $this->invalidateControl('cart');
        $this->payload->message = $cartItems;
        $this->sendPayload();
    }

}
$.nette.init();

    $('.addtocart-button').click(function () {
        $.nette.ajax({
            url: '/www/online/buy',
            type: 'POST',
            data: {
                pizzaid: $(this).attr('name')
            },
            success: function (payload) {
                window.console && console.log(payload);  //VRATI LEN PAYLOAD.MESSAGE
            },
            error: function (xhr, ajaxOptions, thrownError) {
                window.console && console.log(xhr.responseText);
                window.console && console.log(thrownError);
            }
        });
    });

dakujem

jiri.pudil
Nette Blogger | 1029
+
0
-
  1. URL v JavaScriptu bys měl sestavovat přes makro {link}
  2. AJAX se zpracovává v signálech (handle* metody), viz dokumentace

Editoval jiri.pudil (15. 4. 2013 8:40)

Glottis
Člen | 129
+
0
-

a jak vypada sablona?

MKI-Miro
Člen | 271
+
0
-

sablona layout.latte

{snippet cart}
    <table>
        {if $cart}
        {foreach $cart as $item}
            <tr>
                <td><a href="#" class="removefromcart-button" name="{$item->id}">x</a></td>
                <td>{$item->name}</td>
                <td>{$item->price}</td>
            </tr>
        {/foreach}
        {/if}
    </table>
{/snippet}

ano ak sa to zacne spravat dobr etak to prehodim do handle

tu je aj link na online verziu http://www.pizza-kosice.sk/www/online/

po kliknuti na pridat do kosika by sa malo na pravej casti prekreslit zoznam pizza

v konzole sa zobrazi len payload.message kde som to teraz prepisal na $this->payload->message = „test“;

Editoval MKI-Miro (15. 4. 2013 9:26)

newPOPE
Člen | 648
+
0
-

Strela od clenku :-D

Nebude to nahodou preto, ze volas $this->sendPayload(), predpokladam, ze to odpali prame poslanie payloadu a na „detekciu“ (kedze to je az v sablone ku ktorej sa to vobec nedostane) snippetov sa ti Nette vykasle…

PS: nevymyslaj tam z custom JS kodom pokial ho nepotrebujes. Include-ni si nette.ajax.js. Pridaj class ajax odkazom ktore potrebujes. Do sablon pridaj {snippet ...} kam potrebujes. Do Presenterov dopln signaly a ficis ;-).

Editoval newPOPE (15. 4. 2013 10:08)

Tomáš Votruba
Moderator | 1114
+
0
-

Zkus také kouknout na nejjednodušší AJAX příklad

MKI-Miro
Člen | 271
+
0
-

newPOPE napsal(a):

Strela od clenku :-D

Nebude to nahodou preto, ze volas $this->sendPayload(), predpokladam, ze to odpali prame poslanie payloadu a na „detekciu“ (kedze to je az v sablone ku ktorej sa to vobec nedostane) snippetov sa ti Nette vykasle…

PS: nevymyslaj tam z custom JS kodom pokial ho nepotrebujes. Include-ni si nette.ajax.js. Pridaj class ajax odkazom ktore potrebujes. Do sablon pridaj {snippet ...} kam potrebujes. Do Presenterov dopln signaly a ficis ;-).

skusil som dat prec $this->sendPayload() a vylsedok stale rovnaky

tomu druhemu odstavcu som velmi nepochopil co nim myslis.

MKI-Miro
Člen | 271
+
0
-

Schmutzka napsal(a):

Zkus také kouknout na nejjednodušší AJAX příklad

skusil som si to a funguje, tak idem postupne tam pridavat veci a zistit v ktorom kroku to spadne, dam potom vediet

MKI-Miro
Člen | 271
+
0
-

takze uz som asi aj nasiel chybu

je potrebné posielať v data paramter do: „AddToCart“

a nie je potrebné dávať do url view ale postačuje presenter

$('.addtocart-button').click(function () {
        $.nette.ajax({
            url: '/www/online3/',
            type: 'POST',
            data: {
                pizzaid: $(this).attr('name'),
                do: "AddToCart"
            },
            success: function (payload) {
                window.console && console.log(payload);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                window.console && console.log(xhr.responseText);
                window.console && console.log(thrownError);
            }
        });
    });
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jen se zeptám, ten sendPayload() musel pryč, ne (aby se odesílaly snippety)?

jiri.pudil napsal: AJAX se zpracovává v signálech (handle* metody), viz dokumentace

V signálech se zpracovávají signály – klidně lze dělat AJAXový požadavek na obyčejný view třeba pro načtení dalších dat. Proto existuje metoda $this->isAjax(), která je dostupná odevšady.