У меня есть настройка магазина с 2 продуктами. Публичные и частные туры. Публичные туры 10 на каждую единицу.
С другой стороны, частные туры предназначены только для сбора депозита. Мне нужно, чтобы общая сумма составляла 50 долларов США независимо от выбранного количества, а остальное оплачивается на месте.
Я попытался создать собственное предложение PromotionOffer, как показано ниже. Я могу создать рекламную акцию, но, похоже, она не применяется в корзине/кассе. Я даже пытался сделать это купоном, и когда я применяю купон, он говорит, что он недействителен, возможно, срок его действия истек или он был использован. У меня есть одно условие: у них в корзине есть частный тур.
<?php
пространство имен Drupal\tour_reservation\Plugin\Commerce\PromotionOffer;
используйте Drupal\commerce_order\Adjustment;
используйте Drupal\commerce_price\Price;
используйте Drupal\commerce_promotion\Entity\PromotionInterface;
используйте Drupal\commerce_promotion\Plugin\Commerce\PromotionOffer\PromotionOfferBase;
используйте Drupal\Core\Entity\EntityInterface;
используйте Drupal\Core\Form\FormStateInterface;
/**
* Скидки на корзину до фиксированной суммы.
*
* @CommercePromotionOffer(
* id = "tour_reservation_discount_to_fixed",
* label = @Translation("Устанавливает фиксированную сумму в корзине"),
* entity_type = "commerce_order_item",
* )
*/
класс OrderFixedPrice расширяет PromotionOfferBase {
/**
* {@inheritdoc}
*/
общедоступная функция defaultConfiguration () {
возвращаться [
'сумма' => NULL,
] + parent::defaultConfiguration();
}
/**
* {@inheritdoc}
*/
общедоступная функция buildConfigurationForm (массив $ form, FormStateInterface $ form_state) {
$form += parent::buildConfigurationForm($form, $form_state);
$amount = $this->configuration['amount'];
// Ошибка в элементе формы plugin_select приводит к тому, что $amount будет неполным.
if (isset($amount) && !isset($amount['number'], $amount['currency_code'])) {
$ сумма = ПУСТО;
}
$ форма ['сумма'] = [
'#type' => 'торговая_цена',
'#title' => $this->t('Сумма'),
'#default_value' => сумма $,
'#required' => ИСТИНА,
'#description' => $this->t('Установить цену корзины. Формат: 9,99'),
];
вернуть $ форму;
}
/**
* {@inheritdoc}
*/
общедоступная функция validateConfigurationForm (массив и $ форма, FormStateInterface $ form_state) {
$values = $form_state->getValue($form['#parents']);
если ($значения['количество']['число'] < 0) {
$form_state->setError($form, $this->t('Сумма не может быть отрицательной.'));
}
}
/**
* {@inheritdoc}
*/
публичная функция submitConfigurationForm (массив и $ форма, FormStateInterface $ form_state) {
parent::submitConfigurationForm($form, $form_state);
$values = $form_state->getValue($form['#parents']);
$this->configuration['amount'] = $values['amount'];
}
/**
* {@inheritdoc}
*/
публичная функция применить (EntityInterface $entity, PromotionInterface $promotion) {
$this->assertEntity($entity);
/** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */
$order_item = $сущность;
$target_amount = $this->getAmount();
$order_item->addAdjustment(новая настройка([
'тип' => 'продвижение',
'метка' => t('Скидка'),
'сумма' => $ target_amount,
'source_id' => $ продвижение-> id(),
]));
}
/**
* Получает сумму предложения.
*
* @return \Drupal\commerce_price\Price|null
* Сумма или NULL, если она неизвестна.
*/
защищенная функция getAmount() {
if (!empty($this->configuration['amount'])) {
$amount = $this->configuration['amount'];
вернуть новую цену ($ сумма ['число'], $ сумма ['currency_code']);
}
}
}
В идеале я не хочу использовать акции, а просто корректирую цену в корзине. Любые идеи?