Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [MySQL][PHP]Jak zapisać kolejność tabeli sortable?

Napisany przez: Laravelson 24.01.2017, 22:35:19

Dobry wieczór,

Jestem nowym użytkownikiem a także początkującym w php, chciałbym prosić o poradę jak zapisać kolejność wierszy w tabeli do bazy danych, żeby po kolejnym odczycie ułożone były tak jak je zostawiłem.
Każdy <tr> posiada ID który jest ID w tabeli, kolejność jest zapisana w tabeli w kolumnie sort.

  1. $line .= '<table name="items"><tbody>';
  2.  
  3. $i = 1;
  4.  
  5. while($file = $list->fetch_array()) {
  6.  
  7. if($file['active']){
  8. $selected = 'checked';
  9. }else{
  10. $selected = '';
  11. }
  12.  
  13. $line .= '<tr id="'.$i.'" class="item-data"><td width="5px">▲ ▼</td><td value="'.$file['order'].'"> ' .$file['file_name']. ' </td><td><input type="checkbox" class="tick" '.$selected.' value="'.$file['active'].'" id="'.$file['id'].'"/></td></tr>';
  14.  
  15. $i++;
  16.  
  17. }
  18.  
  19.  
  20. $line .= '</tbody></table>';

ten kod generuje moją tabelkę.
Nie mogę zrozumieć, jak przygotować ajax i wysłać dane do php żeby zapisać nową kolejność.

Napisany przez: lukaskolista 25.01.2017, 10:15:31

Kolejność zapisu tak na prawdę nie ma znaczenia. Przy odczycie po prostu je posortuj "SELECT * FROM ... ORDER BY table.column {rosnąco/malejąco}"

Napisany przez: trueblue 25.01.2017, 21:26:33

Najpierw musisz wywołać jakoś ajax, a ten będzie wywoływany przy klikaniu strzałek /\ \/, trzeba więc tam podpiąć zdarzenia na click.
Kiedy sortujesz w górę, to ustawiasz dla rekordu wyżej klucz sortowania jak obecny, a obecnemu klucz sortowania z tego wyżej. Analogicznie przy sortowaniu w dół. Czyli zamieniasz klucze dwóch sąsiadujących rekordów.
Sąsiada nad i pod znajdziesz sortując ASC lub DESC rekordy i wybierając jeden rekord gdzie klucz sortowania > lub < klucz sortowania sortowanego rekordu.

Napisany przez: Laravelson 26.01.2017, 22:24:09

Chyba prawie sobie poradziłem ale .... nie do końca bo:
Kiedy przesunę rząd np z początku na koniec tabelki zapisany porządek w DB jest jakby niepoprawny

i kiedy odświeżę stronę rząd który powinien być "teoretycznie" ostatni magicznie jest pierwszy, a czasem nawet drugi smile.gif
i nic mi się nie zgadza sad.gif
Już praawie wszystkie włosy sobie wyrwałem z głowy, tak mnie to irytuje smile.gif
generuję nowy porządek w ten sposob:

  1. jQuery('tbody').sortable({
  2. axis: 'y',
  3. update: function(event, ui) {
  4. var newOrder = jQuery(this).sortable('toArray').toString();// efektem działania jest "lista"
  5. // czy a jeśli tak, to jak zbudować tablicę np nazwa => wartość
  6. // próbowałem tak: var newOrder = jQuery(this).sortable('toArray',{id: 'id'}).toString();
  7. // ale najwyraźniej sortable toArray robi to po swojemu i nie interesuje "go" co ja tam sobie wymyśliłem ;)
  8.  
  9. jQuery.ajax({
  10. url: 'updateCssList.php',
  11. type: 'POST',
  12. data: {
  13. 'order': newOrder,
  14. },
  15. success: function(result)
  16. {
  17. console.log(result);
  18. },
  19. });
  20. }
  21. });

Nie wiem gdzie tkwi problem. Zapisuje dane w ten sposób:
  1. if( http://www.php.net/isset ( $_POST ) ) {
  2. $myarray = http://www.php.net/explode(',',$_POST['order']);
  3. $i = 1;
  4. require_once 'config.php' ;
  5. if (!$conn) {
  6. http://www.php.net/echo 'Connection Failed';
  7. http://www.php.net/die("Connection failed: " . mysqli_connect_error());
  8. }
  9.  
  10. foreach($myarray as $item){
  11. $sqlNeworder = "UPDATE `tblCssList` SET `order` = '$i' WHERE `id` = $item";
  12. mysqli_query($conn,$sqlNeworder);
  13. $i++;
  14. }
  15. }

Podpowiedzcie gdzie zrobiłem błąd, nie rozumiem dlaczego mimo, iż porządek jest generowany i widzę go w konsoli gdzie wygląda prawidłowo.

Napisany przez: phpamator 27.01.2017, 11:32:41

Mam bardzo podobny problem, to co jest na ekranie nie oddaje tego co jet przesyłane do php.
Wygląda jakby wysyłany był stan z "przed" wykonania ruchu.
np jeśli mam aktualnie 1,2,3 i zmienię 2,3,1 wysyła mi 1,2,3 a jeśli teraz wykonam ponowny ruch na ekranie przeciągając 1 na początek w konsoli widzę 2,3,1, czyli stan przed wykonaniem ruchu smile.gif

Napisany przez: trueblue 27.01.2017, 12:18:44

Cytat(Laravelson @ 26.01.2017, 22:24:09 ) *
Podpowiedzcie gdzie zrobiłem błąd, nie rozumiem dlaczego mimo, iż porządek jest generowany i widzę go w konsoli gdzie wygląda prawidłowo.

Czytaj dokumentację.
sortable('toArray') domyślnie zwraca listę id elementów. Nawet kiedy podasz jako drugi parametr {attribute:'id'}, to i tak nic nie zmieni, bo wiersze nie mają nadanych id.

Tu masz przykład z użyciem innego atrybutu (data-sort). Możesz go zmienić na id (w html, a w js zmienić lub usunąć).
https://jsfiddle.net/khzcn586/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)