$ promotion-> apply($ order)が機能しない


6

クーポンコードを入力したいので、注文は自動的に作成され、クーポンコードも注文に適用されます。

注文は正常に作成されますが、$promotion->apply($order)機能しません。

ここに画像の説明を入力してください

上の画像にあるように、クーポンコードを含むプロモーションがありますZ-8FDA5A218B44。条件セクションでは、このプロモーションはと呼ばれる製品に限定されていますMonthly

ユーザーがクーポンコードを入力すると、注文と、私の製品(月次)を含む注文アイテムが自動的に作成される引き換えフォームを作成したいと思います。(下の写真)

ここに画像の説明を入力してください クーポンコードを含むクーポン利用フォームを送信するとわかるように、注文が作成されますが、注文にもクーポンコードを適用したいと思います。

これが私のコードです:

namespace Drupal\my_subscription\Form;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountProxy;
use Drupal\commerce_product\Plugin\Commerce\Condition\OrderItemProduct as OrderItemProductCondition;
use Drupal\commerce_order\Entity\Order;
use Drupal\commerce_product\Entity\ProductVariation;


/**
 * Class RedemptionForm.
 *
 * @package Drupal\my_subscription\Form
 */
class RedemptionForm extends FormBase {

  /**
   * Drupal\Core\Session\AccountProxy definition.
   *
   * @var \Drupal\Core\Session\AccountProxy
   */
  protected $currentUser;

  public function __construct(
    AccountProxy $current_user
  ) {
    $this->currentUser = $current_user;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('current_user')
    );
  }


  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'meditation_redemption_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['coupon_code'] = [
      '#type' => 'textfield',
      '#title' => t('Coupon code'),
      '#description' => t('Enter your coupon code to redeem a promotion.'),
    ];

    $form['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Submit'),
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    $coupon_code = $form_state->getValue('coupon_code');
    /** @var \Drupal\commerce_promotion\CouponStorageInterface $coupon_storage */
    $coupon_storage = \Drupal::entityTypeManager()->getStorage('commerce_promotion_coupon');

    $coupon = $coupon_storage->loadByCode($coupon_code);
    if (empty($coupon)) {
      $form_state->setErrorByName('coupon_code', t('The provided coupon code is invalid.'));
      return;
    }
    else {
      $form_state->set('coupon', $coupon);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    /** @var \Drupal\commerce_promotion\Entity\Coupon $coupon */
    $coupon = $form_state->get('coupon');
    /** @var \Drupal\commerce_promotion\Entity\Promotion $promotion */
    $promotion = $coupon->getPromotion();

    $conditions = $promotion->getConditions();
    if ($conditions[0] instanceof OrderItemProductCondition) {
      $uid = $this->currentUser->id();

      $configuration = $conditions[0]->getConfiguration();
      $subscription_product_id = $configuration['products'][0]['product_id'];

      $subscription = ProductVariation::load($subscription_product_id);

      $order_item_storage = \Drupal::entityManager()->getStorage('commerce_order_item');

      $order_item = $order_item_storage->createFromPurchasableEntity($subscription, [
        'quantity' => 1,
      ]);

      /** @var \Drupal\commerce_order\Entity\Order $order */
      $order = Order::create([
        'type' => 'default',
      ]);
      $order->addItem($order_item);
      $order->setCustomerId($uid);
      $order->set('store_id', 1);
      $order->save();
      ///** @var  \Drupal\commerce_ORDER\OrderAssignment $order_assignment */
      //$order_assignment = \Drupal::service('commerce_order.order_assignment');
      //$order_assignment->assign($order, $account);

      if ($coupon->available($order) && $promotion->applies($order)) {
        $promotion->apply($order);
      }
    }

  }

}

2
利用可能で適用されるチェックが原因で失敗しているか、実際に適用されていないか?また、次のロード時にリフレッシュを設定して、リフレッシュを再実行してみてください
Matt Glaman

@MattGlaman様、利用可能と適用の両方が渡されます。そして、リフレッシュとはどういう意味ですか?
イマンキアニ2017

回答:


1

こんにちは私は多分TLTTPですが、あなたの実装は正しいようです(あなたが言うように、それが利用可能であり、チェックを適用していると仮定します)。問題は、プロモーションが適用された後に注文を保存しないことです。

...
if ($coupon->available($order) && $promotion->applies($order)) {
    $promotion->apply($order);
    $order->save();
}
...

また、@ matt-glamanが 提案するように、最終価格が更新されるように注文を更新する必要があります。

...
if ($coupon->available($order) && $promotion->applies($order)) {
    $promotion->apply($order);
    // Recalculates total price of the order including any adjustment
    // to the order or it's order items.
    $order->recalculateTotalPrice();
    // Persist any changes applied to the order.
    $order->save();
}
...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.