Ajax pořadí záznamů v tabulce
- wicked
- Člen | 290
Zdravím přátelé,
v tomto podvečerním čase mě to vůbec, ale opravdu vůbec nepřemýšlí …
Mám vypsanou tabulku která vypisuje zaznamy z databaze.
Jde mi o to, že jednotlié záznamy mají po kliknutí na sipky jít buď nahoru, nebo dolů (menit poradi v tabulce)
Je mi jasné, že to musí jít Ajaxem, snipety a handly.
Takže v presenteru vytvořit handly pro nahoru a dolu a v sablone obalim tabulku do snipetu coz by teoreticky problem byt nemel.
Ale premyslim nad obsluhou ohledne DB
v db je x zaznamu které maji poradi 1 az X no a kdyz zmenim poradi 1 zaznamu, jak udelat aby se zmenili automaticky ty ostatni? aby zaznam co byl 3. byl 2. a obracene? … v tomto jsem stracen
Omlouvám se za „stupidni“ dotaz, ale kazde nakopnuti me pomuze …
Děkuji
- David Kudera
- Člen | 455
Ostatní můžeš updatovat „hromadně“. Stačí do where přidat podmínku větší (nebo opačně menší) než je pořadí upravovaného záznamu
Edit: tady je třeba dotaz na stack overflow link
Editoval David Kudera (12. 8. 2014 22:16)
- wicked
- Člen | 290
David Kudera napsal(a):
Ostatní můžeš updatovat „hromadně“. Stačí do where přidat podmínku větší (nebo opačně menší) než je pořadí upravovaného záznamu
Edit: tady je třeba dotaz na stack overflow link
A můžeš mě prosím nějak víc ještě kopnout?
Řekněme že handle mám takto
// Signal pro posun o radek nahoru
public function handleUp($id) {
// nactu pozici k danemu zaznamu
$up = $this->doc->findAll()->where("id", $id)->fetch()->pozice;
// nastavim ze ma o 1 zvetsit
$up_new = $up+"1";
// coz dump provede
dump($up);
dump($up_new);
// ale jak to udelat v dotazu? je jasne ze update ale jak?
}
}
Děkuji!
- wicked
- Člen | 290
Mysteria napsal(a):
$this->doc->findAll()->where('id', $id)->fetch()->update(['pozice' => $this->database->literal('pozice + 1')]);
Ok, to me nahradi pozici o +1 ovsem jiz to neresi, kdyz se pozice budou rovnat ..
nahradim 2 + 1 tedy 3 ale jak udelam 3 – 1 tedy 2 …
Ja uz ani nevim jestli pisu srozumitelne …
mam napr 5 zaznamu s pozicemi 1–5 ale kdyz nahradim 2 za 3 potrebuji aby byl 3 za 2 …
Smolim to nejak takto ale porad blbe …
$up = $this->doc->findAll()->where("id", $id)->fetch()->pozice;
$this->doc->findAll()->where("id", $id)->update(array("pozice" => $up-1));
$this->doc->findAll()->where("id", !$id)->update(array("pozice" => $up+1));
to me sice hodi o jeden nahoru kde je id .. ale uz me to nehodi dolu …
napadlo me jeste
$up = $this->doc->findAll()->where("id", $id)->fetch()->pozice;
$this->doc->findAll()->where("id", $id)->update(array("pozice" => $up-1));
$p = $up-1;
$this->doc->findAll()->where("pozice", $p)->update(array("pozice" => $up+1));
ale to zas hazi balasty … udela to z obojiho 3
Editoval wicked (13. 8. 2014 0:36)
- David Kudera
- Člen | 455
V tom odkaze, co jsem poslal, je toto sql:
UPDATE items SET `pozice` = `pozice` + 1
WHERE `pozice` >= :index_of_inserted_item
ORDER BY `pozice` DESC
tím změníš hromadně všechny následující záznamy. Pro nižší záznamy jen přehodit znamínko. Teď si to jen přepsat do nette database
Editoval David Kudera (13. 8. 2014 8:35)
- wicked
- Člen | 290
David Kudera napsal(a):
V tom odkaze, co jsem poslal, je toto sql:
UPDATE items SET `pozice` = `pozice` + 1 WHERE `pozice` >= :index_of_inserted_item ORDER BY `pozice` DESC
tím změníš hromadně všechny následující záznamy. Pro nižší záznamy jen přehodit znamínko. Teď si to jen přepsat do nette database
Když mě tak napadá, že mě vlastně stačí změnit číslo pouze u 2 záznamů původní dat na novou pozici +1 a ten z té nové pozice šoupnout o –1 a mam vlastně vyřešeno, nebo se pletu?
- wicked
- Člen | 290
Respektivě měl mám toto
$up1 = $this->doc->findAll()->where("id", $id)->fetch()->pozice;
$up1 = $this->doc->findAll()->where("id", $id)->update(array("pozice" => $up1-1));
$this->redirect("this");
coz vlastne u daného id zvedne pozici … ale uz nemuzu udelat to ze napisu
$up1 = $this->doc->findAll()->where("pozice", $up-1)->update(array("pozice" => $up1+1));
Aby to pozici na ktere byl ten puvodni presunulo misto toho noveho …
Tohle me u obojiho udela tu samou pozici …
co resim blbe?
- David Kudera
- Člen | 455
jj měli by to být 2 updaty zvlášť.. první si selektuješ oba 2 záznamy zvlášť a potom je až updatuješ
- David Kudera
- Člen | 455
Třeba mám tohle:
- kolo (id = 1)
- kůň (id = 2)
- traktor (id = 3)
- hvězda smrti (id = 4)
a hvězdu smrti chci na 3. místo
public function handleUp($id)
{
$up = $this->doc->findAll()->where('id', $id)->fetch();
$down = $this->doc->findAll()->where('pozice', $up->pozice - 1)->fetch();
$up->update(array('pozice' => $down->pozice));
$down->update(array('pozice' => $down->pozice + 1));
}
Edit:
ještě handleDown:
public function handleDown($id)
{
$down = $this->doc->findAll()->where('id', $id)->fetch();
$up = $this->doc->findAll()->where('pozice', $down->pozice + 1)->fetch();
$down->update(array('pozice' => $up->pozice));
$up->update(array('pozice' => $down->pozice - 1));
}
ta tabulka tu vypadá zbytečně, ale líp se to pak představuje :-)
Edit 2: jo a taky by to mělo být pro jistotu v transakci..
Editoval David Kudera (13. 8. 2014 13:39)
- wicked
- Člen | 290
David Kudera napsal(a):
Třeba mám tohle:
- kolo (id = 1)
- kůň (id = 2)
- traktor (id = 3)
- hvězda smrti (id = 4)
a hvězdu smrti chci na 3. místo
public function handleUp($id) { $up = $this->doc->findAll()->where('id', $id)->fetch(); $down = $this->doc->findAll()->where('pozice', $up->pozice - 1)->fetch(); $up->update(array('pozice' => $down->pozice)); $down->update(array('pozice' => $down->pozice + 1)); }
Edit:
ještě handleDown:
public function handleDown($id) { $down = $this->doc->findAll()->where('id', $id)->fetch(); $up = $this->doc->findAll()->where('pozice', $down->pozice + 1)->fetch(); $down->update(array('pozice' => $up->pozice)); $up->update(array('pozice' => $down->pozice - 1)); }
ta tabulka tu vypadá zbytečně, ale líp se to pak představuje :-)
Edit 2: jo a taky by to mělo být pro jistotu v transakci..
Jasný funguje úplně bezvadně :-)
Moc děkuji za pomoc!
- David Kudera
- Člen | 455
v pohodě :-) jen jak jsem psal.. chtělo by to zabalit do transakce, přidat ověření, že ty záznamy existují (oba dva vždy, aby se to nepokoušelo přesunout poslední ještě víc dolů a naopak) atd.