Ich habe ein Einlösungsformular, in das ich einen Gutscheincode eingeben möchte. Anschließend sollte automatisch eine Bestellung erstellt werden. Anschließend wird der Gutscheincode auch auf die Bestellung angewendet.
Die Bestellung wird erfolgreich erstellt, $promotion->apply($order)
funktioniert aber nicht.
Wie Sie im Bild oben sehen können, habe ich eine Aktion mit Gutscheincode Z-8FDA5A218B44
. Im Bedingungsbereich ist diese Aktion auf ein Produkt namens beschränkt Monthly
.
Ich möchte ein Einlösungsformular erstellen, in dem, wenn ein Benutzer einen Gutscheincode eingibt, automatisch eine Bestellung und ein Bestellartikel erstellt werden, der mein Produkt enthält (monatlich). (Bild unten)
Wie Sie sehen können, wenn ich das Einlösungsformular mit einem Gutscheincode abschicke, wird eine Bestellung erstellt, aber ich möchte den Gutscheincode auch auf die Bestellung anwenden.
Hier ist mein Code:
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);
}
}
}
}