Serazeni prvku a ulozeni do databaze

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

Ahoj, jeste jsem se v nette neucil pouzivat ajax. Vsechny formulare generuju v presenteru. Ted bych ale potreboval udelat jednu vec. Mam seznam polozek tahanych z databaze a chtel bych udelat moznost razeni. Na to jsem udelal js pomoci jQuery sortable. Ale po razeni bych ulozit poradi pomoci tlacitka „ulozit poradi“. Jak nejlepe to provest a ulozit polozky, kdyz to nemam udelane jako form? V databazi jsem si vytvoril kolonku „order“ dle ktere bych to radil

takze si generuji treba:

<ul class="polozky">
<li id="1" class="post odd">
<li id="2" class="post even">
<li id="3" class="post odd">
</ul>

a pak ziskam poradi tech „id“ a dle toho to potrebuji ulozit do db

dekuji

edit:
Jak, kdyz zavolam ajax, ziskam v presenteru v metode handleAjax data z te sablony nebo z js? Upravim si poradi a potrebuji to nejak ziskat

Editoval dawe (15. 6. 2014 22:30)

Filip Klimeš
Nette Blogger | 156
+
0
-

dawe napsal(a):

Ahoj, jeste jsem se v nette neucil pouzivat ajax. Vsechny formulare generuju v presenteru. Ted bych ale potreboval udelat jednu vec. Mam seznam polozek tahanych z databaze a chtel bych udelat moznost razeni. Na to jsem udelal js pomoci jQuery sortable. Ale po razeni bych ulozit poradi pomoci tlacitka „ulozit poradi“. Jak nejlepe to provest a ulozit polozky, kdyz to nemam udelane jako form? V databazi jsem si vytvoril kolonku „order“ dle ktere bych to radil

takze si generuji treba:

<ul class="polozky">
<li id="1" class="post odd">
<li id="2" class="post even">
<li id="3" class="post odd">
</ul>

a pak ziskam poradi tech „id“ a dle toho to potrebuji ulozit do db

dekuji

edit:
Jak, kdyz zavolam ajax, ziskam v presenteru v metode handleAjax data z te sablony nebo z js? Upravim si poradi a potrebuji to nejak ziskat

Napiš si AJAX query, ve kterém pošleš seřazené pole IDček jako parametr (nejlépe POST) subrequestu (dejme tomu sort!) a v metodě handleSort($sortedArr) si je jednoduše vyzvedneš a předáš modelu.

// FooPresenter
public function handleSort($sortedArr) {
	$this->fooRepository->saveOrder($sortedArr);
}

// FooRepository
public function saveOrder($sortedArr) {
	foreach($sortedArr as $pos => $id) {
		$this->getTable()->where('id', $id)->update(
			array(
				'order' => $pos
			)
		);
	}
}

Editoval FilipKlimeš (16. 6. 2014 8:20)

dawe
Člen | 59
+
0
-

super diky dnes otestuji.

Ten js jsem tedy napsal takto:

$("#updateOrder").click(function(){
	    $.nette.ajax({
		type: "POST",
		url: this.href,
		data: getPartnersOrder()
	    });

	    return false;
	});

a funkce getPartnersOrder() vypada takto:

function getPartnersOrder(){
    var data = {};
    $("body.admin.partners ul.partners li").each(function(index, item){
	data[index] = $(item).attr("id");
    });
    return data;
}
dawe
Člen | 59
+
0
-

Ale vypada to, ze se mi nic do te hodnoty $sortedArr nepredava :/

public function handleSort($sortedArr) {
Oli
Člen | 1215
+
0
-

Pomocí POST se ti tam nic nepředá. Buď to musíš posílat GETem nebo si to vytáhnout jinak

$post = $httpRequest->getPost(); // vrací pole všech parametrů z POST
$id = $httpRequest->getPost('id'); // vrací POST parametr 'id' (nebo NULL)
Jan Suchánek
Člen | 404
+
0
-

To url o něm neví zkus něco jako :

url: {handleSort! $sortedArr},
Jan Suchánek
Člen | 404
+
0
-

Já sortuji takto:

<script>
    (function($, undefined) {

        $.nette.ext('sortable', {
            load: function (rh) {
                this.createClick();
            },
        }, {
            createClick: function(){
                var that = this;
                $("ul.sortable li strong").on("click", function(event){
                    $(this).parents("ul").find("strong").css({"color":"black"}); // TODO styly
                    $(this).css({"color":"red"}); // TODO styly
                    that.createSortable();
                });
            },

            createSortable: function(){

                $("ul.sortable").sortable({

                    update : function(event, ui) {

                        var postData = $(this).sortable('serialize');

                        $.nette.ajax({
                            url: {plink sort!},
                            data:  postData,
                            type: 'post',
                        });
                        $(this).find("strong").css({"color":"black"}); // TODO

                    }

                }).disableSelection();


            }
        });

    })(jQuery);
</script>

Editoval jenicek (16. 6. 2014 11:08)

dawe
Člen | 59
+
0
-

jenicek napsal(a):

Já sortuji takto:

<script>
    (function($, undefined) {

        $.nette.ext('sortable', {
            load: function (rh) {
                this.createClick();
            },
        }, {
            createClick: function(){
                var that = this;
                $("ul.sortable li strong").on("click", function(event){
                    $(this).parents("ul").find("strong").css({"color":"black"}); // TODO styly
                    $(this).css({"color":"red"}); // TODO styly
                    that.createSortable();
                });
            },

            createSortable: function(){

                $("ul.sortable").sortable({

                    update : function(event, ui) {

                        var postData = $(this).sortable('serialize');

                        $.nette.ajax({
                            url: {plink sort!},
                            data:  postData,
                            type: 'post',
                        });
                        $(this).find("strong").css({"color":"black"}); // TODO

                    }

                }).disableSelection();


            }
        });

    })(jQuery);
</script>

a jak mas potom handle metodu na zpracovani?

dawe
Člen | 59
+
0
-

Tak uz mi to funguje, diky moc vsem :) .. kdyby nekdo shanel, tak takhle mam kod

presenter

public function handleUpdateOrder(){
		if ($this->isAjax()) {;
				$data = $this->httpRequest->getPost();
				$this->partnersRepository->updateOrder($data["partner"]);
				$this->invalidateControl('postsSnippet');
		}
	}

model

public function updateOrder($data){

		foreach($data as $pos => $id) {
        $this->database->table('partners')->where('id', $id)->update(
            array(
                'order' => $pos
            )
        );
    }
	}
Jan Suchánek
Člen | 404
+
0
-

@dawe:
Presenter, rači používám komponentu a pro update callback

	public function handleSort()
	{

		try {
			$items = $this->getParameter("items"); // fungovalo mi i tohle
			$this->repository->updateSort($items);
		} catch(MyException $e){
			...
		}

		if(!$this->isAjax()){
			$this->redirect("this");
		}

		$this->redrawControl(); // $this->invalidateControl je depricated

	}

Model:

	public function updateSort($items)
	{

		$i = 0;
		foreach($items as $id){
			if($row = $this->repository->findById($id)){
				$row->update(array("order" => ++$i)); // update pouze nad existujícím řádkem
			}
		}

	}

Editoval jenicek (17. 6. 2014 10:35)

dawe
Člen | 59
+
0
-

diky za info a prosimte jak jsi rozchodil to generovani odkazu v js {plink sort!}? to mi hazi chybu, to mas asi rovnou v te sablone vid? a ne v js souboru?
$.nette.ajax({
url: {plink sort!},