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);
}
}
}
}
Antworten:
Hallo, ich bin vielleicht TLTTP, aber es scheint, dass Ihre Implementierung richtig ist (vorausgesetzt, Sie sagen, sie besteht die verfügbaren und wendet Prüfungen an). Ich denke, das Problem ist, dass Sie die Bestellung nicht speichern, nachdem die Aktion angewendet wurde.
Auch als @ matt-glaman schlägt vor , sollten Sie aktualisieren den Auftrag so der Endpreis aktualisiert wird.
quelle