Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery]Update Koszyka
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
pa-jong
Witam,

Od dłuższego czasu próbuje przerobić poniższy skrypt tak aby działał bez przeładowania strony..
do tej pory udało mi się zrobić dodawanie oraz usuwanie poległem niestety przy update..

czy znajdzie się ktoś kto pomoże mi rozwiązać tą kwestię ?




Formularz.
  1. <form action="admin.php?tab=koszyk&action=update" method="post" id="cart" >
  2.  
  3. (...)
  4.  
  5. <input name="qty'.$id.'" title="Enter = zapisz" class="editores" style="width:20px;" type="text" value="'.$qty.'" onkeypress="handleKeyPress(event,this.form)">



Skrypt odpowiedzialny za update..
  1. (...)
  2.  
  3. case 'update':
  4. if ($cart) {
  5. $newcart = '';
  6. foreach ($_POST as $key=>$value) {
  7. if (stristr($key,'qty')) {
  8. $id = str_replace('qty','',$key);
  9. $items = ($newcart != '') ? explode(',',$newcart) : explode(',',$cart);
  10. $newcart = '';
  11. foreach ($items as $item) {
  12. if ($id != $item) {
  13. if ($newcart != '') {
  14. $newcart .= ','.$item;
  15. } else {
  16. $newcart = $item;
  17. }
  18. }
  19. }
  20. for ($i=1;$i<=$value;$i++) {
  21. if ($newcart != '') {
  22. $newcart .= ','.$id;
  23. } else {
  24. $newcart = $id;
  25. }
  26. }
  27. }
  28. }
  29. }
  30. $cart = $newcart;
  31. break;
  32. }
  33.  
  34.  
  35. //// zdublowany update z $_GET używany obecnie..
  36. if ($_GET['action'] == 'update') {
  37. if ($cart) {
  38. $newcart = '';
  39. foreach ($_POST as $key=>$value) {
  40. if (stristr($key,'qty')) {
  41. $id = str_replace('qty','',$key);
  42. $items = ($newcart != '') ? explode(',',$newcart) : explode(',',$cart);
  43. $newcart = '';
  44. foreach ($items as $item) {
  45. if ($id != $item) {
  46. if ($newcart != '') {
  47. $newcart .= ','.$item;
  48. } else {
  49. $newcart = $item;
  50. }
  51. }
  52. }
  53. for ($i=1;$i<=$value;$i++) {
  54. if ($newcart != '') {
  55. $newcart .= ','.$id;
  56. } else {
  57. $newcart = $id;
  58. }
  59. }
  60. }
  61. }
  62. }
  63. $cart = $newcart;
  64. }
Kostek.88
Co dokładnie nie działa?
pa-jong
działać działa, tylko przy aktualizacji w przypadku kiedy mam 100+ rekordów męczące jest odświerzanie strony..
po naciśnieciu entera formularz wraca na górę i trzeba znowu leciec na doł do kolejnej pozycji... co jest conajmniej bez sensu wink.gif
owszem mam możliwość edytowania kilku pozycji naraz ale nie tylko ja będę tego używał więc w założeniu ma być jak najbardziej przyjazne.
Dlatego chciałem zrobić to poprzez jquery.. i poległem

troszkę zmieniłem formularz
w tym momencie $action przesyłana jest za pomocą input hidden w związku z czym już nie muszę korzystać z zamiennika z $_GET['action']

zauważyłem też inną kwestie... o ile dobrze myślę to jeśli już uda mi się to wysłać bez przeładowania to na ekranie zostaną nie aktualne dane co de facto i tak wymusza przeładowanie strony grrr :/
Kostek.88
Pokaż strukturę HTML. Gdzie masz te rekordy? Update bez przeładowania wcale nie wymusza przeładowania strony tongue.gif Po prostu za pomocą jQuery podmieniasz fragment HTML i musisz mi go pokazać smile.gif
pa-jong
HTML wygląda mniej więcej tak..
  1. function showCart() {
  2. global $db;
  3. $cart = $_SESSION['cart'];
  4. if ($cart) {
  5. $items = explode(',',$cart);
  6. $contents = array();
  7. foreach ($items as $item) {
  8. $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;
  9. }
  10.  
  11.  
  12. $output[] = '<div style="width: auto; height: auto; position: relative; " class="ui-dialog ui-widget ui-widget-content ui-corner-all" >';
  13. $output[] = ' <div id="dialog" class="ui-dialog-content ui-widget-content" style="width: auto; min-height: 118px; height: auto; display: block; ">';
  14. $output[] = ' <fieldset>';
  15. $output[] = ' <legend>Twoje zamówienie</legend>';
  16.  
  17. $output[] = ' <form method="post" id="cart">';
  18. $output[] = ' <table class="content-item" border="0" cellspacing="0" cellpadding="2">';
  19. $output[] = ' <thead>';
  20. $output[] = ' <tr class="ui-widget-header">';
  21. $output[] = ' <td style="width:20px;">lp.</td>';
  22. $output[] = ' <td style="width: 80px;">Symbol</td>';
  23. $output[] = ' <td>Nazwa</td>';
  24. $output[] = ' <td style="width:40px;">Ilość<br>Mag.</td>';
  25. $output[] = ' <td style="width:40px;">Ilosć<br>sklep</td>';
  26. $output[] = ' <td style="width:55px;">Ilość</td>';
  27. $output[] = ' <td style="width:40px;">Jedn.</td>';
  28. $output[] = ' <td style="width:30px;">Vat</td>';
  29. $output[] = ' <td style="width:80px;">Cena Netto</td>';
  30. $output[] = ' <td style="width:80px;">Cena Brutto</td>';
  31. $output[] = ' <td style="width:80px;">Brutto Razem</td>';
  32. $output[] = ' <td style="width:15px;"></td>';
  33. $output[] = ' </tr>';
  34. $output[] = ' </thead>';
  35. $output[] = ' <tbody>';
  36.  
  37.  
  38. $i = 0;
  39. foreach ($contents as $id=>$qty) {
  40. $i++;
  41.  
  42. $sql = "SELECT * FROM stany WHERE Symbol = '".$id."'";
  43. $result = $db->query($sql);
  44. $row = $result->fetch();
  45. extract($row);
  46.  
  47.  
  48.  
  49. $output[] = ' <tr id="item'.$id.'"class="ui-state-default">';
  50. $output[] = ' <td valign="top"> '.$i.'. </td>';
  51. $output[] = ' <td valign="top" style="color: #4d8214; class="username-coloured"> '.$id.' </td>';
  52. $output[] = ' <td style="width:300px; '.$col.'" valign="top">';
  53. $output[] = ' '.$Nazwa.'</td>';
  54. $output[] = ' <td valign="top">'.$skl1.'</td>';
  55. $output[] = ' <td valign="top">'.$skl11.'</td>';
  56. $output[] = ' <td valign="top">';
  57. $output[] = ' <div style="display:inline;" id="count'.$id.'">';
  58. $output[] = ' <a href="java script:void(0)" class="ui-icon ui-icon-pencil" style="float: left; cursor: auto; " title="Zmień ilość produktów" onclick="$("#count'.$id.'").attr("style","display:none");$("#countUpdate'.$id.'").attr("style","display:inline");">';
  59. $output[] = ' </a>'.$qty.'';
  60. $output[] = ' </div>';
  61. $output[] = ' <div style="display:none;" id="countUpdate'.$id.'">';
  62. $output[] = ' <a href="java script:void(0)" class="ui-icon ui-icon-close" style="float: left; cursor: auto; " onclick="$("#countUpdate'.$id.'").attr("style","display:none");$("#count'.$id.'").attr("style","display:inline");">';
  63. $output[] = ' </a>';
  64. $output[] = ' <input name="action" value="update" type="hidden">';
  65. $output[] = ' <input name="qty'.$id.'" id="qty'.$id.'" title="Enter = zapisz" class="editores" style="width:20px;" type="text" value="'.$qty.'" onkeypress="handleKeyPress(event,this.form)">';
  66. $output[] = ' </div></td>';
  67. $output[] = ' <td valign="top">egz.</td>';
  68. $output[] = ' <td valign="top">5%</td>';
  69. $output[] = ' <td valign="top"> 397.78 PLN</td>';
  70. $output[] = ' <td valign="top">'.$skl1Cena.' PLN</td>';
  71. $output[] = ' <td style="width:60px;" valign="top">'.($skl1Cena * $qty).' PLN</td>';
  72. $output[] = ' <td valign="top">';
  73. $output[] = " <a href='java script:uzk(\"".$id."\",\"delete\")' onClick='$(\"#item".$id."\").fadeOut(\"slow\")' class='ui-icon ui-icon-trash' style='float: left; cursor: auto; ' title='usuń z zamówienia'>";
  74. $output[] = ' </a></td>';
  75. $output[] = ' </tr>';
  76.  
  77.  
  78. }
Kostek.88
O jaki update dokładnie Ci chodzi? Napisałeś:

Cytat
do tej pory udało mi się zrobić dodawanie oraz usuwanie poległem niestety przy update..


Skoro masz dodawanie i usuwanie, to co chcesz update'ować? Ilość sztuk produktu? Przecież po wpisaniu odpowiedniej ilości w input nie musisz update'ować HTML...
pa-jong
nie do końca sie zrozumieliśmy wink.gif
opisze od początku wink.gif

jest sobie jakaś tam lista produktów,

  1.  
  2. echo "<td class='nazwa'><a href='java script:ddk(\"".StringToHTML($arrRow["Symbol"])."\",\"add\")'>".StringToHTML($arrRow["Nazwa"])."</a></td>".$eol;


po kliknięciu w produkt jest on wysyłany do koszyka.
  1. <script type='text/javascript'>
  2. function ddk(idp,akcja)
  3. {
  4. $.ajax({
  5. url: 'cart.php',
  6. type: 'POST',
  7. data: {
  8. tryb : 'dodaj_do_koszyka' ,
  9. id_przedmiotu : idp,
  10. action: akcja
  11. },
  12. success: function(odpowiedz)
  13. {
  14.  
  15. //document.getElementById('info').style.display='block';
  16. $('#info').fadeIn('slow');
  17. setTimeout('ukryj()',2000);
  18. $('#infotext').html('Produkt dodany do zamówienia.');
  19. // $('#koszyk').load('cart.php');
  20.  
  21. // alert('odpowiedz');
  22.  
  23. },
  24. error: function(){
  25.  
  26. document.getElementById('info').style.display='block';
  27.  
  28. setTimeout('ukryj()',1500);
  29. $('#infotext').html('Błąd Połączenia - Spróbój jeszcze Raz.');
  30.  
  31. //alert('Błąd połączenia ajax');
  32.  
  33. }
  34.  
  35.  
  36. });
  37. }
  38.  
  39.  
  40. function ukryj() {
  41.  
  42. $('#info').fadeOut('slow');
  43.  
  44. }
  45.  
  46. </script>


i skrypt obslugujący dodawanie
  1. $cart = $_SESSION['cart'];
  2. $action = $_POST['action'];
  3.  
  4. switch ($action) {
  5. case 'add':
  6. if ($cart) {
  7. $cart .= ','.$_POST['id_przedmiotu'];
  8. } else {
  9. $cart = $_POST['id_przedmiotu'];
  10. }
  11. break;
  12.  
  13. (...)
  14.  


tutaj odrazu może wspomnę że po kliknięciu dodaje się 1szt danego przedmiotu.
docelowo chciałbym aby po kliknięciu pokazywał się input gdzie można by było zdefiniować ilość.
jeszcze się nie zastanawiałem jak to zrobić ale czuje w kościach ze kolorowo nie będzie tym bardziej, ze poległem na etapie edycji..
zobaczymy wink.gif

wracając do tematu..
dalej mamy listę zamawianych produktów
gdzie można zmienić ilość sztuk czyli to o co się rozchodzi..

  1. (...)
  2. <form action="admin.php?tab=koszyk" method="post" id="cart" >
  3. (...)
  4.  
  5. $output[] = ' <div style="display:inline;" id="count'.$id.'">';
  6. $output[] = ' <a href="java script:void(0)" class="ui-icon ui-icon-pencil" style="float: left; cursor: auto; " title="Zmień ilość produktów" onclick="$("#count'.$id.'").attr("style","display:none");$("#countUpdate'.$id.'").attr("style","display:inline");">';
  7. $output[] = ' </a>'.$qty.'';
  8. $output[] = ' </div>';
  9. $output[] = ' <div style="display:none;" id="countUpdate'.$id.'">';
  10. $output[] = ' <a href="java script:void(0)" class="ui-icon ui-icon-close" style="float: left; cursor: auto; " onclick="$("#countUpdate'.$id.'").attr("style","display:none");$("#count'.$id.'").attr("style","display:inline");">';
  11. $output[] = ' </a>';
  12. $output[] = ' <input name="action" value="update" type="hidden">';
  13. $output[] = ' <input name="qty'.$id.'" id="qty'.$id.'" title="Enter = zapisz" class="editores" style="width:20px;" type="text" value="'.$qty.'" onkeypress="handleKeyPress(event,this.form)">';
  14. $output[] = ' </div></td>';


skrypty obsługujące
  1. <script type="text/javascript">
  2. function handleKeyPress(e,form){
  3. var key=e.keyCode || e.which;
  4. if (key==13){
  5. form.submit();
  6. }
  7.  
  8. }
  9.  


  1. case 'update':
  2. if ($cart) {
  3. $newcart = '';
  4. foreach ($_POST as $key=>$value) {
  5. if (stristr($key,'qty')) {
  6. $id = str_replace('qty','',$key);
  7. $items = ($newcart != '') ? explode(',',$newcart) : explode(',',$cart);
  8. $newcart = '';
  9. foreach ($items as $item) {
  10. if ($id != $item) {
  11. if ($newcart != '') {
  12. $newcart .= ','.$item;
  13. } else {
  14. $newcart = $item;
  15. }
  16. }
  17. }
  18. for ($i=1;$i<=$value;$i++) {
  19. if ($newcart != '') {
  20. $newcart .= ','.$id;
  21. } else {
  22. $newcart = $id;
  23. }
  24. }
  25. }
  26. }
  27. }
  28. $cart = $newcart;
  29. break;


oraz usuwanie przedmiotu z koszyka.
  1. $output[] = ' <td valign="top">';
  2. $output[] = " <a href='java script:uzk(\"".$id."\",\"delete\")' onClick='$(\"#item".$id."\").fadeOut(\"slow\")' class='ui-icon ui-icon-trash' style='float: left; cursor: auto; ' title='usuń z zamówienia'>";
  3. $output[] = ' </a></td>';


  1. <script type='text/javascript'>
  2. function uzk(idp,akcja)
  3. {
  4. $.ajax({
  5. url: 'cart.php',
  6. type: 'POST',
  7. data: {
  8. tryb : 'usun_z_koszyka' ,
  9. id_przedmiotu : idp,
  10. action: akcja
  11. },
  12. success: function(odpowiedz)
  13. {
  14.  
  15. //document.getElementById('info').style.display='block';
  16. $('#info').fadeIn('slow');
  17. setTimeout('ukryj()',2000);
  18. $('#infotext').html('Produkt usunięty z zamówienia.');
  19. // $('#koszyk').load('cart.php');
  20.  
  21. // alert('odpowiedz');
  22.  
  23. },
  24. error: function(){
  25.  
  26. document.getElementById('info').style.display='block';
  27.  
  28. setTimeout('ukryj()',1500);
  29. $('#infotext').html('Błąd Połączenia - Spróbój jeszcze Raz.');
  30.  
  31. //alert('Błąd połączenia ajax');
  32.  
  33. }
  34.  
  35.  
  36. });
  37. }
  38.  
  39.  
  40. function ukryj() {
  41.  
  42. $('#info').fadeOut('slow');
  43.  
  44. }
  45.  


  1. case 'delete':
  2. if ($cart) {
  3. $items = explode(',',$cart);
  4. $newcart = '';
  5. foreach ($items as $item) {
  6. //if ($_GET['id'] != $item) {
  7. if ($_POST['id_przedmiotu'] != $item) {
  8. if ($newcart != '') {
  9. $newcart .= ','.$item;
  10. } else {
  11. $newcart = $item;
  12. }
  13. }
  14. }
  15. $cart = $newcart;
  16. }
  17. break;



jak widać update odbywa się tylko za pomocą PHP
chce to zmienić na jQuery czyli bez przeładowania strony no i tak żeby zmiany były odrazu widoczne,
gdyż jak wspominałem wcześniej będą na pewno takie sytuacje kiedy ktoś przy pozycji 50, 100 i 150 wymyśli sobie zmianę ilości sztuk
i niech przy pozycji 50 wciśnie enter.. strona się przeładuje,lista wróci do początku i trzeba będzie przewijać z powrotem w dól do pozycji nr 100... nieco męczące dlatego chce to wyeliminować wink.gif


mam nadzieje ze teraz jest bardziej zrozumiale wink.gif


//edit
przez POST ma być wysłane:
action = update
qty.'$id.' = '.$qty.'


Próbowałem dać tak,

  1. <input name="qty'.$id.'" id="qty'.$id.'" title="Enter = zapisz" class="editores" style="width:20px;" type="text" value="'.$qty.'" onchange="ewk(\"update\",\"'.$qty.'\")" >


  1. function ewk(akcja,ilosc)
  2. {
  3. $.ajax({
  4. url: 'cart.php',
  5. type: 'POST',
  6. data: {
  7. tryb : 'edytuj_w_koszyku' ,
  8. action: akcja,
  9. ilosc : qty
  10. },


i mam 2 problemy.


1. jeżeli dobrze myślę to w powyższym skrypcie zamiast "ilość" powinienem mieć qty'.$id.'
tak aby za każda zmianą było qty1 : 5 / qty2 : 7/ itd
ale jest to niemożliwe gdyż zmienne definiowane są w zupełnie gdzie indziej wiec nie mogę użyć ich w tym miejscu..
znając życie to na pewno istnieje na to proste rozwiązanie..
2. zmieniam zawartość inputa ale firebug w ogole nie wyłapuje aby cokolwiek się wysyłało i nie wiem dlaczego..
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.