web-dev-qa-db-ja.com

カートをバイパスして直接チェックアウトするにはどうすればよいですか?

この機能は、Drupal 7 Rules モジュールで、または Commerce Checkout Express モジュールを使用して)簡単に実現できることを知っています。

ルールとコマースはまだそれほど統合されていないので、Drupal 8。

ルールだけを使用してこの機能を実装できますか?答えがnoの場合、プログラムでどのように実行できますか?

5
Sohail

コマースの最後の開発バージョンを使用し、_commerce\modules\cart\src\Form\AddToCartForm.php_名前空間の下にあるファイル_Drupal\commerce_cart\Form_を探すと、cart_idが設定されていることがわかります。これは注文IDでもあります。

_$form_state->set('cart_id', $cart->id());
_

したがって、hook_form_alter()では、注文ID(カートID)を取得できます。

_$order_id = $form_state->get('cart_id');
_

完全なコードはこれです。

_use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;

/**
 * Implements hook_form_alter().
 */
function <MY_MODULE>_form_alter(&$form, FormStateInterface $form_state, $form_id) {
    // Add to cart form id for product 5 is: commerce_order_item_add_to_cart_form_commerce_product_5
    // Then it's enough to check $form_id contains the string 'commerce_order_item_add_to_cart_form_commerce'
    if(strpos($form_id, 'commerce_order_item_add_to_cart_form_commerce') !== false) {
        $form['actions']['submit']['#submit'][] = '_redirect_to_checkout';
    }
}

// Callback for form submission
// @see hook_form_alter().
function _redirect_to_checkout(&$form, FormStateInterface $form_state) {
  /** @var \Drupal\commerce_order\Entity\OrderInterface $cart_id */
  $cart_id = $form_state->get('cart_id');

  $url = Url::fromRoute('commerce_checkout.form',
    ['commerce_order' => $cart_id]
  );

  $form_state->setRedirectUrl($url);
}
_
6
Iman Kiani