クーポンコードを入力したいので、注文は自動的に作成され、クーポンコードも注文に適用されます。
注文は正常に作成されますが、$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