Wie erzwinge ich die Kontoerstellung, bevor die Kaufabwicklung abgeschlossen ist?

7

Ich habe derzeit eine einseitige Kaufabwicklung, die für anonyme Benutzer hervorragend geeignet ist. Nach Abschluss der Zahlung wird ein Konto mit der Checkout-Regel "Neues Konto für eine anonyme Bestellung erstellen" erstellt.

Jetzt muss ich der Site ein Abonnementprodukt hinzufügen und planen, Commerce License und Commerce License Billing zu verwenden, um eine Rolle zu verkaufen. Um wiederkehrende Zahlungen abzuwickeln, plane ich, Commerce Card on File zu verwenden.

Dies führt zu einem Problem, da für Card on File ein authentifizierter Benutzer erforderlich ist, um Karten zu speichern. Siehe https://www.drupal.org/node/1553468

Wie kann ich ein Benutzerkonto erstellen, bevor der Checkout abgeschlossen ist, damit Card on File die Karten ordnungsgemäß speichern kann?

Im Idealfall gibt es eine benutzerdefinierte Checkout-Seite, die die Registrierung eines Kontos als ersten Schritt beim Checkout erzwingt, jedoch nur für Benutzer, die Abonnementprodukte kaufen.

Ich erlaube Besuchern derzeit nicht, sich auf der Website zu registrieren (außer über Commerce Checkout), und ich möchte das lieber nicht ändern.

Dave Bruns
quelle

Antworten:

1

Ich schlage folgende Schritte vor:

  • Erstellen Sie einen benutzerdefinierten Checkout-Bereich (siehe checkout_pane_example.module ) und binden Sie das Benutzerregisterformular in diesen Bereich ein:

    /**
     * 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;
    }
    
  • Gehen Sie zu admin / trade / config / checkout und setzen Sie es als deaktiviert

  • Wenn Sie Commerce Rules Extra installieren , werden die Funktionen hinzugefügt, die Sie benötigen:

Regelbedingungen: Gesamtprodukt des Typmengenvergleichs

Regelaktionen: Fenstereigenschaften ändern: Sichtbarkeit, Seite und Gewicht eines Fensters ändern

  • Erstellen Sie eine Regel:
    • Ereignis: Checkout-Bereich verarbeiten.
    • Bedingungen: Benutzer ist anonym; Abonnementproduktmenge> 0.
    • Aktion: Fenstereigenschaften ändern: aktiviert: true; zur Kasse gehen.
Kojo
quelle
Großartig, ich werde es versuchen. Haben Sie Vorschläge, wie Sie das neue Konto automatisch genehmigen und den Benutzer anmelden können, bevor Sie mit dem nächsten Schritt fortfahren?
Dave Bruns
@ DaveBruns Ich habe die Antwort bearbeitet, das war etwas kniffliger
Kojo
danke Ich schätze es, dass Sie sich damit befassen und mehr Details liefern. Wird dieser Code nach der Kontoerstellung zur Kasse zurückgeleitet? Ich habe auch etwas Ähnliches in drupal.org/project/commerce_extra gefunden (siehe Submodul " Commerce Extra Login Page"), aber die Weiterleitung funktioniert bei mir nicht.
Dave Bruns
Die Idee ist, den Checkout-Prozess nicht zu verlassen. Registrieren Sie sich und melden Sie sich sofort an, wenn Sie das Überprüfungsfenster aufrufen. Testen Sie ein paar Mal nur den obigen Code. Sie müssen es vielleicht ein wenig abstimmen, aber dies beantwortet Ihre Frage, glaube ich, vollständig. Lass es mich wissen
Kojo
Ja natürlich. Ein bisschen zu viel Modultest, sorry. Ich habe Ihren Code in einem Modul, aber die Submit-Funktion schlägt fehl, weil $ form_state aus irgendeinem Grund leer ist.
Dave Bruns
0

Zusätzlich zu Kojos hervorragender Lösung möchte ich hinzufügen, dass sich meines Erachtens das richtige Eingabefeld für den Benutzernamen für die normale Drupal-Installation befindet in:

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

Das Modul leitet immer noch zur neuen Benutzerprofilseite weiter, aber ich werde die Ursache heute weiter untersuchen.

Nikola Kołodziejczyk
quelle
0

Es gibt eine Einstellung auch eine Einstellung in Drupalcommerce für Drupal 8.

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

Jetzt wirst du sehen

Loggen Sie sich ein oder fahren Sie als Gast fort

Klicken Sie auf das Zahnradsymbol, klicken Sie auf und deaktivieren Sie es Allow guest checkout.

Das ist alles was Sie tun müssen.

sorabh.v6
quelle
Dies beantwortet den Titel der Frage, aber nicht die Frage selbst.
Joshmiller
0

So erreiche ich das Erstellen des Commerce-Checkout-Bereichs "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;
    }
  }
}
user3557613
quelle