Сортировка товаров по изображению и цене
Автор
adminСортировка товаров в интернет-магазине (в начале товары с картинками и внутри еще и по цене)
В общем все работало классно, пока клиент не захотел новую сортировку товаров.
Задача: В каталоге товаров в интернет-магазине нужно в начале выстраивать товары у которых есть картинка, а после необходимо выстраивать у которых картинки нет. Внутри этой сортировки необходимо еще сортировать товары по цене (сама дешевая в начале) при чем необходимо, что бы товары, у которых цены нет (то есть по заказу), были в самом конце каждого из списков (то есть в конце товаров с картинками и товаров без картинок).
Особенности: Встала одна особенность — часть изображений выгружали через 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();
Об этом коде я поговорю в другой, новой записи.