Puncte:0

Ajustați prețul total la finalizarea comerțului

drapel in

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?

drapel cn
Acestea sunt tipuri diferite de produse? Aș face două tipuri de produse, publice care au oricare ar fi prețul și private care sunt gratuite. Apoi adăugați ceva logică pentru a vă asigura că nu aveți ambele tipuri în coș simultan. Apoi adăugați depozitul ca taxă de „livrare” pentru produsele private.
drapel in
Ar putea funcționa și asta. Cred că voi limita doar cantitatea de tururi private la 1, dar totuși voi salva numărul de oaspeți. Am folosit această soluție https://drupal.stackexchange.com/a/271556/26823

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.