Перейти к содержанию
SiteNNPro

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

Рекомендуемые сообщения

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

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

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

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

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

 

ocStore 1.5.5.1.1

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

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

 

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

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

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

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

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

5) Profit.

 

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

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

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

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

5) Profit.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, добавляем в массив цену акции и выводим в шаблоне
  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 руб'

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

catalog/model/checkout/order.php

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, mpn2005 сказал:

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


catalog/model/checkout/order.php

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

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, Designer сказал:

 

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
28 минут назад, Designer сказал:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
4 минуты назад, Designer сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, mpn2005 сказал:

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, Designer сказал:

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, Designer сказал:

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

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

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

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

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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


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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, mpn2005 сказал:

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, Designer сказал:

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.