私は1ページのチェックアウトに取り組んでおり、ユーザーが配送オプションを選択している間、カートレビューペインを配送価格で更新しようとしています。
配送オプションが保存されたときにカートのレビューフォームを更新するために、配送オプションに#ajax情報を添付しました。
チェックアウト時のコマース配送ajaxコールバックの変更
if($form_id == 'commerce_checkout_form_checkout') {
$form['commerce_shipping']['shipping_service']['#ajax']['callback'] = 'mshop_shipping_pane_service_details_refresh';
}
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);
}
問題: AJAXは機能しており、更新されたカートレビュービューは更新されていますが、配送オプションが適用されていません。
私の推測では、フォームは更新されるだけで送信されないため、注文は保存されません。したがって、カートレビューのビューは注文に基づいており、配送オプションは注文にまだ保存されていないため、カートレビューに正しい配送情報が表示されません。
回避策はありますか?
編集:
milkovskyのコメントのおかげで、注文に適用される配送料で注文を保存できました。次に、カートレビュービューが正しく表示され、更新されたカートレートが適用されます。
/**
* 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'; }
実装していますhook_form_alter
か、それとも特別なコマースフックですか?
$form['commerce_shipping']['shipping_service']['#ajax']['callback'] = ...