Jump to content
Sign in to follow this  
SiteNNPro

Вывод скидки и старой цены в корзину и письма покупателю и менеджеру

Recommended Posts

Доброго времени суток.

Есть такая штука, как скидка на определенные позиции. В списке товаров и карточке показывается старая цена, скидка и новая цена.

Так вот. Эти данные нужно поместить в таблицу в корзине и еще плюсом добавить в письма покупателю и менеджеру.

Перерыл и перепробовал уйму всего, но так и не нашел, где взять эти переменные и как их передать.

Может, кто делал? Подскажите, плиз.

 

ocStore 1.5.5.1.1

 

Share this post


Link to post
Share on other sites

Добрый день.

Т.к. тема в разделе для разработчиков, опишу основной алогоритм.

 

Реализация для корзины:

1) В либе корзины сохраняете цену товара до применения скидок и акций

2) В коде отдачи данных о товаре доавляете перменную old_price (название для примера). Если цена равна цене после обработки скидок и акций, то возвращаете false.

3) В контроллере корзины обрабатываете переменную из либы корзины. Если там не false, то готовите форматированную цену, иначе отаёте false

4) В шаблоне корзины, если не false, то выводите старую цену.

5) Profit.

 

Реализация для писем:

1,2) Уже готово из предыдущего пункта.

3) Принимаем старую цену в контроллере письма. Если не false, то готовим строчное представление цены, иначе возвращаем false.

4) В шаблоне письма выводим старую цену. если она не false.

5) Profit.

 

 

Share this post


Link to post
Share on other sites

mpn2005, и надо было Вам засорять мозг человека, своими fal_сами...
 

SiteNNPro,

# Добавить акции в письмо покупателю
# catalog/model/checkout/order.php

# находим
$template->data['products'][] = array(
# добавляем выше
$product_special_query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product['product_id'] . "' AND customer_group_id = '" . (int)$order_info['customer_id'] . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");

if ($product_special_query->num_rows) {
$special = $this->currency->format($product_special_query->row['price'] + ($this->config->get('config_tax') ? $product['tax'] : 0), $order_info['currency_code'], $order_info['currency_value']);
} else {
$special = 0;
}

# после $template->data['products'][] найти
'quantity' => $product['quantity'],
# добавляем ниже
'special'=> $special,
  
# catalog/view/theme/*/template/mail/order.tpl
# найти
<td style="font-size: 12px; border-right: 1px solid #DDDDDD; border-bottom: 1px solid #DDDDDD; text-align: right; padding: 7px;"><?php echo $product['price']; ?></td>
# заменить
<td style="font-size: 12px; border-right: 1px solid #DDDDDD; border-bottom: 1px solid #DDDDDD; text-align: right; padding: 7px;">
<?php if (!$product['special']) { ?>
<?php echo $product['price']; ?>
<?php } else { ?>
<s style="color: red"><?php echo $product['price']; ?></s> <?php echo $product['special']; ?>
<?php } ?>
</td>
  
# Для вывода акции товара в корзине делается по такому же принципу, только все манипуляции проводятся в файле
# system/library/cart.php
# в этом файле, в функции getProduct определяем цену акции, записываем в массив
# catalog/controller/checkout/cart.php
# в функции index в цикле $this->cart->getProducts, добавляем в массив цену акции и выводим в шаблоне
  

 

Share this post


Link to post
Share on other sites
10 минут назад, Designer сказал:

mpn2005, и надо было Вам засорять мозг человека, своими fal_сами...

 

Обязательно.

 

Т.к. ваше:

'special' 	 => $this->currency->format($special + ($this->config->get('config_tax') ? $product['tax'] : 0), $order_info['currency_code'], $order_info['currency_value']),

При отсутствии акции выведет '0 руб'

Т.к. $special у вас будет = 0

 

И в шаблоне не отработает:

<?php if (!$product['special']) { ?>

Т.к. там не пустая строка '0 руб'

Share this post


Link to post
Share on other sites

И нет смысла делать лиший запрос в

catalog/model/checkout/order.php

Т.к. там все данные достаются из корзины getProducts. И более правильный вариант - это реализовать на уровне корзины.

И просто забирать данные из нужного поля.

 

Share this post


Link to post
Share on other sites

mpn2005, ага, поправил.

Share this post


Link to post
Share on other sites
Только что, mpn2005 сказал:

И нет смысла делать лиший запрос в

catalog/model/checkout/order.php

Т.к. там все данные достаются из корзины getProducts. И более правильный вариант - это реализовать на уровне корзины.

И просто забирать данные из нужного поля.

 

 

В смысле лишний? Корзина отчищается, после того, как данные передаются в функцию confirm

Share this post


Link to post
Share on other sites
5 минут назад, Designer сказал:

 

В смысле лишний? Корзина отчищается, после того, как данные передаются в функцию confirm

Точно. Запамятовал уже.

Но более правильный вариант - это сохранить в таблице заказа акционную цену товара из корзины.

Т.к. прямой запрос отрежет возможную совместимостть модулей влияющих на акции.

Например модули - "Акции в процентах" и т.д.

Share this post


Link to post
Share on other sites

mpn2005, ну это уже проблемы того, кому как и что нужно.
Весь показанный код, это пример реализации вывода данных, которые спрашивал автор топика и написан, в целя ознакомления и понимания.

Share this post


Link to post
Share on other sites
28 минут назад, Designer сказал:

mpn2005, ну это уже проблемы того, кому как и что нужно.
Весь показанный код, это пример реализации вывода данных, которые спрашивал автор топика и написан, в целя ознакомления и понимания.

Да. Но есть ещё интервал ожидании оплаты. Теоретически может пройти некторое время до подтверждения заказа (пока проходит оплата).

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

Поэтому всё же лучше сохранять копию данных, как это предусмотрено в движке.

Share this post


Link to post
Share on other sites

mpn2005, кому это будет нужно, может временно записать в сессию и выводить уже данные из сессии.
Еще лучше, не указывать в письме не каких цен по акции, если используются какие-либо модули по пересчету скидки у товара.

Share this post


Link to post
Share on other sites
4 минуты назад, Designer сказал:

mpn2005, кому это будет нужно, может временно записать в сессию и выводить уже данные из сессии.
Еще лучше, не указывать в письме не каких цен по акции, если используются какие-либо модули по пересчету скидки у товара.

В сессию не получится. От платёжки подтверждение идёт сосвем с другого адреса и будет другая сессия.

Вообще согласен, задача весьма сомнительная.

Share this post


Link to post
Share on other sites
3 минуты назад, mpn2005 сказал:

От платёжки подтверждение идёт сосвем с другого адреса и будет другая сессия.

 

Сохранная сессия никуда не денется, после callback платежной системы.

Share this post


Link to post
Share on other sites
5 минут назад, Designer сказал:

 

Сохранная сессия никуда не денется, после callback платежной системы.

Она то сохранится для покупателя. Но при приходе callback к сессии покупателя не будет доступа.

А письмо уходит именно при приходе callback, если используется метод автоматической оплаты.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
9 минут назад, Designer сказал:

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

Не могу с этим согласиться.

1) Покупатель оформляет заказ.

2) Заказ создаётся с нулевым статусом. И покупатель перенаправляется в платёжную систему.

3) После успешной оплаты покупатель попадает на страницу завершения заказа. (тут сессия живая)

4) Платёжная система со своего сервера делает callback запрос для подтверждения оплаты. И при корректном key и всех данных, статус заказа меняется на оплаченный. Вот тут уже нет никакой сесии покупателя, это совсем отдельный запрос со своей сессией. И именно тут меняется статус заказа и отправляется письмо.

 

 

Share this post


Link to post
Share on other sites

mpn2005, тут уже зависит, как реализована работа платежный системы и его функционал, нет единого стандарта.

 

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


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

- если, необходимо собирать какую либо статистику именно по акционным ценам, тогда да, писать в БД

 

Share this post


Link to post
Share on other sites

В общем тут много вопросов в реализации. И всё действительно зависит от множества факторов.

Поэтому самое оптимальное вывести в корзине и глубже не лезть. Особенно если учесть всё нюансы упоминаемые в обсуждении.

 

P.S.: Лишние запросы для такой сомнительной функции тоже не стоит добавлять в движок. Т.к. если будут кидать в корзину по 100 товаров, то тут и штатные запросы корзины придётся минимизировать. Но это касается магазинов с кучей мелких товаров.

Share this post


Link to post
Share on other sites
1 час назад, mpn2005 сказал:

P.S.: Лишние запросы для такой сомнительной функции тоже не стоит добавлять в движок. Т.к. если будут кидать в корзину по 100 товаров, то тут и штатные запросы корзины придётся минимизировать. Но это касается магазинов с кучей мелких товаров.

 

Почему же, можно закинуть, хоть 1000 товаров, то проблем не каких не будет, так как такие запросы направленные на конкретное значение в таблице с первичным ключом. Если бы, такого рода запросы были тяжелыми, тогда магазин бы при 100 товарах уже загнулся... Ради интереса, можете проверить на 1000 разных товарах в корзине.

Share this post


Link to post
Share on other sites
3 минуты назад, Designer сказал:

 

Почему же, можно закинуть, хоть 1000 товаров, то проблем не каких не будет, так как такие запросы направленные на конкретное значение в таблице с первичным ключом. Если бы, такого рода запросы были тяжелыми, тогда магазин бы при 100 товарах уже загнулся... Ради интереса, можете проверить на 1000 разных товарах в корзине.

Я как раз таки очень плотно с этим работал. И скажу Вам, что это не так всё весело, как кажется.

Возьмите товаров с опциями и закиньте в корзину 100-300 штук. И штатный движок ляжет. Ну уж точно не потянет на виртуальном хостинге.

Тут недавно проскакивала длинная тема по обсуждению этого вопроса.

Share this post


Link to post
Share on other sites

mpn2005, а причем тут опции?
Я говорю, о конкретном запросе, на получение цену по акции товара.
Если движок ложиться от 100-300 товаров, это не говорит о том, что нельзя использовать те или иные запросы, нужно искать причины и в комплексе проводить оптимизацию БД, конфигурации сервера и уже обязательно добавить кэширование. Элементарно, такие проблемы могут возникать из-за отсутствии индексов или не правильном их применении.

Share this post


Link to post
Share on other sites

Я говорю, что из коробки не взлетит. И прилично пришлось переписать, что бы на виртуальном хостинге это работало.

И только индексами и настройками не обойтись.

Это на Ваше голословное заявляние, хоть 1000.

В общем хватит оффтопить.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.