ajax payload message vrati null

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

Ahojte

mam taketo kody

$(".addtocart-button").click(function(){
        $.ajax({
            url: "/online/buy",
            dataType: 'JSON',
            data: "{\"json\": \"John\"}",
            success:function(payload) {
                window.console && console.log(payload);	//VRACIA NULL
                window.console && console.log(payload.message);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                window.console && console.log(xhr.responseText);
                window.console && console.log(thrownError);
            }
        });
    });

a

	public function renderBuy($json)
{
    if ($this->isAjax()) {
        $this->payload->message = '{"firstName": "John"}';
    }
}

avsak payload mi stale vrati null

neviete prosim co robim zle ?

dakujem

MKI-Miro
Člen | 271
+
0
-

Tak odpoviem nakoniec sam

chybalo mi tam

$this->sendPayload();
Majkl578
Moderator | 1364
+
0
-

Na AJAX v Nette oporučuji používat nette.ajax.js. Nebudeš pak muset psát takto ošklivý kód, ve kterém jsou tak jako tak chyby:

  1. Nepoužívej URL psanou ručně, generuj ji přes makro {link}.
  2. Data neuváděj jako string, je to prasárna, uváděj standardní objekt.
  3. Payload neuváděj jako string, je to ještě větší prasárna, použij pole nebo stdClass.
  4. Nepředávej JSON jako string přes GET parametr do render metody!!!

V nette.ajax.js by tvoje vypadalo zhruba takto:

$('.addtocart-button').click(function () {
        $.nette.ajax({
            url: {link Online:buy},
            type: 'POST',
            data: {
                name: "John"
            },
            success: function (payload) {
                console.log(payload.message.firstName);
            }
        });
    });
public function renderBuy($name)
    {
        if ($this->isAjax()) {
            $this->payload->message = (object) array(
                'firstName' => $name,
            );

            $this->sendPayload();
        }
    }
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Dokonce by to šlo i bez toho přetypování array, ne?

Majkl578
Moderator | 1364
+
0
-

Určitě, v JSONu to bude totéž, ale kdybych k tomu chtěl přistupovat ještě znovu někde jinde v presenteru, asi bych radši objekt než pole. :)

MKI-Miro
Člen | 271
+
0
-

dakujem za opravu

do renderBuy som pridal aj

$this->invalidateControl('cart');

a do 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}

ale nijako to neprekresluje nic na stranke, pritom ak dam refresh stranky tak uz sa zobrazia nove hodnoty

co robim zle ?

dakujem