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 ?
$html .= '<form name="cart_recount" method="POST" action="index.php">';
$html .= '<input type="HIDDEN" name="p" value="cart">';
$html .= '<input type="HIDDEN" name="recount" value="true">';
$html .= '<tr>';
$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>';
$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>';
$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>';
$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>';
$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>';
$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>';
$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>';
$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"> </td>';
$html .= '</tr>';
$lp = 1;
$sum = 0;
// pozycje
$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;");
{
$html .= '<tr>';
$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>';
$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"> <a href="http://alkomaty.biz/'.$cartitem['pid'].','.$cartitem['seo'].'">'.$cartitem['name'].'</a>';
if($cartitem['discount_code']=="PROMOCJA") $html .= '<font style="color:#dd0000; font-size:7.5pt; font-weight:normal;"><br> CENA PROMOCYJNA</font>';
elseif($cartitem['discount_code']) $html .= '<font style="color:#0000dd; font-size:7.5pt; font-weight:normal;"><br> KOD RABATOWY</font>';
$html .= '</td>';
//WAŻNE pole odpowiedzialne za wyświetlanie ilości towaru
$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">
<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;">
</td>';
//WAŻNE pole odpowiedzialne za wyświetlanie ilości towaru
$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>'; $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>'; $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>'; $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>'; $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>';
$html .= '</tr>';
$sum += ($cartitem['quantity']*$cartitem['pricewithtax_discount']);
}
// podusmowenie cen
$html .= '</form>';
//WAŻNE element zdjęcia po jego kliknięciu powinna być odpalana procedura przeliczania produktów w/g nowej ilości
$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;">';
//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.
$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">
<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;">
</td>';
$html .= '<script type="text/javascript">
zmienna='.$cartitem['id'].';</script>'; //przypisujemy id rekordu do zmiennej JS
$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
function szukaj(id) {
var wartosc = document.getElementById("przycisk_quantity").value;
var xhr = xmlhttp();
var plik = "baza.php";
xhr.open("GET", plik+"?parametr="+wartosc+"&id="+id, true);
xhr.onreadystatechange = function () {
if(xhr.readyState == 4 && xhr.status == 200) {
saveResult(xhr.responseText);
}
else {
saveResult("Wystapił błąd podczas żądania: " + xhr.statusText);
}
};
xhr.send(null);
}
//funckja tworzaca obiekt XMLHttp w roznych przegladarkach
function xmlhttp() {
if (typeof XMLHttpRequest != "undefined") {
return new XMLHttpRequest();
}
else if (window.ActiveXobject) {
var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
for (var i=0; i<aVersions.length; i++) {
try {
var oXmlHttp = new ActiveXObject(aVersions[i]);
return oXmlHttp;
}
catch (oError) {}
}
}
throw new Error("Nie można utworzyć obiektu XMLHttp.");
}
function saveResult(tresc) {
var box = document.getElementById("przycisk_quantity");
if (box.innerHTML != "") box.innerHTML = "";
box.innerHTML = tresc;
}
Plik baza.php
//lączenie z bazą
$parametr = $_GET['parametr']; //pobranie parametrów z łańcucha zapytania
$id = $_GET['id'];
$zap = mysql_query("UPDATE cart SET quantity=".$parametr." WHERE id=".$id.";") or
die('Blad w zapytaniu UPDATE ' . mysql_error()); if (!$zap) echo 'Blad w zapytaniu do bazy danych dla UPDATE ' . mysql_error(); else {
if (!$zap1) echo 'Blad w zapytaniu do bazy danych dla SELECT ' . mysql_error(); else {
while ($row = mysql_fetch_array($zap1)) echo $row['quantity']; //wyświetlamy zaktualizowaną ilość jako wynik }
}
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/simpleCartCzytał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.