$ khuyến mãi-> áp dụng ($ order) không hoạt động


6

Tôi có một hình thức đổi quà mà tôi muốn nhập mã phiếu giảm giá và sau đó một đơn hàng sẽ được tạo tự động, sau đó mã phiếu giảm giá cũng được áp dụng cho đơn đặt hàng.

Đơn hàng được tạo thành công nhưng $promotion->apply($order)không hoạt động.

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy trong hình trên, tôi có một chương trình khuyến mãi có chứa mã phiếu giảm giá Z-8FDA5A218B44. Trong phần điều kiện, chương trình khuyến mãi này được giới hạn trong một sản phẩm được gọi là Monthly.

Tôi muốn tạo một hình thức đổi quà, trong đó khi người dùng nhập mã phiếu giảm giá, một đơn đặt hàng và một mục đặt hàng có chứa sản phẩm của tôi (Hàng tháng) sẽ được tạo tự động. (bức tranh dưới đây)

nhập mô tả hình ảnh ở đây Như bạn có thể thấy khi tôi gửi biểu mẫu quy đổi bằng mã phiếu giảm giá, một đơn hàng sẽ được tạo, nhưng tôi cũng muốn áp dụng mã phiếu giảm giá cho đơn đặt hàng.

Đây là mã của tôi:

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
Có phải nó không thành công do kiểm tra có sẵn và áp dụng, không thực sự áp dụng? Ngoài ra, hãy thử thiết lập làm mới trên tải tiếp theo, để chạy lại làm mới
Matt Glaman

Kính gửi @MattGlaman, cả có sẵn và áp dụng đều được thông qua. Và bạn có ý nghĩa gì về làm mới?
Iman Kiani

Câu trả lời:


1

Xin chào Tôi có thể là TLTTP nhưng có vẻ như việc triển khai của bạn là đúng (giả sử như bạn nói nó vượt qua các kiểm tra có sẵnáp dụng ). Vấn đề tôi nghĩ là bạn không lưu đơn hàng sau khi chương trình khuyến mãi được áp dụng.

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

Cũng như @ matt-glaman đề nghị bạn nên làm mới đơn hàng để giá cuối cùng được cập nhật.

...
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();
}
...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.