posílání dat přes $.ajax do presenteru

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

Ahoj, mám následující kód:

jquery

$(".event").draggable({
        stop: function( event, ui ) {
            var childPos = $(".event").offset();
            var parentPos =$("table").offset();
            var yPos = childPos.top - parentPos.top;
            var link = $('.container').data('update');
            alert(yPos);
            $.ajax({
                type: 'POST',
                url: link,
                data: {
                    position: yPos,
                    id: this.id
                }
            });
        }

    });

Presenter

public function handleUpdate($position, $id){
            $x = round($position/60+7);
            $y = $position % 60;
            $start = date("H:i:s",mktime($x,$y,0));
            $data = array(
                "start" => $start
            );
            $this->database->table("events")->where("id", $id)->update($data);
        }

Ve zkratce co chci udělat. Dělám na kalendáři podobnému tomu googlovskému. Při posunutí objektu chci aby se updatovala databáze, bohužel se nic nestane a já netuším proč.

matopeto
Člen | 395
+
0
-

ako vyzera ten tvoj ‚link‘ co vytahujes z data toho elementu?

Onarr
Člen | 10
+
0
-

v šabloně mám tento kód, který pak načítám přes „data“ v jquery kódu

var link = $('.container').data('update');
<div class="container" data-update="{link update!}">
iguana007
Člen | 970
+
0
-

A co vidíš v Network panelu v browseru (Ctrl+Shift+I), když se ti má volat ten ajax? Vytvoří se vůbec ten request?
Pokud ne, tak co říká panel Console, není tam nějaký JS error?

Onarr
Člen | 10
+
0
-

200 POST projecter/www/?do=update

Jinak konzole je čistá

Onarr
Člen | 10
+
0
-

Teď si uvědomuji, že handle pravděpodobně zpracovává jen komponenty že? Ve svém kódu je nevyužívám, což bude pravděpodobně ten problém co?

iguana007
Člen | 970
+
0
-

Tak se podivej jeste do logu aplikace/serveru, jestli tam neskoci nejaky error/warning/notice behem toho ajax volani.
Protoze podle toho co pises ti funguje JS, ajax volani handle, jen se ti neprovede kod uvnitr handle v presenteru, pokud to teda chapu dobre …

iguana007
Člen | 970
+
0
-

Onarr napsal(a):

Teď si uvědomuji, že handle pravděpodobně zpracovává jen komponenty že? Ve svém kódu je nevyužívám, což bude pravděpodobně ten problém co?

handleXYZ je jedna z casti zivotniho cyklu presenteru, takze se ti vykona pouze handle, render a beforeRender: https://doc.nette.org/…n/presenters#… a handle muzes klidne volat i tak, jak to volas ted, v tom bych problem asi nevidel … ale pokud mas nejaky kod v actionXYZ a ocekavas jeho vykonani behem ajax volani, tak se tak nestane a budes ho muset presunout do renderXYZ

Jan Mikeš
Člen | 771
+
0
-

Jeste jedna vec, posilas pozadavek typu POST a pokud se nepletu, tak parametry ktere handle metoda prijima jsou z GET. Takze bud musis pozadavek zmenit na GET nebo si v handlu vytahnout z requestu post parametry.

Jan Mikeš
Člen | 771
+
0
-

iguana007 napsal(a):

Onarr napsal(a):

Teď si uvědomuji, že handle pravděpodobně zpracovává jen komponenty že? Ve svém kódu je nevyužívám, což bude pravděpodobně ten problém co?

handleXYZ je jedna z casti zivotniho cyklu presenteru, takze se ti vykona pouze handle, render a beforeRender: https://doc.nette.org/…n/presenters#… a handle muzes klidne volat i tak, jak to volas ted, v tom bych problem asi nevidel … ale pokud mas nejaky kod v actionXYZ a ocekavas jeho vykonani behem ajax volani, tak se tak nestane a budes ho muset presunout do renderXYZ

Tohle je imho spatna informace, proc by se pri ajax requestu melo vynechavat volani actionXYZ? provede se akorat jeste pred handlem.

Onarr
Člen | 10
+
0
-

Zkusil jsem to s tím GET, ale stále to nefunguje. Zdá se, že se metoda handleUpdate nikdy nezavolá, otestoval random zápisem do databáze a ten se neprovede.

Jan Mikeš
Člen | 771
+
0
-

@Onarr posli vice kodu, idealne cely presenter.

Onarr
Člen | 10
+
0
-

Tak jsem otestoval, jestli se metoda zavolá, když odstraním parametry a v takovém případě funguje. Problém tedy je nejspíše v u nich. Jinak teda můj kód:

<?php

namespace App\Presenters;

use Nette;
use App\Model;


class HomepagePresenter extends BasePresenter
{
        private $database;
        private $events;

        public function __construct(Nette\Database\Context $database)
        {
            $this->database = $database;
        }

	public function renderDefault()
	{
		$this->template->events = $this->database->table("events");
	}

        public function getPosition($val){

            (int)$position = $val->h;
            return ($position - 7) * 60;
        }
        public function getHeight($val){
            if($val<30){
                return 30;
            }
            else {
                return $val;
            }
        }
        public function handleUpdate($position, $id){
            //$x = round($position/60+7);
            //$y = $position % 60;
            //$start = date("H:i:s",mktime($x,$y,0));
            $data = array(
                "length" => 75
            );
            $this->database->table("events")->where("id", $id)->update($data);
        }

}
Onarr
Člen | 10
+
0
-

Další testy mi zjistily, že metoda se zavolá, ale proměnné parametrů jsou prázdné :-/

request se provede a vypíše 200
/projecter/www/?do=update&id=2

ale v metodě (kvuli testu jsem ji upravil) je předaná proměnná nulová

$.ajax({
                type: 'GET',
                data: {id: 2},
                url: link
            });
public function handleUpdate($id){

            $data = array(
                "length" => 90
            );
            $this->database->table("events")->where("id", $id)->update($data);
        }

Editoval Onarr (28. 8. 2015 19:58)

Unlink
Člen | 298
+
+2
-

Niesom si teraz istý prečo, ale nemôžeš ten parameter pomenovať $id pretože router to prepíše. Pomenuj ho ako eventId a bude to fungovať :)

Onarr
Člen | 10
+
0
-

Upravil jsem to ID a už to funguje :-) Díky moc, já myslel, že z toho zešílím