Здравствуйте. Есть две скидки - персональная (накопительная), которая выдается за количество покупок и по промокоду. Если применять одну из скидок (только персональная или промокод), то нормально переходит к оплате на страницу Сбербанка, а если применяется две скидки - персональная + промокод, то переход идет просто на белую страницу и ссылка выглядит так: /index.php?route=payment/rbs/payment. Используется такой модуль: Для оформления заказа используется модуль 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
Честно говоря, сложно сказать. Но вывод это еще не подсчет. Скажем, ввели промокод, а затем добавили скидку (сделали что-то, чтобы скидка применилась), в таком случае у вас скроется отображение купона, но в корзине-то по прежнему будет применен купон. Тут так же вопрос, а чем у вас реализована накопительная скидка.
Вообще выглядит система так: Если есть накопительная скидка, то она сразу применяется как только переходишь к оформлению заказа и её никак человек не может ни убрать и ни добавить. А промокод можно ввести только если он есть, ну и не часто эти промокоды раздаются. Так как модуль оплаты почему-то не хочет нормально переходить на страницу оплаты когда применяется и накопительная и промокод, то хотя бы такую заглушку сделать, что если есть уже накопительная скидка (она применяется автоматом в любом случае), то скрывать ввод поля промокода. Есть вот такой модуль, но не знаю это стандартный или установленный и авторство найти не могу на него. В ссылке вот такой вот путь: 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")
Так а вы смотрели код $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> ............. Конечно, это больше подпорка, но все же.
Спасибо, буду копать) Изначально просто перекидывало не на страницу Эквайринга, а сюда /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,3 ); 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, 3 ); $separateObject['newPositionCount'] = $this->transformNumber($originalCount - $separateObject['oldPositionCount'],3); for ($toIndex = 0; $toIndex < 5; $toIndex++) { $separateObject['oldPositionCount'] = $this->transformNumber( $separateObject['oldPositionCount'] - 0.001, 3) ; $separateObject['newPositionCount'] = $this->transformNumber( $separateObject['newPositionCount'] + 0.001, 3 ); $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; }
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 - это попытка сделать редирект страницы, но уже после того, как был добавлен заголовок. Некорректно код выполняется