Вы здесь:

Сортировка товаров в интернет-магазине (в начале товары с картинками и внутри еще и по цене)

В общем все работало классно, пока клиент не захотел новую сортировку товаров.

Задача: В каталоге товаров в интернет-магазине нужно в начале выстраивать товары у которых есть картинка, а после необходимо выстраивать у которых картинки нет. Внутри этой сортировки необходимо еще сортировать товары по цене (сама дешевая в начале) при чем необходимо, что бы товары, у которых цены нет (то есть по заказу), были в самом конце каждого из списков (то есть в конце товаров с картинками и товаров без картинок).

Особенности: Встала одна особенность — часть изображений выгружали через 1С, а часть вручную через админку.

Начнем с сортировки

Мой код сортировки для MySQL выглядит так:


ORDER BY CHAR_LENGTH(mod_catalog.`cover`) DESC, FIELD( mod_catalog.`price` , 'NULL, not null' ) , mod_catalog.`price` ASC

В чем смысл?

В начале я сортирую столбец с картинкой по количеству символов. Далее идет сортировка по цене, вернее по цене, что не NULL, а после обычное выстраивание по цене.

У меня если у товара нет картинки — ячейка пустая. Если есть — записывается название файла картинки без расширения.

Возникшая проблема и ее решение

Все прекрасно работало, пока я не понял, что из 1С названия картинок идут с 32 символами, а из админки до 10 символов в названии файла. Из-за этого товар с картинкой, залитый из админки, всегда уходил в самый конец списка.

Как же я ее решил?

Я изменил рандомайзер в админке. То есть я сделал так, что бы картинки, залитые из админки, имели в названии 32 символа.

Вот код рандомайзера:


function generateRandomString($length = 32) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}


//Вывод ответа рандомайзера
echo generateRandomString();

Об этом коде я поговорю в другой, новой записи.

Поделиться в telegram
Telegram
Поделиться в vk
VK
Поделиться в facebook
Facebook
Поделиться в twitter
Twitter
Поделиться в linkedin
LinkedIn
Материал написан
Станислав Волкер

Станислав Волкер