Am un magazin cu 2 produse. Tururi publice și private. Tururile publice sunt 10 pentru fiecare unitate.
Pe de altă parte, tururile private sunt menite doar să colecteze un depozit. Am nevoie ca totalul să fie de 50 USD, indiferent de cantitatea selectată, iar restul se plătește la fața locului.
Am încercat să creez o ofertă de promovare personalizată, așa cum se vede mai jos. Pot crea promoția, dar nu pare să se aplice în timp ce sunt în coș/checkout. Am încercat chiar să-i fac un cupon și când aplic cuponul spune că nu este valabil, poate a expirat sau a fost folosit. Am o condiție stabilită și anume că au un tur privat în cărucior.
<?php
spațiu de nume Drupal\tour_reservation\Plugin\Commerce\PromotionOffer;
utilizați Drupal\commerce_order\Adjustment;
utilizați Drupal\commerce_price\Price;
utilizați Drupal\commerce_promotion\Entity\PromotionInterface;
utilizați Drupal\commerce_promotion\Plugin\Commerce\PromotionOffer\PromotionOfferBase;
utilizați Drupal\Core\Entity\EntityInterface;
utilizați Drupal\Core\Form\FormStateInterface;
/**
* Reduceri la un coș până la o sumă fixă.
*
* @CommercePromotionOffer(
* id = "tour_reservation_discount_to_fixed",
* label = @Translation ("Setează totalul coșului la o sumă fixă"),
* entity_type = "commerce_order_item",
* )
*/
clasa OrderFixedPrice extinde PromotionOfferBase {
/**
* {@inheritdoc}
*/
funcția publică defaultConfiguration() {
întoarcere [
'amount' => NULL,
] + parent::defaultConfiguration();
}
/**
* {@inheritdoc}
*/
funcția publică buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form += parent::buildConfigurationForm($form, $form_state);
$amount = $this->configuration['suma'];
// O eroare în elementul de formular plugin_select face ca $amount să fie incomplet.
if (isset($amount) && !isset($amount['number'], $amount['currency_code'])) {
$cant = NULL;
}
$form['suma'] = [
'#type' => 'commerce_price',
'#title' => $this->t('Suma'),
'#default_value' => $amount,
'#required' => TRUE,
'#description' => $this->t('Setați prețul coșului. Format: 9,99'),
];
returnează $form;
}
/**
* {@inheritdoc}
*/
funcția publică validateConfigurationForm(matrice &$form, FormStateInterface $form_state) {
$valori = $form_state->getValue($form['#parinti']);
dacă ($valori['amount']['number'] < 0) {
$form_state->setError($form, $this->t('Suma nu poate fi negativă.'));
}
}
/**
* {@inheritdoc}
*/
funcția publică submitConfigurationForm(matrice &$form, FormStateInterface $form_state) {
parent::submitConfigurationForm($form, $form_state);
$valori = $form_state->getValue($form['#parinti']);
$this->configuration['amount'] = $values['amount'];
}
/**
* {@inheritdoc}
*/
funcția publică aplica (EntityInterface $entity, PromotionInterface $promoție) {
$this->assertEntity($entity);
/** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */
$articol_comanda = $entitate;
$target_amount = $this->getAmount();
$order_item->addAdjustment(nouă ajustare([
'type' => 'promovare',
'label' => t('Reducere'),
'amount' => $target_amount,
'source_id' => $promotion->id(),
]));
}
/**
* Primește suma ofertei.
*
* @return \Drupal\commerce_price\Price|null
* Suma, sau NULL dacă nu este cunoscută.
*/
funcția protejată getAmount() {
if (!empty($this->configuration['amount'])) {
$amount = $this->configuration['suma'];
returnează prețul nou ($amount['number'], $amount['currency_code']);
}
}
}
În mod ideal, nu vreau să folosesc promoții și mai degrabă să ajustez prețul din coș. Vreo idee?