Drupal 7.12とUbercart 3.0を使用しています。チェックアウトレビューページをスキップして単一ページのチェックアウトを有効にするために、カスタムモジュールを作成しました。
_/**
* Implementation of hook_form_submit().
*
* Change Ubercart review pages to instant order submissions.
*/
function uc_onepagecheckout_form_submit($form, &$form_state) {
// check for order submit
if(isset($form_state['storage']['order'])) {
$order_id = $form_state['storage']['order']->order_id;
$reviewRequested = $_SESSION['uc_checkout'][$order_id]['do_review'];
}
// If the normal submit handler set do_review then call the review
// form submit function.
if ($reviewRequested && $form_state['redirect'] == 'cart/checkout/review') {
// Clear the previous redirect because we're going to override it anyway.
unset($form_state['redirect']);
// Cause the review form to be loaded because some modules may
// do some of their processing here.
uc_cart_checkout_review();
$order = uc_order_load($_SESSION['cart_order']);
if ($order->payment_method == 'Paypal_wps') {
$wps_form = uc_Paypal_wps_form($form, $form_state, $order);
$wps_url = $wps_form['#action'] . '?';
foreach (element_children($wps_form) as $key) {
$wps_url .= urlencode($key) . '=' . urlencode($wps_form[$key]['#value']) . '&';
}
$wps_url = trim($wps_url, '&');
drupal_goto($wps_url);
}
else {
// Now submit the form. Obviously the $form_state isn't actually
// correct... hopefully nothing will care.
uc_cart_checkout_review_form_submit($form, $form_state);
// And check for an error.
if ($form_state['redirect'] == 'cart/checkout/review') {
// There's an error, so pretend the user clicked back.
uc_cart_checkout_review_form_back($form, $form_state);
}
}
// Ultimately the $form_state changes made by functions above are used.
}
elseif ($form_state['redirect'] != 'cart/checkout') {
// Log any unexpected URLs in 'redirect'.
watchdog('uc_cart', 'Checkout returned unexpected destination url: %url',
array('%url' => $form_state['redirect']), WATCHDOG_DEBUG);
}
}
/**
* Implementation of hook_form_alter().
*
* Changes text on review order button to submit order and adds our custom submit function.
* Adds a "Skip checkout review" option to checkout settings form.
*/
function uc_onepagecheckout_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'uc_cart_checkout_form':
// Change the submit button label.
$form['actions']['continue']['#value'] = variable_get('uc_checkout_submit_button', t('Submit order'));
// Add our submit handler.
$form['#submit'][] = 'uc_onepagecheckout_form_submit';
// And add our JavaScript file to handle this submit button.
drupal_add_js(drupal_get_path('module', 'uc_optional_checkout_review') .'/uc_onepagecheckout_checkout_form.js');
// Add the uc_cart css, since it contains the throbber styles that we are using in the JavaScript.
drupal_add_css(drupal_get_path('module', 'uc_cart') .'/uc_cart.css');
break;
}
}
_
このコードはこのモジュールに基づいています: bercart Optional Checkout Review
送信された注文は、「保留」状態ではなく、「in_checkout」状態で止まっています。また、メールはお客様に送信されません。おそらく、uc_cart_checkout_review_form_submit($form, $form_state)
の呼び出しは正しく機能しません。
この問題の解決を手伝ってくれませんか?
自分で見つけました。問題はubercartコアファイルuc_cart.pages.incの意図しない変更でした。そのため、関数uc_cart_checkout_complete()は注文を完了せずに即座に戻りました。これは通常のケースでは発生しないはずなので、私の質問のコードは機能するはずです。
c_optional_checkout_review モジュールをインストールして、admin/store/settings/checkoutメニューの「Skip checkout review」のチェックボックスを設定することで、レビューを簡単に削除できます。
あなたのソリューションは属性のない製品で動作しますが、属性がある場合はそれらを失います。私はソリューションに取り組んでいますが、現時点ではそれがありません。