web-dev-qa-db-ja.com

Ubercart 3:レビューをスキップ、単一ページのチェックアウト

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)の呼び出しは正しく機能しません。

この問題の解決を手伝ってくれませんか?

3
Alp

自分で見つけました。問題はubercartコアファイルuc_cart.pages.incの意図しない変更でした。そのため、関数uc_cart_checkout_complete()は注文を完了せずに即座に戻りました。これは通常のケースでは発生しないはずなので、私の質問のコードは機能するはずです。

3
Alp

c_optional_checkout_review モジュールをインストールして、admin/store/settings/checkoutメニューの「Skip checkout review」のチェックボックスを設定することで、レビューを簡単に削除できます。

2
B Ravanbakhsh

あなたのソリューションは属性のない製品で動作しますが、属性がある場合はそれらを失います。私はソリューションに取り組んでいますが、現時点ではそれがありません。

0
user1014351