Thanh toán thương mại - Cập nhật khung giỏ hàng sau khi người dùng chọn tùy chọn giao hàng (ajax)


7

Tôi đang làm việc trên một trang thanh toán và tôi đang cố gắng cập nhật khung đánh giá giỏ hàng với giá vận chuyển trong khi người dùng chọn tùy chọn giao hàng .

Tôi đã đính kèm thông tin #ajax vào các tùy chọn giao hàng, để cập nhật biểu mẫu đánh giá giỏ hàng khi tùy chọn giao hàng được lưu.

Sửa đổi vận chuyển thương mại gọi lại ajax khi thanh toán

if($form_id == 'commerce_checkout_form_checkout') {
  $form['commerce_shipping']['shipping_service']['#ajax']['callback'] = 'mshop_shipping_pane_service_details_refresh';
}

Gọi lại Ajax

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);
}

Vấn đề: AJAX đang hoạt động, chế độ xem đánh giá giỏ hàng được cập nhật, nhưng tùy chọn giao hàng không được áp dụng.

Tôi đoán là, vì hình thức chỉ được cập nhật và không được gửi, đơn đặt hàng không được lưu. Vì vậy, vì chế độ xem của giỏ hàng dựa trên đơn đặt hàng và tùy chọn giao hàng chưa được lưu theo thứ tự, nó không hiển thị đúng thông tin giao hàng trong đánh giá giỏ hàng.

Bất kỳ cách giải quyết?

BIÊN TẬP:

Nhờ bình luận của milkovsky tôi đã có thể lưu đơn hàng với mức giá vận chuyển áp dụng cho đơn hàng. Sau đó, giao diện xem xét giỏ hàng hiển thị chính xác với tốc độ giỏ hàng được áp dụng.

/**
 * 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);
}

Kiểm tra xem bạn không ghi đè cuộc gọi lại hiện tại bằng cách sử dụng$form['commerce_shipping']['shipping_service']['#ajax']['callback'] = ...
milkovsky

Tôi không thể làm cho nó hoạt động - là mã if($form_id == 'commerce_checkout_form_checkout') { $form['commerce_shipping']['shipping_service']['#ajax']['callback'] = 'mshop_shipping_pane_service_details_refresh'; } triển khai hook_form_alterhoặc một số móc thương mại đặc biệt?
Dalmaz

Có, tôi đang triển khai hook_form_alter () cơ bản. Về phía tôi, nó hoạt động trên phiên bản mới nhất của Drupal Commerce. Là cuộc gọi lại của bạn được thực hiện?
E. de Saint Chamas

Câu trả lời:


4

Bạn đúng rồi. Giá vận chuyển chỉ được áp dụng sau khi bạn gửi biểu mẫu (Nhấp vào "Tiếp theo").

Khi gửi tất cả các quy tắc giao hàng (hoặc mức giá cố định) được áp dụng và đơn hàng được lưu với các chi tiết đơn hàng mới (Giao hàng được thực hiện thông qua loại mục hàng tùy chỉnh).

Tính toán được thực hiện trong Commerce_shipping_pane_checkout_form_submit ()

Vì vậy, bạn có thể thử thực hiện chức năng này (hoặc một số phần của nó) trong cuộc gọi lại ajax trước khi giỏ hàng được cập nhật.

Dưới đây là một ví dụ về cách áp dụng giá vận chuyển nếu bạn đang sử dụng Mô-đun tốc độ phẳng: Thêm vận chuyển để đặt hàng theo chương trình thông qua mô-đun .


1
Cảm ơn, giải pháp thứ hai của bạn hoạt động như một nét duyên dáng. Tôi thích giải pháp đầu tiên của bạn không yêu cầu tải và lưu đơn hàng, giữa quá trình thanh toán, nhưng không thành công trong việc triển khai chính xác Commerce_shipping_pane_checkout_form_submit () vì nó yêu cầu 2 biến tôi không thể truy cập trong hàm này. Tôi sẽ cập nhật bài viết của mình với giải pháp.
E. de Saint Chamas

1
Câu trả lời sử thi và chỉnh sửa! Thx
Michiel

Vì vậy, có cách nào để buộc điều này thông qua UI?
nizz0k

2

Trước tiên, cảm ơn bạn đã đăng giải pháp này!

Tôi đã nhận được lỗi 500 này từ phản hồi AJAX: "EntityMetadataWrapperException: Thiếu giá trị dữ liệu. Trong EntityMetadataWrapper-> value ().

Tôi muốn cung cấp giao hàng miễn phí cho các đơn hàng trên 100 đô la vì vậy đã kích hoạt mô-đun Commerce_order_total ( https://www.drupal.org/sandbox/joshmiller/2718047 ) trong đó nêu rõ lỗi khi chọn phương thức giao hàng.

Sau một số gỡ lỗi, tôi thấy nó chỉ xảy ra khi dòng Commerce_order_save () được bao gồm.

Vì tôi đã đặt các thanh toán của mình xuất hiện trên cùng một trang và Ngăn Đánh giá của tôi bị vô hiệu hóa, tôi đã gói dòng này trong một câu lệnh IF:

//get checkout panes
$panes = commerce_checkout_panes();

//check if the Review pane is enabled
if ($panes['checkout_review']['enabled']){
  //review is enabled
  commerce_order_save($order);
}

Nhận xét / cải tiến được khuyến khích!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.