Potrzebuję aktualizować produkty z koszyka czyli obliczać cenę na podstawie ilości produktów wpisanej przez użytkownika. Domyślnie dane dla produktów z koszyka są wczytywane z bazy.
Jak zrobić aby w przypadku kiedy użytkownik zmieni zawartość pola value="'.$cartitem['quantity'].'" skrypt przeliczał inne wartości w/g tej ilości ?

  1. $html .= '<form name="cart_recount" method="POST" action="index.php">';
  2. $html .= '<input type="HIDDEN" name="p" value="cart">';
  3. $html .= '<input type="HIDDEN" name="recount" value="true">';
  4. $html .= '<tr>';
  5. $html .= '<td style="width:25px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_top">Lp.</td>';
  6. $html .= '<td style="width:145px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_top">Produkt</td>';
  7. $html .= '<td style="width:40px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_top">Ilość</td>';
  8. $html .= '<td style="width:80px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_top">Cena</td>';
  9. $html .= '<td style="width:40px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="ccart_main_top">Rabat</td>';
  10. $html .= '<td style="width:80px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_top">Cena z Rabatem</td>';
  11. $html .= '<td style="width:80px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_top">Wartość</td>';
  12. $html .= '<td style="width:25px; height:30px; background-color:#ececec; border-style:solid; border-color:#dddddd; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_top">&nbsp;</td>';
  13. $html .= '</tr>';
  14.  
  15. $lp = 1;
  16. $sum = 0;
  17. // pozycje
  18. $query = mysql_query("SELECT *,cart.id AS item FROM cart LEFT JOIN product ON cart.pid = product.id WHERE session='".session_id()."' LIMIT 0,10;");
  19.  
  20.  
  21. while($cartitem = mysql_fetch_assoc($query))
  22. {
  23. $html .= '<tr>';
  24. $html .= '<td style="width:25px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_item">'.$lp++.'</td>';
  25. $html .= '<td style="width:145px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:left; vertical-align:middle; font-weight:bold;" class="cart_main_item">&nbsp;<a href="http://alkomaty.biz/'.$cartitem['pid'].','.$cartitem['seo'].'">'.$cartitem['name'].'</a>';
  26. if($cartitem['discount_code']=="PROMOCJA") $html .= '<font style="color:#dd0000; font-size:7.5pt; font-weight:normal;"><br>&nbsp;CENA PROMOCYJNA</font>';
  27. elseif($cartitem['discount_code']) $html .= '<font style="color:#0000dd; font-size:7.5pt; font-weight:normal;"><br>&nbsp;KOD RABATOWY</font>';
  28. $html .= '</td>';
  29.  
  30.  
  31.  
  32.  
  33. //WAŻNE pole odpowiedzialne za wyświetlanie ilości towaru
  34. $html .= '<td style="width:40px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_item">
  35.  
  36. <input type="TEXT" onFocus="this.select();" name="quantity_'.$cartitem['id'].'" value="'.$cartitem['quantity'].'" class="cart_main_item" style="border-style:none; background-color:#ffffff; width:40px; padding:0px 0px 0px 0px; text-align:center;">
  37.  
  38. </td>';
  39. //WAŻNE pole odpowiedzialne za wyświetlanie ilości towaru
  40.  
  41.  
  42.  
  43.  
  44. $html .= '<td style="width:80px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:right; font-size:7.5pt;" class="cart_main_item">'.number_format($cartitem['pricewithtax'],2,',',' ').'zł z VAT<br>('.number_format($cartitem['price'],2,',',' ').'zł netto)</td>';
  45. $html .= '<td style="width:40px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_item">'.round(((1-($cartitem['pricewithtax_discount']/$cartitem['pricewithtax']))*100),0).'%</td>';
  46. $html .= '<td style="width:80px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:middle; font-size:7.5pt;" class="cart_main_item">'.number_format($cartitem['pricewithtax_discount'],2,',',' ').'zł z VAT<br>('.number_format($cartitem['price_discount'],2,',',' ').'zł netto)</td>';
  47. $html .= '<td style="width:80px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:middle; font-weight:bold;" class="cart_main_item">'.number_format(($cartitem['quantity']*$cartitem['pricewithtax_discount']),2,',',' ').'zł<br>z VAT</td>';
  48. $html .= '<td style="width:25px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_item"><A href="index.php?p=cart&delete='.$cartitem['item'].'"><img src="layout/'.$style.'/delete.png" alt="" title="" border="0" style="width:20px; height:20px;"></a></td>';
  49. $html .= '</tr>';
  50.  
  51. $sum += ($cartitem['quantity']*$cartitem['pricewithtax_discount']);
  52. }
  53. // podusmowenie cen
  54. $html .= '</form>';
  55.  
  56.  
  57. //WAŻNE element zdjęcia po jego kliknięciu powinna być odpalana procedura przeliczania produktów w/g nowej ilości
  58. $html .= '<img onClick="document.cart_recount.submit();" src="layout/'.$style.'/cart_recount_off.png" onMouseOver="this.src='."'layout/".$style."/cart_recount_on.png'".';" onMouseOut="this.src='."'layout/".$style."/cart_recount_off.png'".';" alt="" title="" border="0" style="cursor:pointer;">';
  59. //WAŻNE element zdjęcia po jego kliknięciu powinna być odpalana procedura przeliczania produktów w/g nowej ilości


Wymyśliłem coś takiego żeby za pomocą ajax aktualizować rekordy w bazie. Niestety żadna akcja się nie wykonuje. Przypisanie dla zmiennej w źródle jest OK.

  1.  
  2. $html .= '<td style="width:40px; height:30px; background-color:#ffffff; border-style:solid; border-color:#ececec; border-width:1px; text-align:center; vertical-align:middle;" class="cart_main_item">
  3.  
  4. <input type="TEXT" onFocus="this.select();" id="przycisk_quantity" name="quantity_'.$cartitem['id'].'" value="'.$cartitem['quantity'].'" class="cart_main_item" style="border-style:none; background-color:#ffffff; width:40px; padding:0px 0px 0px 0px; text-align:center;">
  5.  
  6. </td>';
  7.  
  8. $html .= '<script type="text/javascript">
  9. zmienna='.$cartitem['id'].';</script>'; //przypisujemy id rekordu do zmiennej JS
  10.  
  11.  
  12. $html .= '<img onClick="szukaj(zmienna);" src="layout/'.$style.'/cart_recount_off.png" onMouseOver="this.src='."'layout/".$style."/cart_recount_on.png'".';" onMouseOut="this.src='."'layout/".$style."/cart_recount_off.png'".';" alt="" title="" border="0" style="cursor:pointer;">'; //akcja podpięta pod onclick wywołuje funkcję ajax i przekazuje id rekordu jako parametr
  13.  


[JAVASCRIPT] pobierz, plaintext
  1. function szukaj(id) {
  2. var wartosc = document.getElementById("przycisk_quantity").value;
  3. var xhr = xmlhttp();
  4. var plik = "baza.php";
  5. xhr.open("GET", plik+"?parametr="+wartosc+"&id="+id, true);
  6.  
  7. xhr.onreadystatechange = function () {
  8. if(xhr.readyState == 4 && xhr.status == 200) {
  9. saveResult(xhr.responseText);
  10. }
  11. else {
  12. saveResult("Wystapił błąd podczas żądania: " + xhr.statusText);
  13. }
  14. };
  15.  
  16. xhr.send(null);
  17. }
  18.  
  19.  
  20.  
  21. //funckja tworzaca obiekt XMLHttp w roznych przegladarkach
  22. function xmlhttp() {
  23. if (typeof XMLHttpRequest != "undefined") {
  24. return new XMLHttpRequest();
  25. }
  26. else if (window.ActiveXobject) {
  27. var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
  28.  
  29. for (var i=0; i<aVersions.length; i++) {
  30. try {
  31. var oXmlHttp = new ActiveXObject(aVersions[i]);
  32. return oXmlHttp;
  33. }
  34. catch (oError) {}
  35. }
  36. }
  37. throw new Error("Nie można utworzyć obiektu XMLHttp.");
  38. }
  39.  
  40.  
  41. function saveResult(tresc) {
  42. var box = document.getElementById("przycisk_quantity");
  43. if (box.innerHTML != "") box.innerHTML = "";
  44. box.innerHTML = tresc;
  45. }
[JAVASCRIPT] pobierz, plaintext


Plik baza.php
  1.  
  2. //lączenie z bazą
  3.  
  4. $parametr = $_GET['parametr']; //pobranie parametrów z łańcucha zapytania
  5. $id = $_GET['id'];
  6.  
  7. $zap = mysql_query("UPDATE cart SET quantity=".$parametr." WHERE id=".$id.";") or die('Blad w zapytaniu UPDATE ' . mysql_error());
  8. if (!$zap) echo 'Blad w zapytaniu do bazy danych dla UPDATE ' . mysql_error();
  9. else {
  10. $zap1 = mysql_query("SELECT id, quantity FROM cart WHERE id=".$id.";") or die('Blad w zapytaniu SELECT ' . mysql_error());
  11. if (!$zap1) echo 'Blad w zapytaniu do bazy danych dla SELECT ' . mysql_error();
  12. else {
  13. while ($row = mysql_fetch_array($zap1)) echo $row['quantity']; //wyświetlamy zaktualizowaną ilość jako wynik
  14. }
  15. }
  16.  


Podbijam nikt nie pomoże ? Efekt jaki chce uzykać to dynamiczna zmiana zawartości koszyka jak tu: https://www.komputronik.pl/index.php/carts/pl/simpleCart
Czytałem trochę o ajax i w/g to rozwiązanie tutaj nadaje się idealnie.
Mechanika jest taka:
1. Pobranie aktualnej (zmienionej przez użytkownika ilości produktów pole quantity) i wstawienie jej do zmiennej za pomocą JS
2. Doczepienie zdarzenia onclick do elementu zdjęcia mającego przeliczać wartość
3. Przesłanie nowych wartości do serwera
4. Zwrócenie nowych wartości przez serwer i ich modyfikacja w skrypcie.