Добрый день. Собственно когда то я задавал уже такой вопрос, а именно "как сделать так, чтобы товары которых нет в наличии были в конце списка?". В свое время мне дали ответ на этот вопрос, но теперь же меня интересует как сделать аналогичное но теперь уже не только в категории товаров, а в списках товаров производителей, акция и результатов поиска. Спасибо!
Если вы знаете, как это сделать в категориях, то и для товаров производителя, акций и поиска тоже знаете. Нужно просто отредактировать другие функции в модели товара.
Страница категорий: ../catalog/controller/product/category.php [~300 строка] Заменить на Аналогично для: ../catalog/controller/product/manufacturer.php ../catalog/controller/product/special.php ../catalog/controller/product/search.php
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"; } И по такому же принципу во всех остальных случаях.
Уважаемый Dontox, говорите ваша ставка 18$/час - извольте, за что? - за выше указанный метод решения? да он введёт в заблуждения любого покупателя сайта... А теперь по сути: Ваш метод не годен для использования, запрос с сортировкой "ORDER BY p.quantity DESC" дает глобальное преимущество перед выбранной сортировкой покупателя когда он отсортирует товары по "Цена по возрастанию" и увидит в результате полный бардак, где выводится ваша сортировка по "количеству" указанных в карточке товара: закладка "Данные" -> "Количество" - Где это значение может быть любая цифра от 0 до 100000 а не только "0" - нет в наличии! И теперь думайте какого мнения будет покупатель о интернет магазине после увиденного... P.S. Чтобы найти иголку в стоге сена, достаточно сжечь сено и провести магнитом над пеплом. Так что, не усложняйте себе жизнь!
Действительно, покритиковать мой метод - отличный способ отвлечь внимание от того, что ваш метод полнейший бред! Я не знаю, что вы подразумеваете под глобальным преимуществом, но увидит покупатель товары отсортированные по количеству и по цене. Да, есть недостаток - сортировка по цене будет происходить в пределах совпадающих количеств. Но она хотя бы будет. А в вашем решении сортировка возможно исключительно по количеству, если выбрано оно и эта сортировка не происходит при загрузке страницы - покупатель должен каким-то образом догадаться, что ему нужно несколько раз переключить сортировку, чтоб увидеть сначала товары в наличии. А вопрос ТС заключался в том, чтобы просто всегда показывать покупателю сначала товары в наличии не заставляя его для этого что-либо делать. Вообще, это решение я делал для магазина, где учёт количества происходил на стороне 1С, а в базе ОК у всех товаров стояло одинаковое количество, которое не вычиталось, так что там проблем с количеством не было, был либо 0, либо фиксированное число. Но я об этом уже забыл. Чтоб нивелировать разницу в количествах нужно дополнить SELECT: PHP: SELECT CASE WHEN p.quantity > 0 THEN 1 ELSE p.quantity END as quantity_sort, {остальной код выборки} И, соответственно, в ORDER вместо p.quantity использовать quantity_sort. И будут тогда и все в наличии первыми и остальные сортировки работать тоже будут параллельно с наличием и правильно. А вы не заметили, что в своём варианте предложили сортировать по именно тому же количеству, которое вам так не нравится в моём решении?
как вариант, в 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"; }
Для категорий, товаров производителя и поиска используется одна и та же функция в модели. Для акций отдельная функция и там этот блок кода немного отличается, но решение то же, просто не нужно копировать отсюда код полностью, а только добавить PHP: (p.quantity>0) DESC