Скидки и промокоды

Тема в разделе "Общие вопросы", создана пользователем xlebosolniy, 1 сен 2022.

  1. xlebosolniy

    xlebosolniy Новичок

    Сообщения:
    10
    Симпатии:
    0
    Здравствуйте. Есть две скидки - персональная (накопительная), которая выдается за количество покупок и по промокоду. Если применять одну из скидок (только персональная или промокод), то нормально переходит к оплате на страницу Сбербанка, а если применяется две скидки - персональная + промокод, то переход идет просто на белую страницу и ссылка выглядит так: /index.php?route=payment/rbs/payment. Используется такой модуль:
    [​IMG]

    Для оформления заказа используется модуль Simple

    Нашел вот такой файл, который отвечает за показ страницы оформления заказа, где и применяются/вводятся промокоды (catalog/view/theme/shop/template/checkout/simplecheckout_cart.tpl)

    В нем есть такой код (форма ввода промокода):
    PHP:
    <div class="coupons">
                <?php if (isset($modules['coupon'])) { ?>
                    <div class="simplecheckout-cart-coupon">
                        <input type="text" data-onchange="reloadAll" class="cpupon" name="coupon" placeholder="<?php echo $entry_coupon?>" value="<?php echo $coupon?>" />
                        <button data-onclick="reloadAll" class="" type="submit">Применить</button>
                    </div>
                <?php ?>
                <?php if (isset($modules['voucher'])) { ?>
                    <div class="simplecheckout-cart-coupon">
                        <input type="text" name="voucher" class="cpupon" data-onchange="reloadAll" placeholder="<?php echo $entry_voucher?>" value="<?php echo $voucher?>" />
                        <button data-onclick="reloadAll" class="" type="submit">Применить</button>
                    </div>
                <?php ?>
            </div>
    Пробую сделать так, если уже посчитана скидка (персональная автоматически применяется), то скрывать форму:
    PHP:
    <?php if ($totals) { ?>
        <div class="coupons" style="display:none;"></div>
        <?php } else { ?>
            <div class="coupons" style="display:block;">
                <?php if (isset($modules['coupon'])) { ?>
                    <div class="simplecheckout-cart-coupon">
                        <input type="text" data-onchange="reloadAll" class="cpupon" name="coupon" placeholder="<?php echo $entry_coupon?>" value="<?php echo $coupon?>" />
                        <button data-onclick="reloadAll" class="" type="submit">Применить</button>
                    </div>
                <?php ?>
                <?php if (isset($modules['voucher'])) { ?>
                    <div class="simplecheckout-cart-coupon">
                        <input type="text" name="voucher" class="cpupon" data-onchange="reloadAll" placeholder="<?php echo $entry_voucher?>" value="<?php echo $voucher?>" />
                        <button data-onclick="reloadAll" class="" type="submit">Применить</button>
                    </div>
                <?php ?>
            </div>
            <?php ?>
    И вроде как работает, но как я понимаю $totals - отвечает за общую сумму покупки, а так как она > 0, форма скрывается. Подскажите, пожалуйста, может быть кто знает как решить в целом эту проблему или значение, которое отвечает за вывод суммы скидки, чтобы подставить в свое решение?

    Версия ocStore 1.5.5.1.2
     
  2. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Честно говоря, сложно сказать. Но вывод это еще не подсчет. Скажем, ввели промокод, а затем добавили скидку (сделали что-то, чтобы скидка применилась), в таком случае у вас скроется отображение купона, но в корзине-то по прежнему будет применен купон.

    Тут так же вопрос, а чем у вас реализована накопительная скидка.
     
    xlebosolniy нравится это.
  3. xlebosolniy

    xlebosolniy Новичок

    Сообщения:
    10
    Симпатии:
    0
    Вообще выглядит система так:
    Если есть накопительная скидка, то она сразу применяется как только переходишь к оформлению заказа и её никак человек не может ни убрать и ни добавить. А промокод можно ввести только если он есть, ну и не часто эти промокоды раздаются. Так как модуль оплаты почему-то не хочет нормально переходить на страницу оплаты когда применяется и накопительная и промокод, то хотя бы такую заглушку сделать, что если есть уже накопительная скидка (она применяется автоматом в любом случае), то скрывать ввод поля промокода.

    Есть вот такой модуль, но не знаю это стандартный или установленный и авторство найти не могу на него.

    В ссылке вот такой вот путь: admin/index.php?route=total/discount в catalog/controller/module не могу ничего найти связанного с этим модулем.

    Но вот в оформлении заказа (simplecheckout_cart.tpl) есть вывод суммы скидки под кодом ввода промокода из 1 поста
    PHP:
    <div class="simplecheckout-cart-sum" id="total_sub_total">
                <?php foreach ($totals as $total) { ?>
                    <?php if ($total['code'] == 'voucher') { ?>
                        <div class="one_total" id="total_<?php echo $total['code']; ?>">
                            <span><?php echo $total['title']; ?>:</span>
                            <span class="simplecheckout-cart-total-value"><?php echo $total['text']; ?> <span>р</span></span>
                            <span data-onclick="removeVoucher" class="remove-icon"></span>
                        </div>
                    <?php } elseif ($total['code'] == 'coupon') { ?>
                        <div class="one_total" id="total_<?php echo $total['code']; ?>">
                            <span><?php echo $total['title']; ?>:</span>
                            <span class="simplecheckout-cart-total-value"><?php echo $total['text']; ?> <span>р</span></span>
                            <span data-onclick="removeCoupon" class="remove-icon"></span>
                        </div>
                    <?php } elseif ($total['code'] == 'total') { ?>
                        <div class="one_total" id="total_<?php echo $total['code']; ?>">
                            <div class="summ">
                                <span class="title"><?php echo $total['title']; ?>:</span>
                                <span class="simplecheckout-cart-total-value"><?php echo $total['text']; ?> <span>р</span></span>
                            </div>
                        </div>
                    <?php } else if ($total['code'] == 'sub_total' && count($totals) > 2) { ?>
                        <div class="one_total" id="total_<?php echo $total['code']; ?>">
                            <span><?php echo $total['title']; ?>:</span>
                            <span class="simplecheckout-cart-total-value"><?php echo $total['text']; ?> <span>р</span></span>
                        </div>
                    <?php } else if ($total['code'] != 'sub_total') { ?>
                        <div class="one_total" id="total_<?php echo $total['code']; ?>">
                            <span><?php echo $total['title']; ?>:</span>
                            <span class="simplecheckout-cart-total-value"><?php echo $total['text']; ?> <span>р</span></span>
                        </div>
                    <?php ?>
                <?php ?>
            </div>
    voucher и coupon это то что вводится, не понимаю в чем отличие, но это точно не персональная скидка, так как их можно удалить (class="remove-icon")
     
  4. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Так а вы смотрели код $total['code'] у вашего модуля скидок? Например, можно вывести с помощью var_dump($totals). Естественно без клиентов.

    И соответственно смотреть, если в строчках присутствует скидка, то не выводить купон

    Что-то в стиле:

    PHP:
    <?php
        $is_have_disc 
    false;
        foreach (
    $totals as $total) {
            if (
    $total['code'] == '[ТУТ КОД МОДУЛЯ]') {
                
    $is_have_disc true;
            }
        }
    ?>
    <?php 
    foreach ($totals as $total) { ?>
        .............
        <?php } elseif ($total['code'] == 'coupon' && !$is_have_disc) { ?>
            <div class="one_total" id="total_<?php echo $total['code']; ?>">
                <span><?php echo $total['title']; ?>:</span>
                <span class="simplecheckout-cart-total-value"><?php echo $total['text']; ?> <span>р</span></span>
                <span data-onclick="removeCoupon" class="remove-icon"></span>
            </div>
        .............
    Конечно, это больше подпорка, но все же.
     
    Последнее редактирование: 2 сен 2022
    xlebosolniy нравится это.
  5. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Вообще, конечно вопрос почему у вас слетает комбинация "скидка и купон", но это смотреть нужно
     
    xlebosolniy нравится это.
  6. xlebosolniy

    xlebosolniy Новичок

    Сообщения:
    10
    Симпатии:
    0
    Спасибо, буду копать)

    Изначально просто перекидывало не на страницу Эквайринга, а сюда /index.php?route=payment/rbs/payment и открывалась просто белая страница когда переходишь к оплате, но сейчас применяю купон + скидку стало выдавать ошибки, хотя никаких изменений еще не вносил.

    Если можете, подскажите, пожалуйста, как это исправить

    Undefined offset: -1 in /public_html/system/library/rbs_discount.php on line 72
    PHP:
    private function splitPosition($mode$indexSeparate) {
            
    $newIndex count($this->arrOrder['basket']);
         
    72 СТРОКА $separatePosition $this->arrOrder['basket'][$indexSeparate];

            if( 
    $mode === 'onePosition' ) {
                
    $this->arrOrder['basket'][$indexSeparate]['count'] = $this->transformNumber$separatePosition['count'] - 1,);
                
    array_push$this->arrOrder['basket'], $separatePosition );
                
    $this->equalPosition $newIndex;
                
    $this->arrOrder['basket'][$newIndex] = $separatePosition;
                
    $this->arrOrder['basket'][$newIndex]['count'] = 1;
            } else if( 
    $mode === 'fractionPosition' ) {
                
    $needPositionPrice $this->transformNumber$separatePosition['priceDiscount'] + $this->faultPrice );
                
    $originalCount $separatePosition['count'];
                
    $success false;
                
    $vishPrice $this->transformNumber$needPositionPrice $originalCount );

                
    $separateObject = array();
                
    $separateObject['needSumm'] = $needPositionPrice;
                
    $separateObject['oldPositionCount'] =  $this->transformNumber($originalCount 2);
                
    $separateObject['newPositionCount'] = $this->transformNumber($originalCount $separateObject['oldPositionCount'],3);


                for (
    $toIndex 0$toIndex 5$toIndex++) {
                    
    $separateObject['oldPositionCount'] = $this->transformNumber$separateObject['oldPositionCount'] - 0.0013) ;
                    
    $separateObject['newPositionCount'] = $this->transformNumber$separateObject['newPositionCount'] + 0.001);
                    
    $separateObject['oldPositionPrice'] = $this->transformNumber$separateObject['oldPositionCount'] * $vishPrice );
                    
    $separateObject['newPositionPrice'] = $this->transformNumber$separateObject['newPositionCount'] * $vishPrice );
                    
    $separateObject['oldPositionVishPrice'] = $this->transformNumber$separateObject['oldPositionPrice'] / $separateObject['oldPositionCount'] );
                    
    $separateObject['newPositionVishPrice'] = $this->transformNumber$separateObject['newPositionPrice'] / $separateObject['newPositionCount'] );
                    
    $separateObject['recountSumm'] = $this->transformNumber$separateObject['oldPositionPrice'] + $separateObject['newPositionPrice']);
                    if(
    $separateObject['recountSumm'] == $separateObject['needSumm']) {
                        
    $success true;
                        break;
                    }
                }
                if( !
    $success ) {
                    
    $res $this->transformNumber(($separateObject['newPositionPrice'] - ($separateObject['recountSumm']-$separateObject['needSumm'])) / $separateObject['newPositionCount']);
                    
    $separateObject['newPositionPrice'] = $this->transformNumber$res $separateObject['newPositionCount'] );
                    
    $separateObject['recountSumm'] = $this->transformNumber$separateObject['oldPositionPrice']+$separateObject['newPositionPrice'] );
                    if( 
    $separateObject['recountSumm'] === $separateObject['needSumm'] ) { $success true;}
                }
                if( 
    $success ) {
                    
    $separatePosition['count'] = $separateObject['oldPositionCount'];
                    
    $separatePosition['priceBaseDiscount'] = $separateObject['oldPositionVishPrice'];
                    
    $separatePosition['priceAmount'] = $this->transformNumber$separatePosition['count'] * $separatePosition['priceBase'] );
                    
    $separatePosition['priceDiscount'] = $separateObject['oldPositionPrice'];
                    
    $separatePosition['discount'] = $this->transformNumber$separatePosition['priceAmount'] - $separatePosition['priceDiscount'] );
                    
    $this->arrOrder['basket'][$indexSeparate] = $separatePosition;
                    
    array_push($this->arrOrder['basket'], $separatePosition);

                    
    $newPosition $this->arrOrder['basket'][$newIndex];
                    
    $newPosition['count'] = $separateObject['newPositionCount'];
                    
    $newPosition['priceAmount'] = $this->transformNumber$newPosition['count'] * $newPosition['priceBase'] );
                    
    $newPosition['priceBaseDiscount'] = $separateObject['newPositionVishPrice'];
                    
    $newPosition['priceDiscount'] = $separateObject['newPositionPrice'];
                    
    $newPosition['discount'] = $this->transformNumber$newPosition['priceAmount'] - $newPosition['priceDiscount'] );
                    
    $this->arrOrder['basket'][$newIndex] = $newPosition;

                } else {

                }

            }
        }

    Cannot modify header information - headers already sent by (output started at /public_html/index.php:109) in /home/t/tkaniblago/tkani-blago.ru/public_html/system/library/response.php on line 12

    PHP:
    if ($config->get('config_error_display')) {
            
    109 СТРОКА - echo '<b>' $error '</b>: ' $errstr ' in <b>' $errfile '</b> on line <b>' $errline '</b>';
        }
       
        if (
    $config->get('config_error_log')) {
            
    $log->write('PHP ' $error ':  ' $errstr ' in ' $errfile ' on line ' $errline);
        }
    PHP:
    public function redirect($url) {
           
    12 СТРОКА header('Location: ' $url);
            exit;
        }
     
  7. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Undefined offset: -1 in /public_html/system/library/rbs_discount.php on line 72

    - тут индекс некорректный в функцию передается. Т.е. нужно смотреть полный стек ошибки, какая функция до этого ее вызывала.

    Cannot modify header information - headers already sent by (output started at /public_html/index.php:109) in /home/t/tkaniblago/tkani-blago.ru/public_html/system/library/response.php on line 12

    - это попытка сделать редирект страницы, но уже после того, как был добавлен заголовок. Некорректно код выполняется