Serazeni prvku a ulozeni do databaze
- dawe
- Člen | 59
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
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
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;
}
- Jan Suchánek
- Člen | 404
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
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
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
@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)