Ich arbeite an einer einseitigen Kaufabwicklung und versuche, den Warenkorb-Überprüfungsbereich mit einem Versandpreis zu aktualisieren, während der Benutzer eine Versandoption auswählt .
Ich habe den Versandoptionen #ajax-Informationen beigefügt, um das Warenkorb-Überprüfungsformular zu aktualisieren, wenn eine Versandoption gespeichert wird.
Ändern des Ajax-Rückrufs für den Handelsversand an der Kasse
if($form_id == 'commerce_checkout_form_checkout') {
$form['commerce_shipping']['shipping_service']['#ajax']['callback'] = 'mshop_shipping_pane_service_details_refresh';
}
Ajax-Rückruf
function mshop_shipping_pane_service_details_refresh($form, $form_state) {
// Update shipping form
$commands[] = ajax_command_replace('#' . $form['commerce_shipping']['service_details']['#id'], render($form['commerce_shipping']['service_details']));
// Update checkout cart review
list($view_id, $display_id) = explode('|', variable_get('commerce_cart_contents_pane_view', 'commerce_cart_summary|default'));
$commands[] = ajax_command_replace('.view-mshop-cart-shopping-cart-summary', commerce_embed_view($view_id, $display_id, array(arg(1))));
return array('#type' => 'ajax', '#commands' => $commands);
}
Das Problem: Der AJAX funktioniert, die aktualisierte Ansicht zur Überprüfung des Warenkorbs wird aktualisiert, aber die Versandoption wird nicht angewendet.
Ich vermute, dass die Bestellung nicht gespeichert wird, da das Formular nur aktualisiert und nicht gesendet wird. Da die Ansicht der Warenkorbbewertung auf der Bestellung basiert und die Versandoption noch nicht in der Bestellung gespeichert ist, werden in der Warenkorbbewertung nicht die richtigen Versandinformationen angezeigt.
Irgendeine Problemumgehung?
BEARBEITEN:
Dank milchowsky Kommentar konnte ich die Bestellung mit der auf die Bestellung angewendeten Versandrate speichern. Anschließend wird die Ansicht zur Überprüfung des Warenkorbs korrekt angezeigt, wobei die aktualisierte Warenkorbrate angewendet wird.
/**
* Ajax callback: Returns the shipping details form elements that match the
* currently selected shipping service.
*/
function mshop_shipping_pane_service_details_refresh($form, &$form_state, $checkout_pane, $order) {
// Get order from form
list($order, $checkout_pane) = $form_state['build_info']['args'];
// Load up to date order
$order = commerce_order_load($order->order_id);
// Get selected
$service_name = $form['commerce_shipping']['shipping_service']['#default_value'];
commerce_shipping_service_rate_order($service_name, $order);
// Delete any existing shipping line items from the order.
commerce_shipping_delete_shipping_line_items($order, TRUE);
// Extract the unit price from the calculated rate.
$rate_line_item = $order->shipping_rates[$service_name];
$rate_line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $rate_line_item);
$unit_price = $rate_line_item_wrapper->commerce_unit_price->value();
// Create a new shipping line item with the calculated rate from the form.
$line_item = commerce_shipping_line_item_new($service_name, $unit_price, $order->order_id, $rate_line_item->data, $rate_line_item->type);
// Save and add the line item to the order.
$new_line_item = commerce_shipping_add_shipping_line_item($line_item, $order, TRUE);
commerce_order_save($order);
// Update shipping form
$commands[] = ajax_command_replace('#' . $form['commerce_shipping']['service_details']['#id'], render($form['commerce_shipping']['service_details']));
// Update checkout cart review
list($view_id, $display_id) = explode('|', variable_get('commerce_cart_contents_pane_view', 'commerce_cart_summary|default'));
$commands[] = ajax_command_replace('.view-mshop-cart-shopping-cart-summary', commerce_embed_view($view_id, $display_id, array($order->order_id)));
$commands[] = ajax_command_after('.main form', theme('status_messages'));
// $commands[] = ajax_command_after('.'.$form['#attributes']['class'][1].':eq(0)',theme('status_messages'));
return array('#type' => 'ajax', '#commands' => $commands);
}
if($form_id == 'commerce_checkout_form_checkout') { $form['commerce_shipping']['shipping_service']['#ajax']['callback'] = 'mshop_shipping_pane_service_details_refresh'; }
implementiert hook_form_alter
oder ein spezieller Commerce-Hook?
$form['commerce_shipping']['shipping_service']['#ajax']['callback'] = ...