Сортировка по размеру акции (скидка она же) - РЕШЕНО

Тема в разделе "Общие вопросы", создана пользователем xasler050, 27 сен 2015.

  1. xasler050

    xasler050 Пользователь

    Сообщения:
    45
    Симпатии:
    0
    Остро встал вопрос сортировки по размеру скидок, может кто-нибудь встречался с проблемой?

    Необходимо реализовать в выборке сортировки дополнительную опцию "сортировать по размеру скидок"

    При этом есть еще вопрос, можно ли реализовать скидки в процентном соотношение или нет?
     
  2. my2you

    my2you Продвинутый пользователь

    Сообщения:
    278
    Симпатии:
    121
    Начнем так.

    1. В файле \catalog\model\catalog\product.php
    в запросе который в функции public function getProducts($data = array()) {
    добавим после AS discount,
    Код:
    (SELECT ((p.price - ps.price) / (p.price / 100)) FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_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_percent,
    В итоге теперь запрос нам выдаст доп колонку с процентом скидки

    2. Ниже по коду после 'p.date_added',
    добавим 'special_percent'


    3. После кода
    Код:
                $data['sorts'][] = array(
                    'text'  => $this->language->get('text_model_desc'),
                    'value' => 'p.model-DESC',
                    'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=DESC' . $url)
                );
    вставим
    PHP:
                $data['sorts'][] = array(
                    
    'text'  => $this->language->get('text_percent_asc'),
                    
    'value' => 'special_percent-DESC',
                    
    'href'  => $this->url->link('product/category''path=' $this->request->get['path'] . '&sort=special_percent&order=ASC' $url)
                );
             
                
    $data['sorts'][] = array(
                    
    'text'  => $this->language->get('text_percent_desc'),
                    
    'value' => 'special_percent-DESC',
                    
    'href'  => $this->url->link('product/category''path=' $this->request->get['path'] . '&sort=special_percent&order=DESC' $url)
                );

    4. В языковом файле catalog\language\russian\product\category.php

    вставим
    PHP:
    $_['text_percent_asc']    = 'Скидка (низкая &gt; высокая)';
    $_['text_percent_desc']   = 'Скидка (высокая &gt; низкая)';

    На этом, все!!
     
    Последнее редактирование: 28 сен 2015
    optimlab нравится это.
  3. xasler050

    xasler050 Пользователь

    Сообщения:
    45
    Симпатии:
    0
    Спасибо, конечно, не все понятно, но попробую. Еще только один вопрос к какой версии ваш код писался?
     
  4. my2you

    my2you Продвинутый пользователь

    Сообщения:
    278
    Симпатии:
    121
    конечно 2х
     
  5. xasler050

    xasler050 Пользователь

    Сообщения:
    45
    Симпатии:
    0
    Понял, эх а жаль не получается, слаб я еще в PHP, все же уперся на 3 пункт
     
  6. my2you

    my2you Продвинутый пользователь

    Сообщения:
    278
    Симпатии:
    121
    пока просто проверяйте. Если сортирует в 3-м пункте как надо, то уже почти все сделано. Допишу завтра инструкцию.
     
  7. xasler050

    xasler050 Пользователь

    Сообщения:
    45
    Симпатии:
    0
    Работает, а если не
    это не трудно можно еще подсказать, как сортировку по размеру акций сделать ?
     
  8. my2you

    my2you Продвинутый пользователь

    Сообщения:
    278
    Симпатии:
    121
    закончил инструкцию.
     
  9. xasler050

    xasler050 Пользователь

    Сообщения:
    45
    Симпатии:
    0
    По сути она работает не по скидкам а по акциям) То что надо получилось, сейчас буду думать, как выводить тока те товары, которые имеют акцию... :) Громаднейшее спасибо!
     
  10. Max2016

    Max2016 Новичок

    Сообщения:
    3
    Симпатии:
    0
    версия 2.0.1.1 - пытался но не получилось

    нашел и добавил как в п.1, п.2 и п.4

    но кода в п.3

    $data['sorts'][] = array(
    'text' => $this->language->get('text_model_desc'),
    'value' => 'p.model-DESC',
    'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.model&order=DESC' . $url)
    );

    в файле \catalog\model\catalog\product.php этого не нашел (((

    поискав в файлах движка нашел его в файле \catalog\controller\product\category.php

    добавил но ничего не дало (((
     
  11. Vlad

    Vlad Эксперт

    Сообщения:
    3.900
    Симпатии:
    939
    еще кеш модификатора нужно обновлять наверно..
     
  12. Max2016

    Max2016 Новичок

    Сообщения:
    3
    Симпатии:
    0
    Ок, действительно так, обновил, заработало!
     
  13. Max2016

    Max2016 Новичок

    Сообщения:
    3
    Симпатии:
    0
    Спасибо автору идеи! Только там в коде ДВА раза повторяется 'value' => 'special_percent-DESC',
    нужно чтобы и 'value' => 'special_percent-ASC', тоже было :)

    Код:
    $data['sorts'][] = array(
                    'text'  => $this->language->get('text_percent_asc'),
                    'value' => 'special_percent-ASC',
                    'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=special_percent&order=ASC' . $url)
                );
             
                $data['sorts'][] = array(
                    'text'  => $this->language->get('text_percent_desc'),
                    'value' => 'special_percent-DESC',
                    'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=special_percent&order=DESC' . $url)
                );
     
  14. tigransh

    tigransh Новичок

    Сообщения:
    1
    Симпатии:
    0
    Данное решение работатет в категориях.
    Знатоки, подскажите пожалусто как можно сделать тоже самое на странице акций - specials?
    Нужно и на следующих страницах: новинки, популярные товары, самые продающиеся товары, итп...
    Буду очень признателен.
     
  15. Chukcha

    Chukcha Специалист

    Сообщения:
    2.894
    Симпатии:
    671
    Есть еще момент, при таком подходе вы увеличиваете нагрузку, добавляя лишний ненужный подзапрос (см п.2).

    1. Если нужна такая сортировка, то нужно

    Код:
    (SELECT ((p.price - ps.price) / (p.price / 100)) FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_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_percent,
    заменить на
    Код:
    (!empty($data['sort'] && $data['sort'] == 'special_percent')?
    
    (SELECT ((p.price - ps.price) / (p.price / 100)) FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '" . (int)$this->config->get('config_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_percent
    : ''
    ,
    Пишу с листа без проверки - желающие могут сами..

    2..Можно все и без подзапроса
    до кода
    Код:
    if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
    Вставить
    Код:
    if ($data['sort'] == 'special_percent') {
    $sql .= " ORDER BY ((p.price - ps.price) / (p.price / 100))
    } else
    Проверяйте.