Рейтинг:0

Отрегулируйте общую цену в коммерческом оформлении

флаг in

У меня есть настройка магазина с 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']);
    }
  }

}

В идеале я не хочу использовать акции, а просто корректирую цену в корзине. Любые идеи?

флаг cn
Это разные типы продуктов? Я бы сделал два типа продуктов: публичный, который имеет любую цену, и частный, который бесплатен. Затем добавьте немного логики, чтобы убедиться, что у вас нет обоих типов в корзине одновременно. Затем добавьте депозит в качестве платы за «доставку» для частных продуктов.
флаг in
Это тоже может сработать. Я думаю, что просто ограничу количество частных туров до 1, но при этом сэкономлю количество гостей. Я использовал это решение https://drupal.stackexchange.com/a/271556/26823.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.