コマースチェックアウトが完了する前にアカウント作成を強制する方法は?


7

現在、匿名ユーザーに最適な1ページのチェックアウトがあります。支払いが完了すると、「匿名注文用の新しいアカウントを作成する」チェックアウトルールでアカウントが作成されます。

次に、サブスクリプション製品をサイトに追加し、コマースライセンスとコマースライセンス請求を使用してロールを販売する必要があります。定期的な支払いを処理するために、Commerce Card on Fileを使用する予定です。

カード・オン・ファイルはカードを保存するために認証されたユーザーを必要とするため、これは問題を引き起こします。https://www.drupal.org/node/1553468を参照してください

カードオンファイルがカードを適切に保存できるように、チェックアウトが完了する前にユーザーアカウントを作成するにはどうすればよいですか?

理想的には、チェックアウトの最初のステップとしてアカウント登録を強制するカスタムチェックアウトページがあり、サブスクリプション製品を購入するユーザーのみが対象です。

現時点では、訪問者がサイトに登録することは許可されていません(Commerce Checkoutを除く)。変更はしたくないです。

回答:


1

次の手順をお勧めします。

  • カスタムチェックアウトペインを作成し(checkout_pane_example.moduleを参照 )、そのペインにユーザー登録フォームを埋め込みます。

    /**
     * Implements hook_commerce_checkout_pane_info().
     */
    function vts_register_commerce_checkout_pane_info() {
      $panes['register'] = array(
        'title' => t('Create an account'),
        'base' => 'vts_register_pane',
        'name' => t('NAME'),
        'page' => 'checkout',
        'weight' => -5,
      );
      return $panes;
    }
    /*
     * Add user_register_form to register pane
     */
    function vts_register_pane_checkout_form($form, &$form_state, $checkout_pane, $order) { 
      $pane_form = drupal_get_form('user_register_form');
      return $pane_form;
    }
    /*
     * Alter checkout form register pane
     */
    function vts_register_form_commerce_checkout_form_checkout_alter(&$form, &$form_state, $form_id) {
      unset($form['register']['actions']); 
    }
    /**
     * checkout form submission callback.
     */
    function vts_register_pane_checkout_form_submit($form, &$form_state, $checkout_pane, $order) {
      $new_user = array(
        //dsm to find the correct $form_state['input'] for username here, because I have an altered user register form...
        'name' => $form_state['input']['field_name_first']['und'][0]['value'].'_'.$form_state['input']['field_name_last']['und'][0]['value'],
        'pass' => user_password(),
        'mail' => $form_state['input']['mail'],
        'init' => $form_state['values']['mail'],
        'status' => 1,
        'roles' => array(DRUPAL_AUTHENTICATED_RID => TRUE),
      );
      if($GLOBALS['user']->uid == '0') {
        $user = user_save('', $new_user);
        //ASSIGN the current order to created user
        $order->uid = $user->uid;
        commerce_order_save($order);
        $GLOBALS['user'] = $user;
      }
      //check that you got a new user and the order was assigned to him
      dsm($user, 'user');
      dsm($order, 'order');
    }
    /**
     * Validation callback.
     */
    function vts_register_pane_checkout_form_validate($form, &$form_state, $checkout_pane, $order) {
      //validation stuff
      return TRUE;
    }
    /**
     * Ouputs Review checkout pane.
     */
    function vts_register_pane_review($form, $form_state, $checkout_pane, $order) {
      // add some info to review pane
      return;
    }
  • admin / commerce / config / checkoutに移動して、無効に設定します

  • Commerce Rules Extraをインストールすると、必要な機能が追加されます。

ルール条件:タイプ数量比較の合計製品

ルールアクション:ペインプロパティの変更:ペインの表示、ページ、ウェイトの変更

  • ルールを作成します。
    • イベント:プロセスのチェックアウトペイン。
    • 条件:ユーザーは匿名です。サブスクリプション製品数量> 0。
    • アクション:ペインのプロパティを変更します:有効:true; チェックアウトに移動します。

すばらしい、これを試してみます。次のステップに進む前に、新しいアカウントを自動承認してユーザーをログインさせる方法について何か提案はありますか?
Dave Bruns 2014

@DaveBruns回答を編集しましたが、これは少しトリッキーでした
Kojo

ありがとうございます。これを検討し、詳細を説明していただきありがとうございます。このコードは、アカウント作成後にチェックアウトにリダイレクトされますか?drupal.org/project/commerce_extra(Commerce Extra Login Pageサブモジュールを参照)でも同様のものが見つかりましたが、リダイレクトが機能しません。
デイブブランズ2014

アイデアは、チェックアウトプロセスを離れないことです。ペインを確認するときにすぐに登録してログインします。上記のコードのみを数回テストしました。あなたはそれを少し調整する必要があるかもしれませんが、これは私が信じているあなたの質問に完全に答えます。お知らせください
古城

はい、もちろん。少し多すぎるモジュールのテスト、申し訳ありません。モジュールにコードがありますが、何らかの理由で$ form_stateが空であるため、送信機能は失敗します。
Dave Bruns 2014

0

Kojoの優れたソリューションに加えて、通常のDrupalインストールの正しいユーザー名入力フィールドは次の場所にあると思います。

'name' => $form_state['input']['name']

モジュールはまだ新しいユーザープロファイルページにリダイレクトしますが、本日は原因をさらに調査します。


0

drupalcommerceにはdrupal 8の設定もあります。

/admin/commerce/config/checkout-flows/manage/default

今あなたは見るでしょう

ゲストとしてログインまたは続行

歯車アイコンをクリックし、をクリックして、チェックを外しAllow guest checkoutます。

それがあなたがする必要があるすべてです。


これは質問のタイトルには答えますが、質問自体には答えません。
joshmiller 2017

0

これがuser_register_formコマースチェックアウトペインを作成する方法です。

/**
 * Implements hook_commerce_checkout_pane_info().
 */
function edw_commerce_dc_commerce_checkout_pane_info() {
  $panes['register'] = [
    'title' => t('Create an account'),
    'base' => 'edw_commerce_dc_register_pane',
    'name' => t('Authentication'),
    'file' => 'edw_commerce_dc.pane.inc',
    'page' => 'checkout',
    'weight' => -5,
  ];
  return $panes;
}

/*
 * Alter checkout form register pane
 */
function edw_commerce_dc_form_commerce_checkout_form_checkout_alter(&$form, &$form_state, $form_id) {
  unset($form['register']['actions']);
  if(isset($form['register'])){
    $form_id = 'user_register_form';
    $hooks = array('form');
    $hooks[] = 'form_' . $form_id;
    drupal_alter($hooks, $form['register'], $form_state, $form_id);
  }
}

    /*
 * Add user_register_form to register pane
 */
function edw_commerce_dc_register_pane_checkout_form($form, &$form_state, $checkout_pane, $order) {
  if (user_is_anonymous()) {
    $pane_form = drupal_retrieve_form('user_register_form', $form_state);
    $pane_form['#tree'] = FALSE;
    return $pane_form;
  }
}

/**
 * checkout form submission callback.
 */
function edw_commerce_dc_register_pane_checkout_form_submit($form, &$form_state, $checkout_pane, $order) {
  if (isset($form['register'])) {
    foreach ($form["register"]["#submit"] as $callback) {
      $callback($form['register'], $form_state);
    }
  }
}

/**
 * checkout form submission callback.
 */
function edw_commerce_dc_register_pane_checkout_form_validate($form, &$form_state, $checkout_pane, $order) {
  if (isset($form['register'])) {
    foreach ($form["register"]["#validate"] as $callback) {
      $callback($form['register'], $form_state);
    }
    if (!form_get_errors()) {
      return TRUE;
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.