[Помогите] товары которых нет в наличии (производители, акции, поиск)

Тема в разделе "OpenCart", создана пользователем Linksar, 18 сен 2015.

  1. Linksar

    Linksar

    Регистрация:
    24 фев 2014
    Сообщения:
    159
    Симпатии:
    10
    Добрый день. Собственно когда то я задавал уже такой вопрос, а именно "как сделать так, чтобы товары которых нет в наличии были в конце списка?". В свое время мне дали ответ на этот вопрос, но теперь же меня интересует как сделать аналогичное но теперь уже не только в категории товаров, а в списках товаров производителей, акция и результатов поиска. Спасибо!
     
  2. Dotrox

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

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

    yuzi

    Регистрация:
    5 янв 2013
    Сообщения:
    133
    Симпатии:
    71
    Страница категорий:
    ../catalog/controller/product/category.php [~300 строка]


    Заменить на


    Аналогично для:
    ../catalog/controller/product/manufacturer.php
    ../catalog/controller/product/special.php

    ../catalog/controller/product/search.php

     
  4. Dotrox

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

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

    Если уж редактировать контроллер, то достаточно просто в начале файла найти такой код:
    PHP:
    if (isset($this->request->get['sort'])) {
                
    $sort $this->request->get['sort'];
            } else {
                
    $sort 'p.sort_order';
            }
            if (isset(
    $this->request->get['order'])) {
                
    $order $this->request->get['order'];
            } else {
                
    $order 'ASC';
            }
    И заменить p.sort_order на p.quantity, а ASC на DESC.
    Но такое решение в принципе ущербно, поскольку не будет работать при выборе на странице какого-либо варианта сортировки вручную. То есть, если покупатель отсортирует товары по названию, то у него уже будут вперемешку в наличии и не в наличии. Поэтому редактировать нужно именно в модели, а не в контролере. А именно, добавить в сортировки p.quantity. Например для акций (функция getProductSpecials в /catalog/model/catalog/product.php) привести блок сортировки к такому виду:
    PHP:
    if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
                if (
    $data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                    
    $sql .= " ORDER BY p.quantity DESC, LCASE(" $data['sort'] . ")";
                } else {
                    
    $sql .= " ORDER BY p.quantity DESC, " $data['sort'];
                }
            } else {
                
    $sql .= " ORDER BY p.quantity DESC, p.sort_order";
            }
    И по такому же принципу во всех остальных случаях.
     
  5. yuzi

    yuzi

    Регистрация:
    5 янв 2013
    Сообщения:
    133
    Симпатии:
    71
    Уважаемый Dontox, говорите ваша ставка 18$/час - извольте, за что? - за выше указанный метод решения? да он введёт в заблуждения любого покупателя сайта...
    А теперь по сути: Ваш метод не годен для использования, запрос с сортировкой "ORDER BY p.quantity DESC" дает глобальное преимущество перед выбранной сортировкой покупателя когда он отсортирует товары по "Цена по возрастанию" и увидит в результате полный бардак, где выводится ваша сортировка по "количеству" указанных в карточке товара: закладка "Данные" -> "Количество" - Где это значение может быть любая цифра от 0 до 100000 а не только "0" - нет в наличии! И теперь думайте какого мнения будет покупатель о интернет магазине после увиденного...
    P.S. Чтобы найти иголку в стоге сена, достаточно сжечь сено и провести магнитом над пеплом. Так что, не усложняйте себе жизнь!
     
    Последнее редактирование: 18 сен 2015
  6. Dotrox

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

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Действительно, покритиковать мой метод - отличный способ отвлечь внимание от того, что ваш метод полнейший бред!

    Я не знаю, что вы подразумеваете под глобальным преимуществом, но увидит покупатель товары отсортированные по количеству и по цене. Да, есть недостаток - сортировка по цене будет происходить в пределах совпадающих количеств. Но она хотя бы будет. А в вашем решении сортировка возможно исключительно по количеству, если выбрано оно и эта сортировка не происходит при загрузке страницы - покупатель должен каким-то образом догадаться, что ему нужно несколько раз переключить сортировку, чтоб увидеть сначала товары в наличии.
    А вопрос ТС заключался в том, чтобы просто всегда показывать покупателю сначала товары в наличии не заставляя его для этого что-либо делать.

    Вообще, это решение я делал для магазина, где учёт количества происходил на стороне 1С, а в базе ОК у всех товаров стояло одинаковое количество, которое не вычиталось, так что там проблем с количеством не было, был либо 0, либо фиксированное число. Но я об этом уже забыл.

    Чтоб нивелировать разницу в количествах нужно дополнить SELECT:
    PHP:
    SELECT CASE WHEN p.quantity 0 THEN 1 ELSE p.quantity END as quantity_sort, {остальной код выборки}
    И, соответственно, в ORDER вместо p.quantity использовать quantity_sort.
    И будут тогда и все в наличии первыми и остальные сортировки работать тоже будут параллельно с наличием и правильно.

    А вы не заметили, что в своём варианте предложили сортировать по именно тому же количеству, которое вам так не нравится в моём решении?
     
  7. Stealth421

    Stealth421

    Регистрация:
    10 дек 2013
    Сообщения:
    125
    Симпатии:
    36
    как вариант, в catalog\model\catalog\product.php
    PHP:
            if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
                if (
    $data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                    
    $sql .= " ORDER BY LCASE(" $data['sort'] . ")";
                } elseif (
    $data['sort'] == 'p.price') {
                    
    $sql .= " ORDER BY (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
                } else {
                    
    $sql .= " ORDER BY " $data['sort'];
                }
            } else {
                
    $sql .= " ORDER BY p.sort_order";   
            }
    заменить на

    PHP:
    if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
                if (
    $data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
                    
    $sql .= " ORDER BY (p.quantity>0) DESC, LCASE(" $data['sort'] . ")";
                } elseif (
    $data['sort'] == 'p.price') {
                    
    $sql .= " ORDER BY (p.quantity>0) DESC, (CASE WHEN special IS NOT NULL THEN special WHEN discount IS NOT NULL THEN discount ELSE p.price END)";
                } else {
                    
    $sql .= " ORDER BY (p.quantity>0) DESC," $data['sort'];
                }
            } else {
                
    $sql .= " ORDER BY (p.quantity>0) DESC, p.sort_order";   
            }
     
    Linksar нравится это.
  8. Dotrox

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

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Stealth421, любопытный вариант. Если оно работает, это самое лучшее решение.
     
  9. Linksar

    Linksar

    Регистрация:
    24 фев 2014
    Сообщения:
    159
    Симпатии:
    10
    таким же образом тогда и для производителей, акция и поиска? или для них не подойдет?
     
  10. Dotrox

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

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Для категорий, товаров производителя и поиска используется одна и та же функция в модели. Для акций отдельная функция и там этот блок кода немного отличается, но решение то же, просто не нужно копировать отсюда код полностью, а только добавить
    PHP:
    (p.quantity>0DESC