Tôi có một thiết lập cửa hàng với 2 sản phẩm. Các tour du lịch công cộng và tư nhân. Các tour du lịch công cộng là 10 cho mỗi đơn vị.
Mặt khác, các tour du lịch tư nhân chỉ nhằm mục đích thu tiền đặt cọc. Tôi cần tổng số tiền là 50 đô la bất kể số lượng đã chọn và phần còn lại được thanh toán tại chỗ.
Tôi đã thử tạo Khuyến mại tùy chỉnh như bên dưới. Tôi có thể tạo khuyến mãi nhưng có vẻ như nó không áp dụng trong giỏ hàng/thanh toán. Tôi thậm chí đã thử biến nó thành một phiếu giảm giá và khi tôi áp dụng phiếu giảm giá, nó báo rằng nó không hợp lệ, có thể đã hết hạn hoặc đã được sử dụng. Tôi đặt ra một điều kiện và đó là họ có một chuyến tham quan riêng trong giỏ hàng của họ.
<?php
không gian tên Drupal\tour_reservation\Plugin\Commerce\PromotionOffer;
sử dụng Drupal\commerce_order\Adjustment;
sử dụng Drupal\commerce_price\Price;
sử dụng Drupal\commerce_promotion\Entity\PromotionInterface;
sử dụng Drupal\commerce_promotion\Plugin\Commerce\PromotionOffer\PromotionOfferBase;
sử dụng Drupal\Core\Entity\EntityInterface;
sử dụng Drupal\Core\Form\FormStateInterface;
/**
* Giảm giá một giỏ hàng đến một số tiền cố định.
*
* @C CommercePromotionOffer(
* id = "tour_reservation_discount_to_fixed",
* label = @Translation("Đặt tổng số giỏ hàng thành một số tiền cố định"),
* entity_type = "thương_mại_đơn_hàng_mặt_hàng",
* )
*/
lớp OrderFixedPrice mở rộng PromotionOfferBase {
/**
* {@inheritdoc}
*/
hàm công khai defaultConfiguration() {
trở lại [
'số tiền' => NULL,
] + cha mẹ::defaultConfiguration();
}
/**
* {@inheritdoc}
*/
chức năng công khai buildConfigurationForm(mảng $form, FormStateInterface $form_state) {
$form += parent::buildConfigurationForm($form, $form_state);
$amount = $this->configuration['amount'];
// Một lỗi trong phần tử biểu mẫu plugin_select khiến $amount không đầy đủ.
if (isset($amount) && !isset($amount['number'], $amount['currency_code'])) {
số tiền $ = NULL;
}
$form['số tiền'] = [
'#type' => 'commerce_price',
'#title' => $this->t('Số tiền'),
'#default_value' => $amount,
'#required' => ĐÚNG,
'#description' => $this->t('Đặt giá giỏ hàng. Định dạng: 9,99'),
];
trả về biểu mẫu $;
}
/**
* {@inheritdoc}
*/
hàm công khai validateConfigurationForm(mảng &$form, FormStateInterface $form_state) {
$values = $form_state->getValue($form['#parents']);
if ($values['amount']['number'] < 0) {
$form_state->setError($form, $this->t('Số tiền không được âm.'));
}
}
/**
* {@inheritdoc}
*/
hàm công khai submitConfigurationForm(mảng &$form, FormStateInterface $form_state) {
cha mẹ::submitConfigurationForm($form, $form_state);
$values = $form_state->getValue($form['#parents']);
$this->configuration['amount'] = $values['amount'];
}
/**
* {@inheritdoc}
*/
áp dụng hàm công khai(EntityInterface $entity, PromotionInterface $promotion) {
$this->assertEntity($entity);
/** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */
$order_item = $entity;
$target_amount = $this->getAmount();
$order_item->addAdjustment(Điều chỉnh mới([
'loại' => 'khuyến mãi',
'nhãn' => t('Giảm giá'),
'số tiền' => $ target_amount,
'source_id' => $promotion->id(),
]));
}
/**
* Nhận số tiền cung cấp.
*
* @return \Drupal\commerce_price\Price|null
* Số tiền, hoặc NULL nếu không biết.
*/
chức năng được bảo vệ getAmount() {
if (!empty($this->configuration['amount'])) {
$amount = $this->configuration['amount'];
trả lại Giá mới($amount['number'], $amount['currency_code']);
}
}
}
Lý tưởng nhất là tôi không muốn sử dụng các chương trình khuyến mãi và thay vào đó chỉ cần điều chỉnh giá trong giỏ hàng. Bất kỳ ý tưởng?