web-dev-qa-db-ja.com

[カートに追加]ボタンを押した後、チェックアウトにリダイレクトします

ユーザーが商品ページの[カートに追加]ボタンを押すと、ユーザーをチェックアウトページに自動的にリダイレクトしたいと考えています。

Drupal 7には プログラムでこれを行う場合の問題ルールモジュールでこれを行う場合の問題 があります。

ルールはまだD8のアルファ版であり、新しい注文を保存した後に作用するルールを作成しようとしましたが、エラーが発生します。私はアクションを追加しようとします:

Error: Call to a member function getDataType() on null in Drupal\rules\Plugin\RulesAction\EntityCreateDeriver->getDerivativeDefinitions() (line 99 of modules/contrib/rules/src/Plugin/RulesAction/EntityCreateDeriver.php).

したがって、カートに追加からチェックアウトページにプログラムでリダイレクトしたいと思います。

しかし ドキュメントなし はまだあります。だから誰かがこれを行う方法を説明できれば、私は大いに義務付けられるでしょう。

4
Patrick Kenny

フォーマッターを介して、プロジェクトに使用している私のMRが含まれていることを許可する問題がここにあります。カートを完全にスキップすることに注意してください。チェックアウトがあるだけです。

https://www.drupal.org/node/281072

3
Berdir

あなたはこのようなことをすることができます:

use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;

function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if (strpos($form_id, 'commerce_order_item_add_to_cart_form_commerce_product') !== false) {
    $form['actions']['submit']['#submit'][] = 'MYMODULE_cart_alter_sub';
 }
}
function MYMODULE_cart_alter_sub(&$form, FormStateInterface $form_state) {
  $responce =  new RedirectResponse('/cart');
  $responce->send();
}
4
Taggart Jensen

ルールベースのソリューションはまだないので、これを実行するためにくだらないjquery関数を作成しました。

最初に、Drupalが商品をカートに追加したというメッセージを送信したかどうかをチェックし、カートページへの単純なリダイレクトを実行して、チェックアウトページに直接送信します。

  Drupal.behaviors.donate = {
    attach: function (context, settings) {
        if ($("div[role=contentinfo]").length){
              var str=$("div[role=contentinfo]").html();
              var n=str.includes('Donatie added to <a href="/cart">your cart</a>.');
              if (n){
                  window.location="/cart";
              }
        }
        if ($("#edit-checkout").length){
               $("#edit-checkout").click();
        }

  }
  }; 
2

このためのコードを書いてくれた@Berdirに感謝します。

使い方 パッチ

  1. パッチを適用します。
  2. /admin/commerce/config/product-types/my-product-type/edit/display)。
  3. Product Variationsフィールドを探します。その形式はAdd to cart formである必要があります。右側の小さな歯車のアイコンをクリックします。
  4. Skip cartのボックスをチェックし、Updateを押します。
1
Patrick Kenny

このリダイレクトも必要でした(カートへのリダイレクトですが、チェックアウトにも使用できます)。

機能しているように見えても予測できないいくつかの可能性があります。

  • 注文アイテムの保存に基づくルールのリダイレクト
  • イベントリスナー:commerce_order.place.post_transition
  • 「カートに追加」アクションでハンドラーを送信します。これらのソリューションはすべて一見動作するように見えるかもしれませんが、さらにテストした後、カートにアイテムを追加する前にリダイレクトが行われる場合がありました。

したがって、私はEgbert Bleyenburgによって提供された解決策を使用しますが、hook_preprocess_status_messages()を使用した点が異なります。そのため、ステータスメッセージのレンダリング手順をスキップし、JavaScriptを使用しません。

Hook_preprocess_status_messages()で関数を呼び出します。

function hook_preprocess_status_messages(&$variables) {
  redirect_order_to_cart($variables['message_list']['status']);
}

上記はほんの一例です。本番環境では、正しいページにいるかどうか、ステータスメッセージが設定されているかどうかを確認するための条件が必要です。リダイレクトするために呼び出すカスタム関数の下:

function redirect_order_to_cart(array $status_messages) {
  $cart_path = Url::fromRoute('commerce_cart.page')->getInternalPath();

  foreach ($status_messages as $message) {

    // If we have a status message containing a href with the cart path we know
    // that it's the order item confirm message. This is the moment we want to
    // redirect to the cart.
    if (
      $message instanceof Markup
      && strpos($message->jsonSerialize(), 'href="/' . $cart_path) !== FALSE
    ) {
      // Setting the redirect.
      $response = new RedirectResponse(\Drupal::service('url_generator')
        ->generateFromRoute('commerce_cart.page'));
      $response->send();
      break;
    }
  }
}
1
Floris Vedder