Ajax pořadí záznamů v tabulce

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

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
+
0
-

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
+
0
-

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!

Mysteria
Člen | 797
+
0
-
$this->doc->findAll()->where('id', $id)->fetch()->update(['pozice' => $this->database->literal('pozice + 1')]);

Editoval Mysteria (12. 8. 2014 23:36)

wicked
Člen | 290
+
0
-

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
+
0
-

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
+
0
-

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?

David Kudera
Člen | 455
+
0
-

jop taky možnost :-)

wicked
Člen | 290
+
0
-

Což mě tak napadá je ten můj příspěvek výše, ale mám v něm někde chybu …

protože to udělá z obou záznamů 3 (1. a 2. záznam) … předpokládám, že je to tou $up kterou používám v oubou případech …

takze rozdelit ten handle do 2 casti? 2× fetch zaznamů atd?

wicked
Člen | 290
+
0
-

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
+
0
-

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
+
0
-

Třeba mám tohle:

  1. kolo (id = 1)
  2. kůň (id = 2)
  3. traktor (id = 3)
  4. 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
+
0
-

David Kudera napsal(a):

Třeba mám tohle:

  1. kolo (id = 1)
  2. kůň (id = 2)
  3. traktor (id = 3)
  4. 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
+
0
-

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.