Forum Internet Service Backes

Bitte loggen sie sich ein oder registrieren sie sich.

Einloggen mit Benutzername, Passwort und Sitzungslänge
Erweiterte Suche  

Neuigkeiten:

Autor Thema: Warenkorb aktualisieren beim zur-Kasse-gehen  (Gelesen 3373 mal)

Bierbaron

  • {$default_adapter}
  • Senior
  • ****
  • Offline Offline
  • Beiträge: 162
    • Unsere kleine Farm
Warenkorb aktualisieren beim zur-Kasse-gehen
« am: 19 April, 2007, 14:14:26 Nachmittag »

Hallo liebe Leute,

gerade ist mir aufgefallen, dass dem Warenkorb eine überaus wichtige Funktion fehlt!

Szenario:

- Kunde legt Artikel in den Warenkorb
- Kunde ändert die Anzahl der Artikel
- Kunde klickt nicht auf Aktualisieren, sondern geht direkt zur Kasse

...dann hat der Warenkorb noch die Anzahl der Artikel drin, bevor der Kunde sie geändert hat. Die Checkout Shipping übernimmt nicht die "finalen" Werte des Warenkorbs. Das ist irgendwie völliger Murks... Man kann vom Kunden nicht erwarten, dass er vorm zur Kasse gehen nochmal auf Aktualisieren drückt. Ich erwarte dass von Shops auch nicht - es gibt genügend Shopsysteme, die mit dieser Situation souverän umgehen. XT gehört anscheinend nicht dazu...

Hat jemand eine Idee, wie man das lösen könnte (am Besten ohne irgendein JavaScript-submit, sondern direkt in der folgenden Checkout-Datei)?

Cheers,
IaN

EDIT: Ich setzte mal in der checkout_shipping.php an folgender Stelle an:
// if there is nothing in the customers cart, redirect them to the shopping cart page
  if ($_SESSION['cart']->count_contents() < 1) {
    xtc_redirect(xtc_href_link(FILENAME_SHOPPING_CART));
  }
ARGH! Wird nicht klappen, da das Link auf die Checkout NICHT das Warenkorb-Formular versendet!!!!!
« Letzte Änderung: 19 April, 2007, 14:19:38 Nachmittag von Bierbaron »
Gespeichert
"Since this is documented, it is no longer a bug." - Macromedia Support
Sonst noch Fragen? Fragen Sie Nil$en!

Bierbaron

  • {$default_adapter}
  • Senior
  • ****
  • Offline Offline
  • Beiträge: 162
    • Unsere kleine Farm
Re: Warenkorb aktualisieren beim zur-Kasse-gehen
« Antwort #1 am: 19 April, 2007, 15:47:38 Nachmittag »

Heureka, hab's gelöst - war ganz einfach (der "Klassiker" mit den zwei Submit Buttons)!

Okay, mit einigen Verrenkungen wegen des IE - der sendet bei grafischen Submit-Buttons den Namen/Value nicht mit, sondern nur die Klick-Koordinaten. Ist aber kein Problem, die kann man abfragen ;-)

Version: XTC 3.03 - sollte aber auch in den neueren Versionen funktionieren!

In der shopping_cart.php
$smarty->assign('BUTTON_RELOAD',xtc_image_submit('button_update_cart.gif', IMAGE_BUTTON_UPDATE_CART));
$smarty->assign('BUTTON_CHECKOUT','<a href="'.xtc_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL').'">'.xtc_image_button('button_checkout.gif', IMAGE_BUTTON_CHECKOUT).'</a>');

ersetzen durch

// change by IaN 19/Apr/2007 - always send form with an additional var that redirects to checkout
$smarty->assign('BUTTON_RELOAD',xtc_image_submit('button_update_cart.gif', IMAGE_BUTTON_UPDATE_CART, ' name="to_reload" value="true"'));
$smarty->assign('BUTTON_CHECKOUT',xtc_image_submit('button_checkout.gif', IMAGE_BUTTON_CHECKOUT, ' name="to_checkout" value="true"'));

und in der includes/cart_actions.php im Block
switch ($_GET['action']) {
      // customer wants to update the product quantity in their shopping cart
     case 'update_product' :

ungefähr bei Zeile 64

xtc_redirect(xtc_href_link($goto, xtc_get_all_get_params($parameters)));
break;

ersetzen durch

     // add by IaN - auto-update cart - 19/Apr/2007
     // we have to check click position, cause IE/PC does not send name/value correctly
     if (isset($_POST['to_checkout_x'])){
       xtc_redirect(xtc_href_link(FILENAME_CHECKOUT_SHIPPING, xtc_get_all_get_params($parameters), 'SSL'));
     }
     // end add
     xtc_redirect(xtc_href_link($goto, xtc_get_all_get_params($parameters)));     
     break;

Funktioniert gut - so wird *immer* der Warenkorb aktualisiert, auch wenn man direkt zur Kasse geht!

Im offiziellen XT-Forum hiess es "muss man viel programmieren" - ich sag: Nö, mit ein paar Zeilen geht's  ;D

Cheers,
IaN
« Letzte Änderung: 19 April, 2007, 15:59:22 Nachmittag von Bierbaron »
Gespeichert
"Since this is documented, it is no longer a bug." - Macromedia Support
Sonst noch Fragen? Fragen Sie Nil$en!

FrankyGER

  • Newbie
  • *
  • Offline Offline
  • Beiträge: 4
Re: Warenkorb aktualisieren beim zur-Kasse-gehen
« Antwort #2 am: 26 April, 2007, 18:44:28 Nachmittag »

Super,
hat bei mir auf den ersten Blick hervoragend geklappt.
Ich denke schon, das Kunden sich oft gewundert haben, warum Ihre Eingaben ignoriert werden. So ein "aktualisieren" Button sollte überflüssig sein.

Danke
Frank
Gespeichert

MBa

  • Member
  • ***
  • Offline Offline
  • Beiträge: 49
Re: Warenkorb aktualisieren beim zur-Kasse-gehen
« Antwort #3 am: 05 November, 2007, 20:26:52 Nachmittag »

@Bierbaron: Erstmal vielen Dank für den Code...

Nur leider wird die Lagermenge und ob der Kunde einen Checkout machen darf nicht überprüft.

Hier eine angepasste Version.

Es wird überprüft, ob der Checkout erlaubt ist.
- Kunde darf nach checkout_shipping.php
- Wenn Lagerüberwachung aktiv wird überprüft, ob Produkt noch genügend auf Lager ist.

Ausserdem wird ein Produkt aus den Warenkorb gelöscht, bei den der Kunde Menge=0 einträgt.
Fand ich vorher nicht so doll, wenn nur Zahlen über 0 genommen werden. Kann auch ein richtiges Problem werden, wenn der Kunde meint, dass er das Produkt auf 0 gesetzt hat und es nicht gelöscht wird. Vor allen, wenn er im checkout landet.

cart_actions.php (original Version)
suchen...
case 'update_product' :

if (is_object($econda))
$econda->_emptyCart();

for ($i = 0, $n = sizeof($_POST['products_id']); $i < $n; $i++) {
if (in_array($_POST['products_id'][$i], (is_array($_POST['cart_delete']) ? $_POST['cart_delete'] : array ()))) {
$_SESSION['cart']->remove($_POST['products_id'][$i]);

if (is_object($econda))
$econda->_delArticle($_POST['products_id'][$i], $_POST['cart_quantity'][$i], $_POST['old_qty'][$i]);

} else {
if ($_POST['cart_quantity'][$i] > MAX_PRODUCTS_QTY)
$_POST['cart_quantity'][$i] = MAX_PRODUCTS_QTY;
$attributes = ($_POST['id'][$_POST['products_id'][$i]]) ? $_POST['id'][$_POST['products_id'][$i]] : '';

if (is_object($econda)) {
$old_quantity = $_SESSION['cart']->get_quantity(xtc_get_uprid($_POST['products_id'][$i], $_POST['id'][$i]));
$econda->_updateProduct($_POST['products_id'][$i], $_POST['cart_quantity'][$i], $old_quantity);
}

$_SESSION['cart']->add_cart($_POST['products_id'][$i], xtc_remove_non_numeric($_POST['cart_quantity'][$i]), $attributes, false);
}
}
xtc_redirect(xtc_href_link($goto, xtc_get_all_get_params($parameters)));
break;
ersetzen mit...
case 'update_product' :

if (is_object($econda))
$econda->_emptyCart();

for ($i = 0, $n = sizeof($_POST['products_id']); $i < $n; $i++) {
if (in_array($_POST['products_id'][$i], (is_array($_POST['cart_delete']) ? $_POST['cart_delete'] : array ()))) {
$_SESSION['cart']->remove($_POST['products_id'][$i]);

if (is_object($econda))
$econda->_delArticle($_POST['products_id'][$i], $_POST['cart_quantity'][$i], $_POST['old_qty'][$i]);

} else {
if ($_POST['cart_quantity'][$i] > MAX_PRODUCTS_QTY)
$_POST['cart_quantity'][$i] = MAX_PRODUCTS_QTY;
$attributes = ($_POST['id'][$_POST['products_id'][$i]]) ? $_POST['id'][$_POST['products_id'][$i]] : '';

if (is_object($econda)) {
$old_quantity = $_SESSION['cart']->get_quantity(xtc_get_uprid($_POST['products_id'][$i], $_POST['id'][$i]));
$econda->_updateProduct($_POST['products_id'][$i], $_POST['cart_quantity'][$i], $old_quantity);
}

$_SESSION['cart']->add_cart($_POST['products_id'][$i], xtc_remove_non_numeric($_POST['cart_quantity'][$i]), $attributes, false);
if($_POST['cart_quantity'][$i]==0){$_SESSION['cart']->remove($_POST['products_id'][$i]);}
}
}
// xtc_redirect(xtc_href_link($goto, xtc_get_all_get_params($parameters)));
// break;

      // add by IaN - auto-update cart - 19/Apr/2007
      // allow_checkout by MBa
      // we have to check click position, cause IE/PC does not send name/value correctly
      if (isset($_POST['to_checkout_x'])){
require_once (DIR_FS_INC.'xtc_check_stock.inc.php');
$_SESSION['cart']->calculate();
$_SESSION['any_out_of_stock'] = 0;
$products = $_SESSION['cart']->get_products();
for ($i = 0, $n = sizeof($products); $i < $n; $i ++) {
// Push all attributes information in an array
if (isset ($products[$i]['attributes'])) {
while (list ($option, $value) = each($products[$i]['attributes'])) {
$hidden_options .= xtc_draw_hidden_field('id['.$products[$i]['id'].']['.$option.']', $value);
$attributes = xtc_db_query("select pa.products_attributes_id
from ".TABLE_PRODUCTS_OPTIONS." popt, ".TABLE_PRODUCTS_OPTIONS_VALUES." poval, ".TABLE_PRODUCTS_ATTRIBUTES." pa
where pa.products_id = '".$products[$i]['id']."'
and pa.options_id = '".$option."'
and pa.options_id = popt.products_options_id
and pa.options_values_id = '".$value."'
and pa.options_values_id = poval.products_options_values_id
and popt.language_id = '".(int) $_SESSION['languages_id']."'
and poval.language_id = '".(int) $_SESSION['languages_id']."'");
$attributes_values = xtc_db_fetch_array($attributes);
$products[$i][$option]['products_attributes_id'] = $attributes_values['products_attributes_id'];
}
}
}
$any_out_of_stock = '';
$mark_stock = '';
for ($i = 0, $n = sizeof($products); $i < $n; $i ++) {
if (STOCK_CHECK == 'true') {
$mark_stock = xtc_check_stock($products[$i]['id'], $products[$i]['quantity']);
if ($mark_stock){;
$_SESSION['any_out_of_stock'] = 1;
}
}
$attributes_exist = ((isset ($products[$i]['attributes'])) ? 1 : 0);
if ($attributes_exist == 1) {
reset($products[$i]['attributes']);
while (list ($option, $value) = each($products[$i]['attributes'])) {
if (ATTRIBUTE_STOCK_CHECK == 'true' && STOCK_CHECK == 'true') {
$attribute_stock_check = xtc_check_stock_attributes($products[$i][$option]['products_attributes_id'], $products[$i]['quantity']);
if ($attribute_stock_check){
$_SESSION['any_out_of_stock'] = 1;
}
}
}
}
}
if(!$_SESSION['any_out_of_stock']){
$_SESSION['allow_checkout'] = 'true';
if (STOCK_CHECK == 'true') {
if ($_SESSION['any_out_of_stock'] == 1) {
if (STOCK_ALLOW_CHECKOUT == 'true') {
// write permission in session
$_SESSION['allow_checkout'] = 'true';
} else {
$_SESSION['allow_checkout'] = 'false';
}
} else {
$_SESSION['allow_checkout'] = 'true';
}
}
xtc_redirect(xtc_href_link(FILENAME_CHECKOUT_SHIPPING, xtc_get_all_get_params($parameters), 'SSL'));
break;
}
      }
      // end add
      xtc_redirect(xtc_href_link($goto, xtc_get_all_get_params($parameters)));
      break;

PS: Alles recht unübersichtlich, ich musste doch ne' Menge Code von xtc klauen, aber so geht es.
« Letzte Änderung: 05 November, 2007, 20:39:15 Nachmittag von MBa »
Gespeichert

Bierbaron

  • {$default_adapter}
  • Senior
  • ****
  • Offline Offline
  • Beiträge: 162
    • Unsere kleine Farm
Re: Warenkorb aktualisieren beim zur-Kasse-gehen
« Antwort #4 am: 05 November, 2007, 20:50:35 Nachmittag »

Jo cool, jetzt müsste es für jeden gehen...

Checkout-Überprüfung brauchte ich nicht, da bei uns jeder bestellen kann  ;D

Zitat
Ausserdem wird ein Produkt aus den Warenkorb gelöscht, bei den der Kunde Menge=0 einträgt.
Fand ich vorher nicht so doll, wenn nur Zahlen über 0 genommen werden. Kann auch ein richtiges Problem werden, wenn der Kunde meint, dass er das Produkt auf 0 gesetzt hat und es nicht gelöscht wird. Vor allen, wenn er im checkout landet.

Das hatte ich schon anders gelöst (Reload mit Löschen des Artikels bei Artikelanzahl 0), deshalb brauchte ich das an dieser Stelle nicht.
Gespeichert
"Since this is documented, it is no longer a bug." - Macromedia Support
Sonst noch Fragen? Fragen Sie Nil$en!
 

User Contact