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ư 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ư 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);
}
}
}
}