Сортировка по цене с учетом скидки

Автор kdvbpspr, 19 апреля 2016, 11:46:21

« назад - далее »

kdvbpspr

Интересует вопрос, может кто правил:

При сортировке по цене (front) выводит список товаров не учитывая скидку , скрипт учитывает цену заданную изначально.
В итоге вывод выглядит не логичным.

Mr.Sen

Prestashop 1.6.0.14, дефолтная тема, сортировка по цене происходит с учетом скидок.

kdvbpspr

#2
За это отвечает модуль 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')));


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

Mr.Sen

#3
За сортировку каталога товаров отвечает контроллер /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.

PrestaMan

#4
ЦитироватьНо это только на одной странице. При переходе в пагинаторе на другие страницы возникают проблемы.
Нужно проверить передачу значений при пагинации. У вас часть данных теряется из url при перезагрузке страницы.
Меняли что-то в панинации? Может подстановки какие-то делали, типа сменить тайтл, избавление от дублей?
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!

kdvbpspr

#5
С пагинацией всё в порядке.
В основном запросе сортировка идет по полю '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' где цена без скидки..

PrestaMan

Tools::orderbyPrice
это
Product::getPriceStatic
это
Product::priceCalculation
учитывает и скидку и спец. цены.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!

Mr.Sen

ЦитироватьВедь запрос был по полю 'p.price' где цена без скидки..
Вот об этом я и говорил. Если есть фильтр 'price', то скидки не будут учитываться.

kdvbpspr

#8
Всё правильно Tools::orderbyPrice
Tools::orderbyPrice($this->products, Tools::getProductsOrder('way', Tools::getValue('orderway')));
получаем
$this->products
результат сортировки со скидкой, всё отлично. Но здесь мы обрабатываем не все данные, а то что получили в запросе
' LIMIT '.(((int)$this->page - 1) * $n.','.$n));
т.е. для какой то страницы...

PrestaMan

Тогда нужно убрать сортировку со страницы и перенести в блок фильтров, сохранять ее в $selected_filters и выборка будет сохраняться во временой таблице $tmp_tab. При переходе по страницам цены будут отсортированы ASC или DESC.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!

Mr.Sen

#10
Но сортировка происходит при первом обращении с 1 страницы, эти параметры сохраняются. И то что потом будет сортировка для какой-то страницы неважно. Цены будут идти по порядку.
Установите чистый prestashop последней версии и проверьте.

PrestaMan

#11
Проверил на prestashop 1.6.0.15. Установка из коробки никаких изменений и модулей, все родное.
При переходе цены не по порядку. Скидки не учитывает.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!

PrestaMan

#12
Этот код работает только при выборе фильтра по цене.
При выборе сортировки по цене он не обрабатывается.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!

kdvbpspr

#13
if (Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'p.price')
Так это и есть сортировка по цене. Точнее проверка по ней...

PrestaMan

Нет. Это проверка на применение фильтра. Закоментируйте эти 2 строчки и проверьте.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!