Автор Тема: Сортировка по цене с учетом скидки  (Прочитано 225 раз)

19 Апреля 2016, 11:46:21
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Интересует вопрос, может кто правил:

При сортировке по цене (front) выводит список товаров не учитывая скидку , скрипт учитывает цену заданную изначально.
В итоге вывод выглядит не логичным.
19 Апреля 2016, 12:19:50
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 1195
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Prestashop 1.6.0.14, дефолтная тема, сортировка по цене происходит с учетом скидок.
19 Апреля 2016, 13:38:01
Ответ #2
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
За это отвечает модуль blocklayered

имеем такой запрос

$this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
SELECT
p.*,
'.($alias_where == 'p' ? '' : 'product_shop.*,' ).'
'.$alias_where.'.id_category_default,
pl.*,
image_shop.`id_image` id_image,
il.legend,
m.name manufacturer_name,
'.(Combination::isFeatureActive() ? 'product_attribute_shop.id_product_attribute id_product_attribute,' : '').'
DATEDIFF('.$alias_where.'.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00", INTERVAL '.(int)$nb_day_new_product.' DAY)) > 0 AS new,
stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity'.(Combination::isFeatureActive() ? ', product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').'
FROM '._DB_PREFIX_.'cat_filter_restriction cp
LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product`
'.Shop::addSqlAssociation('product', 'p').
(Combination::isFeatureActive() ?
' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product'.Shop::addSqlRestrictionOnLang('pl').' AND pl.id_lang = '.(int)$cookie->id_lang.')
LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$cookie->id_lang.')
LEFT JOIN '._DB_PREFIX_.'manufacturer m ON (m.id_manufacturer = p.id_manufacturer)
'.Product::sqlStock('p', 0).'
WHERE '.$alias_where.'.`active` = 1 AND '.$alias_where.'.`visibility` IN ("both", "catalog")
ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).' '.Tools::getProductsOrder('way', Tools::getValue('orderway')).' , cp.id_product'.
' LIMIT '.(((int)$this->page - 1) * $n.','.$n));

Если цена то сортировка может идти только по полю price в таблице product

Всё чудо с сортировкой (по скидкам) с полученными данными на выбранной странице происходит здесь:
if (Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'p.price')
Tools::orderbyPrice($this->products, Tools::getProductsOrder('way', Tools::getValue('orderway')));

Но это только на одной странице. При переходе в пагинаторе на другие страницы возникают проблемы.
19 Апреля 2016, 14:06:55
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 1195
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
За сортировку каталога товаров отвечает контроллер /controllers/front/CategoryController.php
Модуль blocklayered может быть не установлен. Если он установлен, то переопределяет переменную "orderby".

В Prestashop 1.6.0.14 сортировка по цене (в центральной колонке) работает с учетом скидки.
В модуле blocklayered в фильтре Диапазон цен скидка не учитывается.
При выборе фильтра Диапазон цен значение "orderby" не учитывается.
В остальных случаях сортивка должна применяться
ORDER BY '.Tools::getProductsOrder('by', Tools::getValue('orderby'), true).У меня сортировка с учетом скидок, тестировал на Prestashop 1.6.0.14.
19 Апреля 2016, 14:12:02
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Цитировать
Но это только на одной странице. При переходе в пагинаторе на другие страницы возникают проблемы.
Нужно проверить передачу значений при пагинации. У вас часть данных теряется из url при перезагрузке страницы.
Меняли что-то в панинации? Может подстановки какие-то делали, типа сменить тайтл, избавление от дублей?
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
19 Апреля 2016, 14:20:35
Ответ #5
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
С пагинацией всё в порядке.
В основном запросе сортировка идет по полю 'p.price'. Т.е. эта цена без скидки.
После этого идёт LIMIT товаров на первую страницу
Теперь первую страницу сортируем по скидкам этим
if (Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'p.price')
Tools::orderbyPrice($this->products, Tools::getProductsOrder('way', Tools::getValue('orderway')));
Всё отлично на первой странице всё отсортировано с учётом скидок.
Но если перейти на следующую страницу то может попасться товар который без скидки подходит по параметрам, но со скидкой должен быть на первой странице.
Ведь запрос был по полю 'p.price' где цена без скидки..
19 Апреля 2016, 14:29:26
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Tools::orderbyPriceэто
Product::getPriceStaticэто
Product::priceCalculationучитывает и скидку и спец. цены.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
19 Апреля 2016, 14:31:49
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 1195
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Цитировать
Ведь запрос был по полю 'p.price' где цена без скидки..
Вот об этом я и говорил. Если есть фильтр 'price', то скидки не будут учитываться.
19 Апреля 2016, 14:36:33
Ответ #8
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Всё правильно Tools::orderbyPrice
Tools::orderbyPrice($this->products, Tools::getProductsOrder('way', Tools::getValue('orderway')));получаем
$this->products
результат сортировки со скидкой, всё отлично. Но здесь мы обрабатываем не все данные, а то что получили в запросе
' LIMIT '.(((int)$this->page - 1) * $n.','.$n));т.е. для какой то страницы...
19 Апреля 2016, 15:00:49
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Тогда нужно убрать сортировку со страницы и перенести в блок фильтров, сохранять ее в $selected_filters и выборка будет сохраняться во временой таблице $tmp_tab. При переходе по страницам цены будут отсортированы ASC или DESC.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
19 Апреля 2016, 15:10:31
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 1195
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Но сортировка происходит при первом обращении с 1 страницы, эти параметры сохраняются. И то что потом будет сортировка для какой-то страницы неважно. Цены будут идти по порядку.
Установите чистый prestashop последней версии и проверьте.
19 Апреля 2016, 15:16:58
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Проверил на prestashop 1.6.0.15. Установка из коробки никаких изменений и модулей, все родное.
При переходе цены не по порядку. Скидки не учитывает.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
19 Апреля 2016, 15:22:44
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Этот код работает только при выборе фильтра по цене.
При выборе сортировки по цене он не обрабатывается.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
19 Апреля 2016, 15:34:09
Ответ #13
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
if (Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'p.price')Так это и есть сортировка по цене. Точнее проверка по ней...
19 Апреля 2016, 15:36:02
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 20838
  • Репутация: +25276/-0
  • Prestashop - просто и эффективно
    • Просмотр профиля
Нет. Это проверка на применение фильтра. Закоментируйте эти 2 строчки и проверьте.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!