[Решено] Сортировка "Сначала акционные"

Тема в разделе "OpenCart", создана пользователем Bnopen, 4 май 2016.

Статус темы:
Закрыта.
  1. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    Всем привет!
    Подскажите, пожалуйста, как добавить в 1.5.4 ОС сортировку в категорию "Сначала акционные", то есть чтобы в категории, когда выбираешь эту сортировку сначала отображались товары со скидкой (specials), а потом все остальные.

    Заранее спасибо!
     
  2. MGT1

    MGT1

    Регистрация:
    5 янв 2013
    Сообщения:
    900
    Симпатии:
    218
    Как вариант взять
    на форуме есть и посмотреть откуда тянет.
     
    Bnopen нравится это.
  3. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    MGT1, к сожалению, там ничего нет такого, что помогло бы мне.
    Я так понимаю, что нужно править модель public function getProducts в catalog/model/catalog/product.php и добавить sql запрос еще надо вроде, типа ORDER BY ps.price или ORDER BY product_special
     
  4. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    Да, но это нужно делать немного иначе

    Проверьте

    CASE WHEN `special` then 0 else 1 END ASC, p.price ASC
     
    Bnopen нравится это.
  5. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    добавил в модель вот такой код -

    } else if ($data['sort'] == 'ps.price')
    $sql .= " ORDER BY ( CASE WHEN `special` then 0 else 1 END ASC, p.price ASC) ";
    } else {

    Получаю ошибку:

    Notice: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC, p.price ASC) ASC, LCASE(pd.name) ASC LIMIT 0,10' at line 1
     
  6. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    Нашел в сети похожее решение -



    Но оно под вторую ветку ОС. В 1.5.4 нет в getProducts AS discount можно ли как-то этот код изменить под 1.5.4?
     
  7. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Слишком много ASC :Smile:
    И вообще запрос неправильно построен. CASE должно быть в выборке, а не в сортировке:
    Код:
    SELECT ..., CASE WHEN `special` then 1 else 0 END AS sort_special
    А затем уже в сортировке:
    Код:
    ORDER BY sort_special ASC
     
    Bnopen нравится это.
  8. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    Не... Не нужно его в SELECT
    А вот со скобками я ошибся

    $sql .= " ORDER BY CASE WHEN `special` then 0 else 1 END ASC, p.price ASC ";
     
    Bnopen нравится это.
  9. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    Вылазит такая же ошибка:

    Notice: Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC, p.price ASC) ASC, LCASE(pd.name) ASC LIMIT 0,10' at line 1

    Там пол-ся вот такой запрос в конце:
    ..... ORDER BY CASE WHEN `special` then 0 else 1 END ASC, p.price ASC ASC, LCASE(pd.name) ASC LIMIT ......

    убрал одно ASC осталось:

    $sql .= " ORDER BY CASE WHEN `special` then 0 else 1 END ASC, p.price ";

    Вылазит ошибка, что нет такого колумна:

    Notice: Error: Unknown column 'special' in 'order clause'
    Error No: 1054
     
  10. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Ну, этой колонки на самом деле нет, она формируется динамически в самом запросе и этого достаточно.
    Выложи сюда всю функцию, которую правишь, в том виде, как она сейчас есть.
     
  11. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    Dotrox, это getProducts:

     
    Lasted edited by : 17 май 2016
  12. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    Дооптимизировались?
    А теперь сравните
    Код:
            $sql = "SELECT DISTINCT SQL_CALC_FOUND_ROWS p.product_id, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < '" . $this->NOW . "') AND (pd2.date_end = '0000-00-00' OR pd2.date_end > '" . $this->NOW . "')) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < '" . $this->NOW . "') AND (ps.date_end = '0000-00-00' OR ps.date_end > '" . $this->NOW . "')) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special";
    
     
  13. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Ну, в общем да, из запроса удалена где-то половина оригинального кода, в том числе и та часть, которая формировала special.
    За формирование special отвечает вот этот кусок запроса (взято из оригинального 1.5.5):
    Код:
    (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special"; 
    Разница со строкой постом выше в том, что $this->NOW добавлено в ocStore для кеширования запросов на уровне базы, в оригинале там просто NOW().
     
  14. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    Чего-то не пойму. Типа ребята из ocStore решили пооптимизировать запросы в бд и удалили часть оригинального кода Opencart? И в моей функции getProducts товары special вообще не выбираются?
     
  15. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    Нет.. Это вас кто-то оптимизировал!

    Вы показали не оригинальный код
    Оригинальный код у меня
     
  16. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    chukcha, код, который я привел из ocStore 1.5.4.1 никто ничего не оптимизировал:

    https://github.com/myopencart/ocStore/blob/v1.5.4.1.1/catalog/model/catalog/product.php

     
  17. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Не будем выяснять кто, что, где и когда наоптимизировал, но я таки не помню, чтоб видел этот запрос без special. Но я с 1.5.4 уже года 3 не сталкивался, так что ничего точно сказать не могу.

    В любом случае, нужно добавить в запрос тот кусок, который я выше выложил и special будет.
     
    Bnopen нравится это.
  18. Bnopen

    Bnopen Команда форума

    Регистрация:
    3 мар 2013
    Сообщения:
    1.264
    Симпатии:
    534
    Dotrox, chukcha, спасибо большое за помощь!

    Добавил кусок запроса и добавил условие (с кодом из 8-го поста все таки вылазила ошибка):
    PHP:
    $sql .= " ORDER BY CASE WHEN `special` then 0 else 1 END ASC, p.price ";
    Теперь все работает как надо и без ошибок. Тему можно закрывать и ставить решено!
     
Статус темы:
Закрыта.