не учитывать скидку в акционных товаров

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

apetruniv
apetruniv
Репутация: 4
Сообщения: 31
Зарегистрирован: 25.02.2019
С нами: 5 лет 1 месяц

Сообщение #1 apetruniv » 15.11.2019, 15:48

решил эту задачу таким кодом в Okay/Core/Cart.php

Код: Выделить всё

 public function get() {
        $cart = new \stdClass();
        $cart->purchases       = [];
        $cart->total_price     = 0;
        $cart->total_products  = 0;
        $cart->coupon          = null;
        $cart->discount        = 0;
        $cart->coupon_discount = 0;
      $cart->withdisc        = 0; //моє
      $cart->isdisc          = 0; //моє
        $cart->bezdisc         = 0; //моє
        if (empty($_SESSION['shopping_cart'])) {
            return $cart;
        }

        $variants = $this->variantsEntity->find(['id' => $this->getVariantsIdsByCart($_SESSION['shopping_cart'])]);
        if (empty($variants)) {
            return $cart;
        }
       
        $variants = $this->moneyHelper->convertVariantsPriceToMainCurrency($variants);
       
        $products = $this->getProductsByVariants($variants);
        $products = $this->productsHelper->attachImages($products);

        // TODO: собирать целостно в одном методе
        $items = $this->buildItemsByVariants($variants);
        foreach($items as $variantId=>$item) {
            $purchase = null;
            if(!empty($products[$item->variant->product_id])) {
                $purchase = new \stdClass();
                $purchase->product = $products[$item->variant->product_id];
                $purchase->variant = $item->variant;
                $purchase->amount  = $item->amount;

                $purchase->product_id   = $item->variant->product_id;
                $purchase->product_name = $products[$item->variant->product_id]->name;

                $purchase->variant_id   = $item->variant->id;
                $purchase->variant_name = $item->variant->name;
                $purchase->price        = $item->variant->price;
                $purchase->sku          = $item->variant->sku;
                $purchase->units        = $item->variant->units;
            $purchase->compare_price = $item->variant->compare_price; //моє

                $purchase->meta = (object) [
                    'total_price' => $purchase->amount * $purchase->price
                ];

                $cart->purchases[] = $purchase;
                if ($purchase->compare_price){
               $cart->withdisc      += $item->variant->price*$item->amount; //сумуємо акційні
               $cart->isdisc       += 1;
               } else {
               $cart->bezdisc   += $item->variant->price*$item->amount; //сумуємо без акційні
               }   
            $cart->total_price += $item->variant->price*$item->amount;
                $cart->total_products += $item->amount;
            }
        }
       
        //TODO: В отдельный модуль
        if($this->couponCodeExists()) {
            $cart->coupon = $this->couponsEntity->get($_SESSION['coupon_code']);
            if($cart->coupon && $cart->coupon->valid && $cart->total_price >= $cart->coupon->min_order_price) {
                if($cart->coupon->type == 'absolute') {
                    // Абсолютная скидка не более суммы заказа
                    $cart->coupon_discount        = $cart->total_price>$cart->coupon->value?$cart->coupon->value:$cart->total_price;
                    $cart->total_price            = max(0, $cart->total_price-$cart->coupon->value);
                    $cart->coupon->coupon_percent = round(100-($cart->total_price*100)/($cart->total_price+$cart->coupon->value),2);
                } else {
               $cart->coupon->coupon_percent = $cart->coupon->value;
                  $cart->coupon_discount        = $cart->total_price * ($cart->coupon->value)/100;
                  $cart->total_price            = $cart->total_price-$cart->coupon_discount;
                if (!$cart->isdisc) {
                  $cart->coupon->coupon_percent = $cart->coupon->value;
                  $cart->coupon_discount        = $cart->total_price * ($cart->coupon->value)/100;
                  $cart->total_price            = $cart->total_price-$cart->coupon_discount;
               } else {
                  $cart->coupon->coupon_percent = $cart->coupon->value;
                  $cart->coupon_discount        = $cart->bezdisc * ($cart->coupon->value)/100;
                  $cart->total_price            = $cart->withdisc+$cart->bezdisc-$cart->coupon_discount;
               }
                }
            } else {
                unset($_SESSION['coupon_code']);
            }
        }


все работает до момента оформления заказа, после нажатия кнопки, открывает страницу 404 (но в адресной строке силка типу https://site.com/order/**** и письмо с пустым заказом приходит на емейл)
и все через строку $purchase->compare_price = $item->variant->compare_price;, если закомментировать то все работает как должно

что с ней не так?
может есть другой вариант как проверять что у товара есть акционная цена?

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #2 korshunov » 15.11.2019, 18:31

$purchase->compare_price - нет такого поля в таблице ok_purchases, оттого ошибка в запросе и заказ выходит без товаров...

Проверять можно честно без лишних выкрутасов if($item->variant->compare_price)

apetruniv
apetruniv
Репутация: 4
Сообщения: 31
Зарегистрирован: 25.02.2019
С нами: 5 лет 1 месяц

Сообщение #3 apetruniv » 16.11.2019, 06:44

korshunov писал(а):$purchase->compare_price - нет такого поля в таблице ok_purchases, оттого ошибка в запросе и заказ выходит без товаров...

Проверять можно честно без лишних выкрутасов if($item->variant->compare_price)
Спасибо


Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 30 гостей