web-dev-qa-db-ja.com

どうすればコマースのクーポンコードフィールドを必須にできますか?

D7コマースクーポン/割引モジュールの使用。クーポンフィールドを必須にする必要があります。すべての注文には、クーポンコードを入力する必要があります。

フィールドには標準の「必須」チェックボックスはありません。条件付きフィールドモジュールを使用してみましたが、役に立ちませんでした。

enter image description here

1
Nigel Waters

これはhook_form_FORM_ID_alter()で行う必要があります。

動的フォームIDをチェックするのでない限り、hook_form_alter()は使用しません。この場合、hook_form_FORM_ID_alter()を使用することをお勧めします。

その理由は、hook_form_alter()はすべてのフォームレンダリングで呼び出され、hook_form_FORM_ID_alter()はその特定のフォームがレンダリングされているときにのみ呼び出されるためです。

このコードを.moduleファイルに追加して、フィールドを必須にします。

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MY_MODULE_form_commerce_checkout_form_checkout_alter(&$form, &$form_state, $form_id) {
  if (!empty($form['commerce_coupon']['coupon_code'])) {
    $form['commerce_coupon']['coupon_code']['#required'] = TRUE;
  }
}
6
user72672

Implements hook_form_BASE_FORM_ID_alterですが、ユーザーがクーポンフィールド内にランダムな文字列を入力した場合、ステップを渡すことができます。

この混乱を回避するには、フォームの変更を使用してクーポンフィールドを必須にし、カスタム検証を追加してクーポンが有効かどうかを確認する必要があります。

クーポンが有効でない場合、ユーザーはステップに留まり、コマースクーポンモジュールによって提供される同じエラーメッセージを受け取ります。

私はあなたのカスタムモジュール名が '[〜#〜] custom [〜#〜]であると仮定します

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function CUSTOM_form_commerce_checkout_form_checkout_alter(&$form, &$form_state, $form_id) {
  if (!empty($form['commerce_coupon']['coupon_code'])) {
    // Set code as required.
    $form['commerce_coupon']['coupon_code']['#required'] = TRUE;
    $form['buttons']['continue']['#validate'][] = 'my_custom_coupon_validate';
  }
}

/**
 * Custom coupon validate.
 */
function my_custom_coupon_validate(&$form, &$form_state) {
  $code = $form_state['input']['commerce_coupon']['coupon_code'];
  $order = $form_state['order'];

    $coupon = commerce_coupon_redeem_coupon_code($code, $order, $error);
    if ($coupon) {
      // Reload the order so it is not out of date.
      $order = commerce_order_load($order->order_id);
      // Recalculate discounts.
      commerce_cart_order_refresh($order);
    }
    else {
      form_set_error('coupon_code',$error);
    }
}
4
Ziftman